Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Instruções DDL em PL/SQL?


Suponho que você esteja fazendo algo como o seguinte:
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;

Em tempo de compilação a tabela, TEMP , não existe . Ainda não foi criado. Como ela não existe, você não pode selecionar a partir dela; você, portanto, também tem que fazer o SELECT dinamicamente. Na verdade, não há necessidade de fazer um SELECT neste particular embora você possa usar o returning into sintaxe.
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;

No entanto, a necessidade de criar tabelas dinamicamente normalmente é uma indicação de um esquema mal projetado. Não deveria ser realmente necessário.

Posso recomendar René Nyffenegger's post "Por que o SQL dinâmico é ruim?" por razões pelas quais você deve evitar o SQL dinâmico, se possível, do ponto de vista do desempenho. Esteja ciente de que você está muito mais aberto a Injeção de SQL e deve usar variáveis ​​de ligação e DBMS_ASSERT para ajudar a protegê-lo.