如何使用Oracle和JDBC获取SQL语句中的行号?

时间:2015-07-22 11:23:04

标签: java oracle jdbc

如果我们输入错误的查询,请sql developer   从显着中删除

它会向我们显示确切的行号和列

Error starting at line : 1 in command -
delete from notable
Error at Command Line : 1 Column : 13
Error report -
SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

但如果我在java代码中这样做,我只得到

java.sql.SQLException:ORA-00942:表或视图不存在

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) ~[ojdbc14-10.2.0.3.0.jar:Oracle JDBC Driver version - "10.2.0.3.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) ~[ojdbc14-10.2.0.3.0.jar:Oracle JDBC Driver version - "10.2.0.3.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) ~[ojdbc14-10.2.0.3.0.jar:Oracle JDBC Driver version - "10.2.0.3.0"]
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) ~[ojdbc14-10.2.0.3.0.jar:Oracle JDBC Driver version - "10.2.0.3.0"]
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207) ~[ojdbc14-10.2.0.3.0.jar:Oracle JDBC Driver version - "10.2.0.3.0"]

如何获取有关行和列的信息?可以通过JDBC吗?

4 个答案:

答案 0 :(得分:1)

我不知道任何第三方库,这将帮助您实现这一目标。但是,据我所知SQLException,您无法

顺便说一句,你正在犯错,因为你还没有创建你想要访问的表/视图。

答案 1 :(得分:1)

SQLException.getCause()为您提供发生异常的角色的位置:

    select * from blahblahblah

    Error : 942, Position : 14, Sql = select * from blahblahblah, OriginalSql = select * from blahblahblah, Error Msg = ORA-00942: table or view does not exist

因此,您可以解析原因并获取字符索引,然后计算行号和列号。

这适用于JDBC版本12.2.0.1和Oracle 12c,不确定其他版本。

答案 2 :(得分:0)

从命令行,我们可以一次执行多个SQL查询。因此,在执行时如果我们收到任何错误,命令行处理器会给出“Line”和“Column”以帮助用户了解有故障的行。无论如何,它是由数据库提供的实用程序。

但是,在JDBC中,您可以执行单个查询或执行批处理语句。在这两种情况下,您都不会获得任何行号和列号,因为它在任何意义上都没用。虽然您可以根据JDBC驱动程序获取错误和代码的原因。

答案 3 :(得分:0)

我通过使用偏移量(#个字符)确定错误发生在哪一行,在Python中解决了此问题。这可以通过循环遍历原始sql语句并计数行数,同时还可以跟踪到目前为止看到的字符数来完成。