在立即创建表后引用表时,ORA-00942错误

时间:2018-12-10 13:19:53

标签: oracle plsql dynamic-sql

我尝试在PL / SQL Developer中运行以下代码段,但最后一条命令抛出 ORA-00942:表或视图不存在错误消息。

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 之后,我需要在选择第三个临时表的条件下使用它们。

XYZ_TMP 表具有两个条件,一个条件用于ABC_TMP记录,另一个条件用于DEF_TMP记录。 第三个create table子句引发错误。

我知道我可以在这里使用原始选择,但是这些选择非常复杂且成本较高,因此,如果可能的话,我想使用过滤后的表格。我也知道,如果在创建前两个表之后打开一个新会话,它将起作用,但是我想在一个脚本中执行这些会话。

1 个答案:

答案 0 :(得分:0)

根据提供的信息,我了解到DEF_TMP和ABC_TMP已成功创建并因此可用。在这种情况下,这里有两种可能性。

  • 首先是XYZ表不存在
  • 第二个是试图执行此命令的用户没有选择授权。