Oracle
 sql >> Base de données >  >> RDS >> Oracle

Instructions DDL en PL/SQL ?

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.