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_TMPDEF_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:表或视图不存在

ORA-00942: 表或视图不存在(在单独的 sql 中有效,但在 oracle 函数中无效)

PL/SQL: ORA-00942: 表或视图不存在

SQL 错误:ORA-00942 表或视图不存在

ORA-00942:表或视图不存在 低级错误一例

ORA-00942: 使用 iBatis 的表或视图不存在