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

Mat*_*ius 2 sql oracle plsql oracle11g execute-immediate

基于这个答案,我试图创建临时表,但是我得到异常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;
Run Code Online (Sandbox Code Playgroud)

Mah*_*kar 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;
Run Code Online (Sandbox Code Playgroud)

最后,你不应该被创建GTT的运行时间.要避免这些问题.GTT无论如何都要去每个会话本地.

编辑:正如拉利特所说,GTT我们DDL不接受CREATE OR REPLACE

  • GTT创建语句不正确.`OR REPLACE`是无效选项. (2认同)