Oracle
 sql >> Datenbank >  >> RDS >> Oracle

DDL-Anweisungen in PL/SQL?

Ich nehme an, Sie tun etwas wie das Folgende:

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;

Zur Kompilierzeit wird die Tabelle TEMP , existiert nicht . Es wurde noch nicht erstellt. Da es nicht existiert, können Sie nicht daraus auswählen; Sie müssen also auch das SELECT dynamisch durchführen. Es besteht eigentlich keine Notwendigkeit, in diesem bestimmten Fall ein SELECT durchzuführen Situation, obwohl Sie den zurückkehren können Syntax.

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;

Die Notwendigkeit, Tabellen dynamisch zu erstellen, ist jedoch normalerweise ein Hinweis auf ein schlecht entworfenes Schema. Es sollte nicht wirklich notwendig sein.

Ich kann René Nyffeneggers empfehlen posten Sie "Warum ist dynamisches SQL schlecht?" aus Gründen, warum Sie aus Performance-Gesichtspunkten möglichst auf dynamisches SQL verzichten sollten. Bitte beachten Sie auch, dass Sie viel offener für sind SQL-Injection und sollte Bind-Variablen und DBMS_ASSERT um sich davor zu schützen.