EXECUTE IMMEDIATE temp table in oracle not created by ORA-00942

Based on this answer , I tried to create a temporary table, but I get an exception. ORA-00942:table or view does not existI would suggest that something is wrong with the statement 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'it fails on insert into TempQandA(column1) VALUES (1);.
Below you will find the SQL statement.

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;
+2
source share
2 answers

You create dynamically GTT, so yours INSERTmust be dynamic too.

Note that PL / SQL checks every static query before executing it. This is why you get an error ORA-942 Table or view doesn't existeven during compilation!

, , .

    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 .

EDIT: , GTT DDL CREATE OR REPLACE

+5

' TempQandA ( 1) ON COMMIT PRESERVE ROWS ';

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>
+2

Source: https://habr.com/ru/post/1615232/


All Articles