EXECUTE IMMEDIATE oracle中的临时表未创建ORA-00942

时间:2014-10-06 08:37:35

标签: sql oracle plsql oracle11g execute-immediate

基于this answer我试图创建临时表,但是我得到异常ORA-00942:table or view does not exist我会认为'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'语句有问题,它在{{1}上失败}。
请在下面找到SQL语句。

insert into TempQandA(column1) VALUES (1);

2 个答案:

答案 0 :(得分:5)

动态创建GTT,因此您的INSERT也应动态 ..

请注意,PL / SQL在执行之前验证每个静态查询。 这就是为什么即使在编译时也会出现ORA-942 Table or view doesn't exist错误的原因!

因此,为了避免这种语义检查,我们必须使调用动态化。

    BEGIN
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';

.....

    EXECUTE IMMEDIATE ' insert into TempQandA(column1) VALUES (1)';
    END;

最终,您不应在运行时创建GTT。以避免此类问题。 GTT无论如何都要去 local 到每个会话。

编辑:正如Lalit所说,GTT的{​​{1}}不接受DDL

答案 1 :(得分:2)

  

'创建或替换全局临时表TempQandA(column1号)ON   承诺保留行';

关键字REPLACE不正确。您只需创建GTT并使用EXECUTE IMMEDIATE

将值插入其中
SQL> BEGIN
  2  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE Temp_gtt(column1 number) ON COMMIT PRESERVE ROWS';
  3  EXECUTE IMMEDIATE 'insert into temp_gtt(column1) values(1)';
  4  END;
  5  /

PL/SQL procedure successfully completed.

SQL>
SQL> select * from temp_gtt;

   COLUMN1
----------
         1

SQL>