Zakładam, że robisz coś takiego:
declare
v_temp varchar2(20);
begin
execute immediate 'create table temp(name varchar(20))';
execute immediate 'insert into temp values(''XYZ'')';
select name into v_name from temp;
end;
W czasie kompilacji tabela TEMP
, nie istnieje . Nie został jeszcze utworzony. Ponieważ nie istnieje, nie możesz z niego wybierać; dlatego musisz również dynamicznie wykonywać SELECT. W tym szczególnie nie ma potrzeby wykonywania SELECT jednak możesz użyć returning into
składnia.
declare
v_temp varchar2(20)
begin
execute immediate 'create table temp(name varchar2(20))';
execute immediate 'insert into temp
values(''XYZ'')
returning name into :1'
returning into v_temp;
end;
Jednak potrzeba dynamicznego tworzenia tabel zwykle wskazuje na źle zaprojektowany schemat. To naprawdę nie powinno być konieczne.
Mogę polecić René Nyffeneggera
post "Dlaczego dynamiczny SQL jest zły?"
z powodów, dla których powinieneś unikać dynamicznego SQL, jeśli to w ogóle możliwe, z punktu widzenia wydajności. Należy również pamiętać, że jesteś znacznie bardziej otwarty na Wstrzyknięcie SQL
i powinien używać zmiennych wiązania i DBMS_ASSERT
aby pomóc się przed tym chronić.