Je suppose que vous faites quelque chose comme ceci :
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;
Au moment de la compilation, la table, TEMP
, n'existe pas . Il n'a pas encore été créé. Comme il n'existe pas, vous ne pouvez pas en sélectionner; vous devez donc également faire le SELECT dynamiquement. Il n'est en fait pas nécessaire de faire un SELECT dans ce particulier situation bien que vous puissiez utiliser le returning into
syntaxe.
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;
Cependant, le besoin de créer dynamiquement des tables est normalement une indication d'un schéma mal conçu. Cela ne devrait pas vraiment être nécessaire.
Je peux recommander René Nyffenegger
post "Pourquoi le SQL dynamique est-il mauvais ?"
pour des raisons pour lesquelles vous devriez éviter le SQL dynamique, si possible, du point de vue des performances. Sachez également que vous êtes beaucoup plus ouvert à Injection SQL
et doit utiliser des variables de liaison et DBMS_ASSERT
pour aider à s'en protéger.