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

Indholdsfortegnelse:

Anonim

Hvad er dynamisk SQL?

Dynamisk SQL er en programmeringsmetode til generering og kørsel af udsagn ved kørselstid. Det bruges hovedsageligt til at skrive de generelle og fleksible programmer, hvor SQL-udsagnene oprettes og udføres ved kørsel baseret på kravet.

I denne vejledning lærer du-

  • Måder at skrive dynamisk SQL på
  • NDS (Native Dynamic SQL) - Udfør øjeblikkelig
  • DBMS_SQL til dynamisk SQL

Måder at skrive dynamisk SQL på

PL / SQL giver to måder at skrive dynamisk SQL på

  1. NDS - Native Dynamic SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) - Udfør øjeblikkelig

Native Dynamic SQL er den nemmere måde at skrive dynamisk SQL på. Det bruger kommandoen 'EXECUTE IMMEDIATE' til at oprette og udføre SQL ved kørselstid. Men for at bruge denne måde skal datatypen og antallet af variabler, der skal bruges på en kørselstid, være kendt før. Det giver også bedre ydeevne og mindre kompleksitet, når man sammenligner med DBMS_SQL.

Syntaks

EXECUTE IMMEDIATE()[INTO][USING ]
  • Ovenstående syntaks viser kommandoen EXECUTE IMMEDIATE.
  • Klausul INTO er valgfri og bruges kun, hvis den dynamiske SQL indeholder en select-sætning, der henter værdier. Variabeltypen skal matche med variabeltypen i select-sætningen.
  • Klausul USING er valgfri og bruges kun, hvis den dynamiske SQL indeholder nogen bindingsvariabler.

Eksempel 1 : I dette eksempel skal vi hente dataene fra emp-tabellen til emp_no '1001' ved hjælp af NDS-sætningen.

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;/

Produktion

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

Kode Forklaring:

  • Kodelinje 2-6 : Erklærende variabler.
  • Kodelinje 8 : Indramning af SQL ved kørselstid. SQL indeholder bindvariablen i hvor betingelse ': empno'.
  • Kodelinje 9 : Udførelse af den indrammede SQL-tekst (som udføres i kodelinje 8) ved hjælp af NDS-kommandoen 'EXECUTE IMMEDIATE'
  • Variablerne i 'INTO' klausul (lv_emp_name, ln_emp_no, ln_salary, ln_manager) bruges til at holde de hentede værdier fra SQL-forespørgslen (emp_name, emp_no, løn, manager)
  • 'USING' -klausul giver værdierne til bindingsvariablen i SQL-forespørgslen (: emp_no).
  • Kodelinje 10-13 : Visning af hentede værdier.

DBMS_SQL til dynamisk SQL

PL / SQL leverer DBMS_SQL-pakken, der giver dig mulighed for at arbejde med dynamisk SQL. Processen med at oprette og udføre den dynamiske SQL indeholder følgende proces.

  • ÅBEN CURSOR : Den dynamiske SQL udføres på samme måde som en markør. Så for at udføre SQL-sætningen skal vi åbne markøren.
  • PARSE SQL : Det næste trin er at analysere den dynamiske SQL. Denne proces vil bare kontrollere syntaksen og holde forespørgslen klar til at udføre.
  • BIND VARIABLE Værdier : Det næste trin er at tildele værdierne for bindingsvariabler, hvis der er nogen.
  • DEFINER KOLONNE : Det næste trin er at definere kolonnen ved hjælp af deres relative positioner i det valgte sætning.
  • UDFØR : Det næste trin er at udføre den analyserede forespørgsel.
  • HENTVÆRDIER : Det næste trin er at hente de udførte værdier.
  • LUK MARKER : Når resultaterne er hentet, skal markøren lukkes.

Eksempel 1 : I dette eksempel skal vi hente dataene fra emp-tabellen til emp_no '1001' ved hjælp af DBMS_SQL-sætning.

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:/

Produktion

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

Kode Forklaring:

  • Kodelinje 1-9 : Variabel erklæring.
  • Kodelinje 10 : Indramning af SQL-sætningen.
  • Kodelinje 11 : Åbning af markøren ved hjælp af DBMS_SQL.OPEN_CURSOR. Det returnerer markør-id'et, der åbnes.
  • Kodelinje 12 : Når markøren er åbnet, analyseres SQL.
  • Kode linje 13 : Bind variabel '1001' er at tildele markøren id i stedet ': EMPNO'.
  • Kodelinje 14-17 : Definition af kolonnenavnet baseret på deres relative placering i SQL-sætningen. I vores tilfælde er den relative position (1) emp_name, (2) emp_no (3) løn (4) manager. Så baseret på denne position definerer vi målvariablen.
  • Kodelinje 18 : Udførelse af forespørgslen ved hjælp af DBMS_SQL.EXECUTE. Det returnerer antallet af behandlede poster.
  • Kodelinje 19-33 : Henter poster ved hjælp af en loop og viser den samme.
  • Kodelinje 20: DBMS_SQL.FETCH_ROWS henter en post fra de behandlede rækker. Det kan kaldes gentagne gange for at hente alle rækkerne. Hvis den ikke kan hente rækker, returnerer den 0 og forlader sløjfen.

Resumé

I dette afsnit har vi diskuteret dynamisk SQL og måder at udføre DYNAMIC SQL på. Vi har også set de forskellige trin i udførelsen af ​​den dynamiske SQL på begge måder. Vi har også set eksemplerne, hvor det samme scenario håndteres på både NDS- og DBMS_SQL-måder til at udføre udførelse i løbetid.