3

基于这个答案,我试图创建临时表,但是我遇到了异常,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;
4

2 回答 2

6

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

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

于 2014-10-06T08:43:50.200 回答
2

'在提交保留行上创建或替换全局临时表 TempQandA(column1 number)';

关键字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>
于 2014-10-06T08:42:34.720 回答