Oracle
 sql >> Database >  >> RDS >> Oracle

Dichiarazioni DDL in PL/SQL?

Presumo che tu stia facendo qualcosa del genere:

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;

In fase di compilazione la tabella, TEMP , non esiste . Non è stato ancora creato. Poiché non esiste, non puoi selezionarlo; quindi devi anche fare il SELECT in modo dinamico. In realtà non è necessario eseguire una SELECT in questo particolare situazione, tuttavia puoi utilizzare il returning into sintassi.

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;

Tuttavia, la necessità di creare tabelle dinamicamente è normalmente un'indicazione di uno schema mal progettato. Non dovrebbe essere davvero necessario.

Posso consigliare René Nyffenegger post "Perché SQL dinamico non è valido?" per motivi per cui dovresti evitare l'SQL dinamico, se possibile, dal punto di vista delle prestazioni. Tieni inoltre presente che sei molto più aperto a Iniezione SQL e dovrebbe utilizzare variabili di collegamento e DBMS_ASSERT per proteggersi da esso.