【发布时间】: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问题。
标签: oracle plsql dynamic-sql