sql >> Databasteknik >  >> RDS >> Oracle

DDL-satser i PL/SQL?

Jag antar att du gör något i stil med följande:

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;

Vid kompileringstidtabellen, TEMP , finns inte . Den har inte skapats ännu. Eftersom det inte finns kan du inte välja från det; du måste därför också göra SELECT dynamiskt. Det finns faktiskt inget behov av att göra en SELECT i detta speciellt situation men du kan använda returning into 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;

Men att behöva skapa tabeller dynamiskt är normalt en indikation på ett dåligt utformat schema. Det borde egentligen inte vara nödvändigt.

Jag kan rekommendera René Nyffenegger's inlägg "Varför är dynamisk SQL dålig?" av anledningar till varför du bör undvika dynamisk SQL, om det alls är möjligt, ur prestandasynpunkt. Tänk också på att du är mycket mer öppen för SQL-injektion och bör använda bindningsvariabler och DBMS_ASSERT för att skydda sig mot det.



  1. Postgres:VÄLJ kolumnnamn baserat på booleskt värde

  2. Optimera mysql-fråga (gillar/ogillar)

  3. PostgreSQL-fel:Fatalt:rollen användarnamn finns inte

  4. MySQL Trigger kan inte uppdatera tabellen - får ERROR 1442