ORA-00942 在 EXECUTE IMMEDIATE 创建表后引用表时出错
Posted
技术标签:
【中文标题】ORA-00942 在 EXECUTE IMMEDIATE 创建表后引用表时出错【英文标题】:ORA-00942 error when referencing table after EXECUTE IMMEDIATE create table 【发布时间】:2018-12-10 13:19:52 【问题描述】:我尝试在 PL/SQL Developer 中运行以下 sn-p,但最后一条命令抛出 ORA-00942: table or view does not exist 错误消息。
DECLARE
sqlCommandABC varchar2(30000) := 'create table ABC_TMP
tablespace &TBS_NORMAL_TABLES initrans 32 AS (SELECT ABC_ID from ABC where ID <=400000)';
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ABC_TMP';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
EXECUTE IMMEDIATE sqlCommandABC;
COMMIT;
END;
/
DECLARE
sqlCommandDEF varchar2(30000) := 'create table DEF_TMP
tablespace &TBS_NORMAL_TABLES initrans 32 AS (SELECT DEF_ID from DEF where ID <=15000)';
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE DEF_TMP';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
EXECUTE IMMEDIATE sqlCommandDEF;
COMMIT;
END;
/
DECLARE
sqlCommandXYZ varchar2(30000) := 'create table XYZ_TMP
tablespace &TBS_NORMAL_TABLES initrans 32 AS (select ID from XYZ where ABC_1 in (SELECT ABC_ID from ABC_TMP) or DEF_1 in (SELECT DEF_ID from DEF_TMP))';
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE XYZ_TMP';
EXCEPTION
WHEN OTHERS THEN NULL;
END;
EXECUTE IMMEDIATE sqlCommandXYZ;
COMMIT;
END;
/
我想通过从原始表中选择数据来创建两个临时表,并根据逻辑设置一些条件。
ABC_TMP和DEF_TMP创建后,需要在第三个临时表的select条件中使用。
XYZ_TMP 表有两个条件,一个用于 ABC_TMP 记录,另一个用于 DEF_TMP 记录。 这第三个 create table 子句会引发错误。
我知道我可以在这里使用原始选择,但是这些非常复杂并且成本相对较高,所以如果可能的话,我想使用过滤后的表。我也知道,如果我在创建前两个表后打开一个新会话,它将起作用,但我想在一个脚本中执行这些。
【问题讨论】:
也许XYZ表不存在? 对不起,我在代码中犯了一个错误,我编辑了它。 @KaushikNayak 错误拒绝语句是指 DROP TABLE (例如:如果表不存在,则抛出错误),我认为这不是根本原因。 好吧..我的错误我没有正确注意到。您确定在运行最后一个 PL/SQL 块之前创建了 2 个临时表吗?您是否通过普通(静态)SQL 检查过它?如果是,那么它可能是用户的GRANT
问题。
【参考方案1】:
根据提供的信息,我了解到 DEF_TMP 和 ABC_TMP 已成功创建并因此可用。在这种情况下,这里有两种可能。
首先是XYZ表不存在 其次是尝试执行此命令的用户没有选择授权。【讨论】:
以上是关于ORA-00942 在 EXECUTE IMMEDIATE 创建表后引用表时出错的主要内容,如果未能解决你的问题,请参考以下文章
BatchUpdateException:ORA-00942:表或视图不存在