无效数字oracle jdbc

Posted

技术标签:

【中文标题】无效数字oracle jdbc【英文标题】:invalid number oracle jdbc 【发布时间】: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 示例。 【参考方案1】:

尝试将字符串转换为数字时出现 ORA-01722 错误,但无法将字符串转换为数字。 regexp_substr 将返回字符串,您将其称为 LATITUDE_DEPART,然后您使用不正确的值进行数学运算。您应该首先将其转换为数字。这可能会对您有所帮助:

TO_NUMBER(regexp_substr(d1.COORDONNEES, '^[^,]')) LATITUDE_DEPART

对所有相同的部分执行此操作。

【讨论】:

OK...但是为什么直接在数据库中运行没有错误? @cildoz 你对所有变量都做了吗? @TimBiegeleisen 可能是因为 java 和 sqlplus 使用不同的方言。 @cildoz 您更新的问题还不正确。你应该对所有变量都这样做。你也应该将它用于trim 我再次编辑了问题,我添加了 to_number 来修剪,但错误仍然存​​在

以上是关于无效数字oracle jdbc的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库报无效数字?

oracle 提示无效数字

什么是“oracle ORA-01722”无效数字?

oracle无效数字

Oracle报错ORA-01722: 无效数字排查解决方案

Oracle 连接子句中的无效数字