sql >> Database >  >> RDS >> Oracle

DDL-statements in PL/SQL?

Ik neem aan dat je zoiets als het volgende doet:

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;

Tijdens het compileren is de tabel TEMP , bestaat niet . Het is nog niet aangemaakt. Omdat het niet bestaat, kun je er niet uit selecteren; je moet de SELECT dus ook dynamisch doen. Het is eigenlijk niet nodig om een ​​SELECT te doen in deze bepaalde situatie kunt u echter de returning into syntaxis.

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;

Het dynamisch maken van tabellen is echter normaal gesproken een indicatie van een slecht ontworpen schema. Het zou niet echt nodig moeten zijn.

Ik kan René Nyffenegger's aanbevelen post "Waarom is dynamische SQL slecht?" om redenen waarom u dynamische SQL moet vermijden, indien mogelijk, vanuit het oogpunt van prestaties. Houd er ook rekening mee dat u veel meer openstaat voor SQL-injectie en moet bindvariabelen gebruiken en DBMS_ASSERT om je ertegen te beschermen.



  1. SQL LIMIT vs. JDBC-instructie setMaxRows. Welke is beter?

  2. Subquery's in SQL gebruiken om max(count()) te vinden

  3. (Python) psycopg2-installatie

  4. Verhuizen naar mysqli, mysql_result