在尝试将一批行插入现有表时,我遇到异常
ORA-00942:表或视图不存在
我可以确认该表存在于db中,我可以使用oracle将数据插入该表 sql开发人员。但是当我尝试在java中使用preparedstatement插入行时,它的抛出表不存在错误。
请在
下找到错误的堆栈跟踪java.sql.SQLException: ORA-00942: table or view does not exist
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591)
at quotecopy.QuoteCopier.main(QuoteCopier.java:72)
有人可以提出这个错误的原因吗?
更新:问题已解决
我的数据库连接属性或我的表或视图名称没有问题。问题的解决方案非常奇怪。我尝试插入的其中一列是Clob类型。因为我以前在oracle db中处理clob数据时遇到了很多麻烦,尝试用一个临时字符串setter替换clob setter,并执行相同的代码,没有任何问题,所有行都被正确插入!!!。
即。 peparedstatement.setClob(columnIndex,clob)
替换为
peparedstatement.setString(columnIndex,“String”)
为什么存在错误表或视图错误导致插入clob数据时出错。你能解释一下吗?
非常感谢您的回答和评论。
答案 0 :(得分:13)
如果表存在,Oracle也会报告此错误,但您没有任何权限。因此,如果您确定该表在那里,请检查授权。
答案 1 :(得分:10)
setCLOB()似乎存在一些问题,在目标表确实存在且具有正确特权的情况下,在某些情况下会导致ORA-00942。我现在遇到了这个问题,我可以通过简单地将CLOB绑定到同一个表中来使ORA-00942消失。
我尝试使用java.sql.Clob设置setClob(),使用oracle.jdbc.CLOB设置setCLOB()但结果相同。
正如您所说,如果您以字符串形式绑定问题就会消失 - 但这会将您的数据大小限制为4k。
从测试开始,似乎在绑定CLOB之前在会话上打开事务时触发。当我解决这个问题时,我会反馈...检查Oracle支持。
答案 2 :(得分:7)
我的数据库连接属性或我的表或视图名称没有问题。问题的解决方案非常奇怪。我尝试插入的其中一列是Clob类型。因为我以前在oracle db中处理clob数据时遇到了很多麻烦,尝试用一个临时字符串setter替换clob setter,并执行相同的代码,没有任何问题,所有行都被正确插入!!!。
即。 peparedstatement.setClob(columnIndex,clob)
替换为
peparedstatement.setString(columnIndex,“String”)
答案 3 :(得分:3)
@unbeli是对的。在表上没有适当的授权将导致此错误。对于它的价值,我最近经历过这一点。我遇到了你描述的确切问题,我可以通过sql developer执行insert语句但是在使用hibernate时会失败。我终于意识到我的代码所做的不仅仅是明显的插入。插入没有适当授权的其他表格。调整授权权限为我解决了这个问题。
注意:没有评论的声誉,否则这可能是一个评论。
答案 4 :(得分:2)
我发现如何在不使用JDBC的setString()方法的情况下解决这个问题,该方法将数据限制为4K。
您需要做的是使用preparedStatement.setClob(int parameterIndex,Reader reader)。至少这对我有用。认为Oracle驱动程序将数据转换为要插入的字符流,似乎不是。或者是特定的导致错误的东西。
使用characterStream似乎对我有用。我正在从一个数据库读取表,并使用jdbc写入另一个数据库。而我正在得到表未找到错误就像上面提到的那样。所以这就是我解决问题的方法:
case Types.CLOB: //Using a switch statement for all columns, this is for CLOB columns
Clob clobData = resultSet.getClob(columnIndex); // The source db
if (clobData != null) {
preparedStatement.setClob(columnIndex, clobData.getCharacterStream());
} else {
preparedStatement.setClob(columnIndex, clobData);
}
clobData = null;
return;
现在好了。
答案 5 :(得分:2)
我们在BLOB专栏上遇到过这个问题。如果遇到此错误时有其他人提出此问题,请按照以下方法解决问题:
我们从这开始:
preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break;
我们通过将该行更改为此来解决了该问题:
java.sql.Blob blob = resultSet.getBlob(columnName);
if (blob != null) {
java.io.InputStream blobData = blob.getBinaryStream();
preparedStatement.setBinaryStream(parameterIndex, blobData);
} else {
preparedStatement.setBinaryStream(parameterIndex, null);
}
答案 6 :(得分:1)
您的脚本是否提供架构名称,或者您是否依赖登录数据库的用户来选择默认架构?
可能是您没有为架构命名,并且您使用系统用户而不是架构用户执行批处理导致脚本的错误执行上下文,如果由具有目标的用户执行该脚本将正常工作架构设置为默认架构。您最好的操作是在插入语句中包含模式名称:
INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue')
更新:您是否尝试将表名绑定为预准备语句中的绑定值?那不行。
答案 7 :(得分:0)
它对我有用:
Clob clob1;
while (rs.next()) {
rs.setString(1, rs.getString("FIELD_1"));
clob1 = rs.getClob("CLOB1");
if (clob1 != null) {
sta.setClob(2, clob1.getCharacterStream());
} else {
sta.setClob(2, clob1);
}
clob1 = null;
sta.setString(3, rs.getString("FIELD_3"));
}
答案 8 :(得分:0)
您是否有可能为INSERT
做VARCHAR
而为INSERT
做UPDATE
然后是CLOB
?
如果是这样,除了UPDATE
之外,您还需要向该表授予INSERT
权限。
答案 9 :(得分:-1)
我在这里得到了问题的解决方案。如果您正在使用它,问题出在玻璃鱼上。创建JNDI名称时,请确保池名称正确,池名称是您创建的连接池名称。