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

DDL-udsagn i PL/SQL?

Jeg går ud fra, at du gør noget i stil med følgende:

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;

På kompileringstidspunktet tabellen, TEMP , findes ikke . Den er ikke oprettet endnu. Da det ikke eksisterer, kan du ikke vælge fra det; du skal derfor også udføre SELECT dynamisk. Der er faktisk ikke behov for at foretage et SELECT i denne særlige situation selvom du kan bruge returning into syntaks.

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;

At skulle oprette tabeller dynamisk er dog normalt en indikation af et dårligt designet skema. Det burde egentlig ikke være nødvendigt.

Jeg kan anbefale René Nyffenegger's indlæg "Hvorfor er dynamisk SQL dårlig?" af grunde til, hvorfor du bør undgå dynamisk SQL, hvis det overhovedet er muligt, ud fra et præstationssynspunkt. Vær også opmærksom på, at du er meget mere åben over for SQL-injektion og skal bruge bindevariabler og DBMS_ASSERT for at hjælpe med at beskytte sig mod det.



  1. Hvordan tester man, om en streng er JSON eller ej?

  2. Er det muligt at se mysql_error() under Codeigniter?

  3. MYSQL finder alle rækker, hvor anden række har givet værdier

  4. MySQL:vælg * fra tabel hvor col IN (null, ) er muligt uden OR