Предполагам, че правите нещо като следното:
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;
По време на компилация таблицата TEMP
, не съществува . Все още не е създаден. Тъй като не съществува, не можете да изберете от него; следователно вие също трябва да направите SELECT динамично. Всъщност няма нужда да правите SELECT в конкретно ситуация, но можете да използвате returning into
синтаксис.
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;
Въпреки това необходимостта от динамично създаване на таблици обикновено е индикация за лошо проектирана схема. Всъщност не би трябвало да е необходимо.
Мога да препоръчам на Рене Нифенегер
публикация "Защо динамичният SQL е лош?"
поради причини, поради които трябва да избягвате динамичния SQL, ако изобщо е възможно, от гледна точка на производителността. Моля, имайте предвид също, че сте много по-отворени към SQL инжекция
и трябва да използва променливи за свързване и DBMS_ASSERT
за предпазване от него.