【问题标题】:EXECUTE IMMEDIATE Temp table in oracle does not get created ORA-00942ORA-00942 未创建 oracle 中的 EXECUTE IMMEDIATE 临时表
【发布时间】:2014-10-06 08:37:34
【问题描述】:

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

DECLARE 
TransactioDetailId numeric := 3132;
HomePhoneNumber varchar(20);
MobileNumber varchar(20);
Email varchar(20);
whatever varchar(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';

        BEGIN
        SELECT contactvalue into HomePhoneNumber  FROM customercontact CC
         inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
         inner join transactiondetail td on td.transactionid = tm.transactionid
         where contacttypeid = 2 and td.transactiondetailid = TransactioDetailId;
         EXCEPTION
         WHEN NO_DATA_FOUND THEN
         HomePhoneNumber := NULL;
                         begin
                         SELECT  contactvalue into MobileNumber  FROM customercontact CC
                         inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
                         inner join transactiondetail td on td.transactionid = tm.transactionid
                         where contacttypeid = 3 and td.transactiondetailid = TransactioDetailId;
                         EXCEPTION
                         WHEN NO_DATA_FOUND THEN
                         MobileNumber := NULL;
                                      begin
                                      SELECT  contactvalue into Email  FROM customercontact CC
                                      inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
                                      inner join transactiondetail td on td.transactionid = tm.transactionid
                                      where contacttypeid = 1 and td.transactiondetailid = TransactioDetailId;
                                      EXCEPTION
                                      WHEN NO_DATA_FOUND THEN
                                      Email := NULL;

                                            begin
                                            insert into TempQandA(column1) VALUES (1);
                                             end;
                                     end;
                     end;
         end;
END;

【问题讨论】:

    标签: sql oracle plsql oracle11g execute-immediate


    【解决方案1】:

    动态地创建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 都会本地到每个会话。

    编辑:正如拉利特所说,GTTDDL 不接受CREATE OR REPLACE

    【讨论】:

    • GTT 创建语句不正确。 OR REPLACE 是无效选项。
    【解决方案2】:

    '创建或替换全局临时表 TempQandA(column1 number) 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>
    

    【讨论】:

    • 我们两个一起回答,回答这个问题;)
    • 第一个问题是 create 语句 :-) 然后是插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多