sql >> Base de Datos >  >> RDS >> Oracle

¿Declaraciones DDL en PL/SQL?

Supongo que estás haciendo algo como lo siguiente:

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;

En tiempo de compilación la tabla, TEMP , no existe . Aún no se ha creado. Como no existe, no puede seleccionar de él; por lo tanto, también tiene que hacer SELECT dinámicamente. En realidad, no hay necesidad de hacer una SELECCIÓN en este particular situación aunque puede usar el returning into sintaxis.

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;

Sin embargo, la necesidad de crear tablas dinámicamente es normalmente una indicación de un esquema mal diseñado. Realmente no debería ser necesario.

Puedo recomendar René Nyffenegger's post "¿Por qué SQL dinámico es malo?" por las razones por las que debe evitar el SQL dinámico, si es posible, desde el punto de vista del rendimiento. También tenga en cuenta que está mucho más abierto a Inyección SQL y debe usar variables de enlace y DBMS_ASSERT para ayudar a protegerse contra él.