Oracle PL / SQL Dynamic SQL Tutorial: Execute Immediate & DBMS_SQL

Innholdsfortegnelse:

Anonim

Hva er Dynamic SQL?

Dynamic SQL er en programmeringsmetodikk for å generere og kjøre uttalelser i løpetid. Den brukes hovedsakelig til å skrive de generelle og fleksible programmene der SQL-setningene blir opprettet og utført på kjøretid basert på kravet.

I denne veiledningen vil du lære-

  • Måter å skrive dynamisk SQL på
  • NDS (Native Dynamic SQL) - Utfør øyeblikkelig
  • DBMS_SQL for dynamisk SQL

Måter å skrive dynamisk SQL på

PL / SQL gir to måter å skrive dynamisk SQL på

  1. NDS - Native Dynamic SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) - Utfør øyeblikkelig

Native Dynamic SQL er den enkleste måten å skrive dynamisk SQL på. Den bruker kommandoen 'EXECUTE IMMEDIATE' for å opprette og utføre SQL på kjøretid. Men for å bruke denne måten, må datatypen og antall variabler som skal brukes på kjøretid være kjent før. Det gir også bedre ytelse og mindre kompleksitet når man sammenligner med DBMS_SQL.

Syntaks

EXECUTE IMMEDIATE()[INTO][USING ]
  • Ovennevnte syntaks viser EXECUTE IMMEDIATE command.
  • Klausul INTO er valgfri og brukes bare hvis den dynamiske SQL inneholder en select-setning som henter verdier. Variabeltypen skal samsvare med variabeltypen i select-setningen.
  • Klausul USING er valgfri og brukes bare hvis den dynamiske SQL inneholder noen bindingsvariabler.

Eksempel 1 : I dette eksemplet skal vi hente dataene fra emp-tabellen for emp_no '1001' ved hjelp av NDS-setningen.

DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50):ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;BEGINly_sql:=;SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo:;EXECUTE IMMEDIATE lv_sql INTO lv_emp_name,ln_emp_no:ln_salary,ln_managerUSING 1001;Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:‘||ln_emp_no);Dbms_output.put_line(‘Salary:'||ln_salaiy);Dbms_output.put_line('Manager ID:‘||ln_manager);END;/

Produksjon

Employee Name : XXXEmployee Number: 1001Salary: 15000Manager ED: 1000

Kode Forklaring:

  • Kodelinje 2-6 : Deklarerende variabler.
  • Kodelinje 8 : Innramming av SQL ved kjøretid. SQL inneholder bindingsvariabelen i der tilstanden ': empno'.
  • Kodelinje 9 : Utføre den innrammede SQL-teksten (som gjøres i kodelinje 8) ved hjelp av NDS-kommandoen 'EXECUTE IMMEDIATE'
  • Variablene i 'INTO' klausul (lv_emp_name, ln_emp_no, ln_salary, ln_manager) brukes til å holde de hentede verdiene fra SQL-spørringen (emp_name, emp_no, lønn, manager)
  • 'USING' klausul gir verdiene til bindingsvariabelen i SQL-spørringen (: emp_no).
  • Kodelinje 10-13 : Viser hentede verdier.

DBMS_SQL for dynamisk SQL

PL / SQL gir DBMS_SQL-pakken som lar deg jobbe med dynamisk SQL. Prosessen med å opprette og utføre dynamisk SQL inneholder følgende prosess.

  • OPEN CURSOR : Dynamisk SQL kjøres på samme måte som en markør. Så for å utføre SQL-setningen, må vi åpne markøren.
  • PARSE SQL : Neste trinn er å analysere dynamisk SQL. Denne prosessen vil bare sjekke syntaksen og holde spørringen klar til å utføres.
  • BIND VARIABLE Verdier : Det neste trinnet er å tilordne verdiene for bindingsvariabler hvis noen.
  • DEFINER KOLONN : Det neste trinnet er å definere kolonnen ved hjelp av deres relative posisjoner i seleksjonsuttalelsen.
  • EXECUTE : Det neste trinnet er å utføre den analyserte spørringen.
  • FETCH-VERDIER : Neste trinn er å hente de utførte verdiene.
  • Lukk markør : Når resultatene er hentet, bør markøren lukkes.

Eksempel 1 : I dette eksemplet skal vi hente dataene fra emp-tabellen for emp_no '1001' ved hjelp av DBMS_SQL-setningen.

DECLARElv_sql VARCHAR2(500);lv_emp_name VARCHAR2(50);ln_emp_no NUMBER;ln_salary NUMBER;ln_manager NUMBER;ln_cursor_id NUMBER;ln_rows_processed;BEGINlv_sql:=‘SELECT emp_name,emp_no,salary,manager FROM emp WHEREemp_no=:empmo’;in_cursor_id:=DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(ln_cursor_id,lv_sql,DBMS_SQL.NATIVE);DBMS_SQL.BIXD_VARLABLE(ln_cursor_id:‘empno‘,1001);DBMS_SQL.DEFINE_COLUMN(ln_cursor_ici,1,ln_emp_name);DBMS_SQL.DEFINE_COLUMN(ln_cursor_id,2,ln_emp_no);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,3,ln_salary);DBMS_SQL .DEFINE_COLUMN(ln_cursor_id,4,ln_manager);ln_rows__processed:=DBMS_SQL.EXECUTE(ln_cursor_id);
LOOPIF DBMS_SQL.FETCH_ROWS(ln_cursor_id)=0THENEXIT;ELSEDBMS_SQL.COLUMN_VALUE(ln_cursor_id,1,lv_emp_name);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,2,ln_emp_no);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,3,In_salary);DBMS_SQL.COLUMN_VALUE(ln_cursor_id,4,In_manager);Dbms_output.put_line('Employee Name:‘||lv_emp_name);Dbms_output.put_line('Employee Number:l‘||ln_emp_no);Dbms_output.put_line(‘Salary:‘||ln_salary);Dbms_output.put_line('Manager ID :‘| ln_manager);END IF;END LOOP;DBMS_SQL.CLOSE_ClIRSOR(ln_cursor_id);END:/

Produksjon

Employee Name:XXXEmployee Number:1001Salary:15000Manager ID:1000

Kode Forklaring:

  • Kodelinje 1-9 : Variabel erklæring.
  • Kodelinje 10 : Innramming av SQL-setningen.
  • Kodelinje 11 : Åpne markøren ved hjelp av DBMS_SQL.OPEN_CURSOR. Det vil returnere markør-ID som åpnes.
  • Kodelinje 12 : Etter at markøren er åpnet, blir SQL analysert.
  • Kode linje 13 : Bind variabel '1001' tilordner til markøren id i stedet ': empno'.
  • Kodelinje 14-17 : Definere kolonnenavnet basert på deres relative posisjon i SQL-setningen. I vårt tilfelle er den relative posisjonen (1) emp_name, (2) emp_no (3) lønn (4) manager. Så basert på denne posisjonen definerer vi målvariabelen.
  • Kodelinje 18 : Utføre spørringen ved hjelp av DBMS_SQL.EXECUTE. Det returnerer antall behandlede poster.
  • Kodelinje 19-33 : Henter postene ved hjelp av en sløyfe og viser den samme.
  • Kodelinje 20: DBMS_SQL.FETCH_ROWS henter en post fra radene som er behandlet. Det kan kalles gjentatte ganger for å hente alle radene. Hvis den ikke kan hente rader, vil den returnere 0 og dermed avslutte sløyfen.

Sammendrag

I denne delen har vi diskutert dynamisk SQL og måtene å utføre DYNAMIC SQL på. Vi har også sett de forskjellige trinnene i å utføre dynamisk SQL på begge måter. Vi har også sett eksemplene der det samme scenariet håndteres på både NDS- og DBMS_SQL-måter for å utføre kjøring på kjøretid.