ВЫПОЛНИТЬ НЕМЕДЛЕННО Временная таблица в оракуле не создается ORA-00942

Основываясь на этом ответе, я пытался создать временную таблицу, однако я получаю исключение 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;

person Matas Vaitkevicius    schedule 06.10.2014    source источник


Ответы (2)


Вы динамически создаете 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 в любом случае будет локальным для каждого сеанса.

EDIT: Как говорит Лалит, DDL GTT не принимает CREATE OR REPLACE

person Maheswaran Ravisankar    schedule 06.10.2014
comment
Заявление о создании GTT неверно. OR REPLACE — недопустимый вариант. - person Lalit Kumar B; 06.10.2014

'СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ 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>
person Lalit Kumar B    schedule 06.10.2014
comment
Наши оба ответа вместе отвечают на этот вопрос ;) - person Maheswaran Ravisankar; 06.10.2014
comment
Первая проблема связана с оператором create :-) Затем следует вставка. - person Lalit Kumar B; 06.10.2014