EXECUTE IMMEDIATE Temp таблица в оракуле не создается 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;
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 будет локальным для каждой сессии.
РЕДАКТИРОВАТЬ: Как говорит Лалит, GTT
"s DDL
не принимает CREATE OR REPLACE
"СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ TempQandA(номер столбца 1) НА СТРОКЕ СОХРАНИТЬ COMMIT";
Ключевое слово 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>