【发布时间】:2019-12-08 10:17:50
【问题描述】:
我正在尝试执行以下查询:
String query = "select NUMERO_CHAUFFEUR, avg(DISTANCE) as DISTANCE " +
"from " +
"(select NUMERO_CHAUFFEUR, " +
"6387.7 * ACOS((sin(LATITUDE_DEPART / 57.29577951) * SIN(LATITUDE_ARRIVEE / 57.29577951)) + " +
"(COS(LATITUDE_DEPART / 57.29577951) * COS(LATITUDE_ARRIVEE / 57.29577951) * " +
"COS(LONGITUDE_ARRIVEE / 57.29577951 - LONGITUDE_DEPART / 57.29577951))) as DISTANCE " +
"from " +
"(select l.NUMERO_CHAUFFEUR, " +
"regexp_substr(d1.COORDONNEES, '^[^,]+') as LATITUDE_DEPART, " +
"trim(leading ',' FROM regexp_substr(d1.COORDONNEES, ',.*$')) AS LONGITUDE_DEPART, " +
"regexp_substr(d2.COORDONNEES, '^[^,]+') as LATITUDE_ARRIVEE, " +
"trim(leading ',' FROM regexp_substr(d2.COORDONNEES, ',.*$')) AS LONGITUDE_ARRIVEE " +
"from LIVRAISONS l " +
"inner join DEPOTS d1 on(l.NUMERO_DEPOT_DEPART = d1.NUMERO_DEPOT) " +
"inner join DEPOTS d2 on(l.NUMERO_DEPOT_ARRIVE = d2.NUMERO_DEPOT) " +
")) " +
"group by (NUMERO_CHAUFFEUR)";
但是 java.sql.SQLException: ORA-01722: invalid number 被抛出。有谁知道为什么?因为如果我使用 sqlplus 直接在 sql 中执行查询,它就可以正常工作。
使用 sqlplus 执行查询的结果:
NUMERO_CHAUFFEUR AVG(DISTANCE)
---------------- -------------
1 507.064894
2 703.326572
5 846.966137
4 511.914202
我尝试了以下方法,但错误仍然存在:
String query = "select NUMERO_CHAUFFEUR, avg(DISTANCE) as DISTANCE " +
"from " +
"(select NUMERO_CHAUFFEUR, " +
"to_number('6387.7') * ACOS((sin(LATITUDE_DEPART / to_number('57.29577951')) * SIN(LATITUDE_ARRIVEE / to_number('57.29577951'))) + " +
"(COS(LATITUDE_DEPART / to_number('57.29577951')) * COS(LATITUDE_ARRIVEE / to_number('57.29577951')) * " +
"COS(LONGITUDE_ARRIVEE / to_number('57.29577951') - LONGITUDE_DEPART / to_number('57.29577951')))) as DISTANCE " +
"from " +
"(select l.NUMERO_CHAUFFEUR, " +
"to_number(regexp_substr(d1.COORDONNEES, '^[^,]+')) as LATITUDE_DEPART, " +
"to_number(trim(leading ',' FROM to_number(regexp_substr(d1.COORDONNEES, ',.*$')))) AS LONGITUDE_DEPART, " +
"to_number(regexp_substr(d2.COORDONNEES, '^[^,]+')) as LATITUDE_ARRIVEE, " +
"to_number(trim(leading ',' FROM to_number(regexp_substr(d2.COORDONNEES, ',.*$')))) AS LONGITUDE_ARRIVEE " +
"from LIVRAISONS l " +
"inner join DEPOTS d1 on(l.NUMERO_DEPOT_DEPART = d1.NUMERO_DEPOT) " +
"inner join DEPOTS d2 on(l.NUMERO_DEPOT_ARRIVE = d2.NUMERO_DEPOT) " +
")) " +
"group by (NUMERO_CHAUFFEUR)";
【问题讨论】:
-
@TimBiegeleisen 在 sqlplus 中执行得很好。我将获得的结果添加到问题中
-
显示如何在 java 中获取查询结果
-
你试过类似
resultSet.getInt("DISTANCE")的东西吗? -
查询执行过程中发生错误
-
@cildoz 你很可能不在 SQLPlus 中执行 same 查询,我的意思是你的 Java 字符串连接表达式。因此,我建议您执行一种二进制搜索来定位导致问题的语句(列)部分。在幸运的情况下,您会自己发现问题,如果仍然存在这个谜团,请使用这个 minimal 示例。