Oracle 在存储过程内执行create table抛出错误

Oracle 在存储过程内执行create table抛出错误,oracle,plsql,Oracle,Plsql,我想在我的存储过程中运行这个,但它给了我一个错误: BEGIN EXECUTE IMMEDIATE 'DROP TABLE "temp1"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE = -942 THEN create table temp1(id number); ELSE RAISE; END I

我想在我的存储过程中运行这个,但它给了我一个错误:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE "temp1"';
    EXCEPTION
        WHEN OTHERS THEN
        IF SQLCODE = -942 THEN      
            create table temp1(id number);            
        ELSE
      RAISE;
    END IF;
END;
我还尝试将BEGIN END块放在create table temp1id number周围,但错误保持不变

错误:

PLS-00103:在期望一个 以下:

如果循环mod null pragma raise,则开始案例为goto声明退出
返回select update,同时使用创建表也是DDL,就像DROP一样,因此也必须作为动态SQL运行:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE "temp1"';
    EXCEPTION
        WHEN OTHERS THEN
        IF SQLCODE = -942 THEN      
            EXECUTE IMMEDIATE 'create table temp1(id number)';            
        ELSE
      RAISE;
    END IF;
END;

正如@TenG所回答的,CREATE也必须是动态sql。但无论如何,在pl/sql块中包含DROP/CREATE TABLE几乎总是一个坏主意。这通常是oracle为其创建全局临时表的类型。有什么我可以使用的,比如某种临时表或整数数组吗?比如说,选择整数数组?在sql server中,使用临时表非常简单@埃德史蒂文斯:你说得对。如果我创建了全局临时表-它将保持在那里?全局临时表定义一次并使用多次。每个连接的会话都有自己的私有“版本”。插入其中的数据将一直保留,直到会话断开连接。有关更多信息,请参阅《概念指南》——我使用了GTT——我认为它很棒,因为以后我还可以添加任意数量的列。我不喜欢GTT显示在表格中的事实,但是可以。我习惯于从SQLServer临时处理表变量表。