如果你使用过Oracle,你可能会收到有用的消息"ORA-00942:表或视图不存在".是否有合法的技术原因消息不包含丢失对象的名称?
关于这一点的争论是由于安全听起来像是由TSA制作的.如果我是攻击者,我会知道我刚试图利用哪个表,并且能够轻松地解释这个无用的消息.如果我是通过多层应用程序代码处理复杂连接的开发人员,那么通常很难说.
我的猜测是,当最初实现此错误时,有人忽略了添加对象名称,现在,人们担心它会破坏兼容性来修复它.(代码执行愚蠢的事情,如解析错误消息,如果它发生变化将会混淆.)
是否有开发人员友好(而不是招募您的DBA)方式来确定丢失表的名称?
虽然我已经接受了与该主题相关的答案,但它并没有真正回答我的问题:为什么这个名称不是错误信息的一部分?如果有人能提出真正的答案,我会很乐意改变我的投票.
当我有一个类似的sql语句时select * from table1,它工作得很好,但是只要我把它放到一个函数中,我得到:
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
怎么解决这个?
我刚刚使用Spring Batch框架创建了一个批处理作业,但是我没有运行CREATE SQL的数据库权限.当我尝试运行批处理作业时,我在框架尝试创建TABLE_BATCH_INSTANCE时遇到错误.我试着禁用
<jdbc:initialize-database data-source="dataSource" enabled="false">
...
</jdbc:initialize-database>
Run Code Online (Sandbox Code Playgroud)
但在我尝试之后我仍然遇到了错误
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
无论如何可以禁用SQL,我只想测试我的读写器和处理器正常工作.
我正在编写一个存储过程来将数据从一个用户的表复制到另一个模式.基本上,它是一系列INSERT .. SELECT语句,如下所示:
INSERT INTO GESCHAEFTE
SELECT *
FROM TURAT03.GESCHAEFTE
WHERE kong_nr = 1234;
Run Code Online (Sandbox Code Playgroud)
从sqlplus(或TOAD for me ;-))发出时这很好用,所以我知道我有足够的权限,但是这是存储过程的一部分,如下所示:
CREATE OR REPLACE FUNCTION COPY_KONG
(pKongNr IN NUMBER)
RETURN NUMBER
AUTHID CURRENT_USER
IS
BEGIN
INSERT INTO GESCHAEFTE
SELECT *
FROM TURAT03.GESCHAEFTE
WHERE kong_nr = pKongNr;
END;
Run Code Online (Sandbox Code Playgroud)
我收到一个Oracle错误:
[Error] ORA-00942 (11: 22): PL/SQL: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经插入了一个AUTHID,但无济于事.
我还可以做些什么?我在这里完成了我的想法.
尝试将一批行插入现有表时,我遇到异常
ORA-00942:表或视图不存在
我可以确认该表存在于db中,我可以使用oracle sql developer将数据插入该表.但是当我尝试在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)
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出这个错误的原因吗?
更新:问题已解决
我的数据库连接属性或我的表或视图名称没有问题.问题的解决方案非常奇怪.我尝试插入的其中一列是Clob类型.因为我之前在oracle db中处理clob数据时遇到了很多麻烦,尝试用一个临时字符串setter替换clob setter并执行相同的代码并解决所有问题并正确插入所有行!
即.peparedstatement.setClob(columnIndex,clob)
被替换为
peparedstatement.setString(columnIndex,"String")
为什么错误表或视图确实存在错误导致插入clob数据时出错.你能解释一下吗?
非常感谢您的回答和评论.
可以使用Oracle数据泵导入工具(IMPDP.EXE)使用REMAP_SCHEMA选项将一个模式导入另一个模式.但是,存在一个问题,即触发器未正确重新映射.这导致触发器根本没有创建错误,如下所示:
ORA-39083: Object type TRIGGER failed to create with error: ORA-00942: table or view does not exist Failing sql is: CREATE TRIGGER "**NEW_SCHEMA**"."METER_ALARMS_BI" BEFORE INSERT ON
**OLD_SCHEMA**.METER_ALARMS ...
Run Code Online (Sandbox Code Playgroud)
原因是因为create SQL仍然引用OLD_SCHEMA.它确实在Oracle文档中说:
映射可能不是100%完成,因为某些模式引用导入无法查找.例如,Import将找不到嵌入在类型,视图,过程和包的定义主体中的模式引用.
恕我直言,这是甲骨文的一个警察,但这是另一个讨论!
根据Oracle Metalink说明750783.1,解决方法是:
- 创建一个SQLFILE以包含相关的DDL命令:
impdp system/****** directory=test_dp
DUMPFILE=export_schemas.dmp
remap_schema=u1:u2 sqlfile=script.sql
Run Code Online (Sandbox Code Playgroud)
- 从写入的SQLFILE中提取受影响的DDL并更正模式引用.然后手动执行该命令.
这不是一个好方法,特别是如果你有许多失败的对象,并希望自动化组合多个模式的过程,以便在数据库的字段升级.
有没有人找到更好的方法来做到这一点?如果要在现场使用,我需要一个必须100%可靠的解决方案.我可以解析生成的SQL文件,但可以100%正确吗?是否有一些方法可以拦截IMPDP执行的CREATE SQL语句并在导入时动态更正?可以直接修补DMP文件吗?
我们正在运行一个java/hibernate应用程序,在TESTING中针对ORACLE 10g.偶尔,我们会看到这个错误:
ORA-00942:表或视图不存在
有没有办法找出ORACLE正在谈论的表/视图?
我知道我可以在hibernate中添加额外级别的日志记录,这将显示它在ORACLE上执行的所有SQL,然后运行该SQL以确定缺少哪个TABLE/VIEW或缺少权限.但鉴于它处于TESTING/STAGING状态,这会降低性能.
是否有一种简单的方法来缩小表/视图名称?
您知道,我无法控制Oracle数据库服务器环境.
我启用了Hibernate跟踪/日志记录,并找到了一个VALID SQL.我甚至把Wireshark(这是一个TCP数据包过滤器)看看hibernate实际发送了什么,这是一个有效的SQL.那么,为什么甲骨文会偶尔抱怨它,而不是总是抱怨它.
我一直在尝试访问dba_data_files表,看看autoextend我的数据文件是否已打开.但是,即使我使用的是Oracle 10g,这个表似乎也不存在:
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select * from dba_data_files;
select * from dba_data_files
*
ERROR at line 1:
ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以检查甚至更改特定表空间的数据文件是否已打开autoextend选项?
我想在不存在的表上声明游标.当然,我的程序没有编译.
此表是临时表,由预处理创建.它将存在于运行时,但在编译时它是另一个故事.
对于我选择/更新其他DML操作,我已经使用过了
EXECUTE IMMEDIATE 'operation from tmp_table'
但我找不到游标的解决方法.
有办法吗?
基本上,我希望这个编译
drop table test;
/*from this on should compile*/
DECLARE
cursor c is select * from test;
BEGIN
for reg in c LOOP
/*...*/
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
到目前为止还没有编译:
SQL> declare
2 c sys_refcursor;
3 BEGIN
4 open c for 'select * from pepito'; -- 'pepito' does not exist
5 close c;
6 end;
7 /
declare
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: …Run Code Online (Sandbox Code Playgroud) 大家好.所以,我以dba帐户登录,我想在User1的架构中创建一个视图,但是从User2中选择数据.
我使用了以下查询:
CREATE OR REPLACE VIEW User1.NewView (Column1) AS
SELECT DISTINCT Column1 FROM User2.Table
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
SQL Error: ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我必须在User2.Table上授予对User1的select访问权限.有没有办法在不必授予访问权限的情况下执行此操作,因为我已经以dba身份登录了?多谢你们!