Java.sql.SQLException: ORA-01403: 找不到任何数据于 struct.getDescriptor().getMetaData()。

4

我使用 oracle.sql.STRUCT 类。以下是示例代码:

ResultSetMetaData metaData = struct.getDescriptor().getMetaData();

我遇到了这个异常:

java.sql.SQLException: ORA-01403: no data found
ORA-06512: at line 1
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:218) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:969) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3476) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4400) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.oracore.OracleTypeADT.initADTAttrNames(OracleTypeADT.java:2423) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.oracore.OracleTypeADT.getAttributeName(OracleTypeADT.java:2246) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]
at oracle.jdbc.driver.StructMetaData.getColumnName(StructMetaData.java:175) ~[ojdbc14.jar:Oracle JDBC Driver version - "10.2.0.4.0"]

为什么会出现以上异常?如何解决?

随机猜测,您有一些大小写不匹配的列名,但您没有告诉Java去期望哪些列名...这实际上意味着Java试图从数据库中选择一些元数据,但是它不存在。 - Ben
@Ben 感谢您的评论。这是什么时候发生的?我的代码在原来的环境中运行良好,但在新环境中出现了此异常。有什么解决方案吗? - Sam
你有两个环境吗?显然下一步要做的事情是检查(两次)这些环境在每个方面都是相同的,特别是那些在抛出异常的行号上使用的表格?与其只是在Stack Overflow上转储堆栈跟踪,也许最好的方法是做每个人都必须做的事情,提供一个最小化的示例来演示您的问题。我认为这将包括DDL以及Java在这种情况下。 - Ben
我还建议阅读http://meta.stackexchange.com/questions/182266/how-much-research-effort-is-expected-of-stack-overflow-users/182380#182380和http://meta.stackexchange.com/q/156810/。 - Ben
3个回答

10
我找到了解决方案。 问题是我的应用程序连接数据库的用户没有对目标类型的授权。 我给用户添加了授权,应用程序就正常工作了。

我刚遇到了同样的问题 - 如果您错过了授权,也会看到“不一致的目录视图”错误! - Steve

3

我发现这个问题的另一个原因。当我将对象名称写成小写时,Oracle会抛出异常,但是当完全使用大写对象名称时,问题得到解决。


1
在我的情况下,这是由审核触发器引起的,该触发器检查值是否具有NULL值。
如果来自SQL表达式的值为NULL,则会触发此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接