Vodič za dinamički SQL za Oracle PL / SQL: Izvršite odmah & DBMS_SQL

Sadržaj:

Anonim

Što je Dynamic SQL?

Dynamic SQL je programska metodologija za generiranje i pokretanje izraza u vrijeme izvođenja. Uglavnom se koristi za pisanje općih i fleksibilnih programa gdje će se SQL izrazi stvarati i izvršavati u vrijeme izvođenja na temelju zahtjeva.

U ovom vodiču naučit ćete-

  • Načini pisanja dinamičkog SQL-a
  • NDS (Native Dynamic SQL) - izvršava odmah
  • DBMS_SQL za dinamički SQL

Načini pisanja dinamičkog SQL-a

PL / SQL pruža dva načina za pisanje dinamičkog SQL-a

  1. NDS - Izvorni dinamički SQL
  2. DBMS_SQL

NDS (Native Dynamic SQL) - izvršava odmah

Izvorni dinamički SQL jednostavniji je način pisanja dinamičkog SQL-a. Koristi naredbu 'EXECUTE IMMEDIATE' za stvaranje i izvršavanje SQL-a u vrijeme izvođenja. Ali da bismo koristili ovaj način, tip podataka i broj varijable koji će se koristiti u vremenu izvođenja moraju biti poznati prije. Također daje bolje performanse i manje složenosti u usporedbi s DBMS_SQL.

Sintaksa

EXECUTE IMMEDIATE()[INTO][USING ]
  • Gornja sintaksa prikazuje naredbu EXECUTE IMMEDIATE.
  • Klauzula INTO nije obavezna i koristi se samo ako dinamički SQL sadrži naredbu select koja dohvaća vrijednosti. Tip varijable trebao bi se podudarati s vrstom varijable izraza select.
  • Klauzula USING nije obavezna i koristi se samo ako dinamički SQL sadrži bilo koju varijablu vezanja.

Primjer 1 : U ovom ćemo primjeru dohvatiti podatke iz emp tablice za emp_no '1001' pomoću NDS izraza.

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

Izlaz

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

Objašnjenje koda:

  • Redak koda 2-6 : Deklariranje varijabli.
  • Redak koda 8 : Uokvirivanje SQL-a u vrijeme izvođenja. SQL sadrži varijablu vezanja u kojem je uvjet ': empno'.
  • Redak koda 9 : Izvođenje uokvirenog SQL teksta (što se izvodi u retku koda 8) pomoću NDS naredbe 'IZVRŠI ODMAH'
  • Varijable u klauzuli 'INTO' (lv_emp_name, ln_emp_no, ln_salary, ln_manager) koriste se za zadržavanje dohvaćenih vrijednosti iz SQL upita (emp_name, emp_no, plata, upravitelj)
  • Klauzula 'USING' daje vrijednosti varijabli vezanja u SQL upitu (: emp_no).
  • Redak koda 10-13 : Prikaz dohvaćenih vrijednosti.

DBMS_SQL za dinamički SQL

PL / SQL pruža paket DBMS_SQL koji vam omogućuje rad s dinamičkim SQL-om. Postupak stvaranja i izvršavanja dinamičkog SQL-a sadrži sljedeći postupak.

  • OTVORENI KURSOR : Dinamički SQL će se izvršiti na isti način kao i kursor. Dakle, da bismo izvršili SQL izraz, moramo otvoriti pokazivač.
  • PARSE SQL : Sljedeći je korak raščlamba dinamičkog SQL-a. Ovaj će postupak samo provjeriti sintaksu i održati upit spremnim za izvršenje.
  • Vrijednosti BIND VARIABLE : Sljedeći je korak dodijeliti vrijednosti za varijable vezanja ako postoje.
  • DEFINIRAJ STOLPAC : Sljedeći je korak definiranje stupca pomoću njihovih relativnih položaja u naredbi select.
  • IZVRŠI : Sljedeći je korak izvršenje raščlanjenog upita.
  • FETCH VALUES : Sljedeći je korak dohvaćanje izvršenih vrijednosti.
  • ZATVORI KURSOR : Nakon dohvaćanja rezultata, pokazivač treba zatvoriti.

Primjer 1 : U ovom ćemo primjeru dohvatiti podatke iz emp tablice za emp_no '1001' pomoću DBMS_SQL izraza.

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

Izlaz

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

Objašnjenje koda:

  • Redak koda 1-9 : Deklaracija varijable.
  • Redak koda 10 : Uokvirivanje SQL izraza.
  • Linija koda 11 : Otvaranje kursora pomoću DBMS_SQL.OPEN_CURSOR. Vratit će se kursor koji se otvorio.
  • Redak koda 12 : Nakon otvaranja kursora, SQL se raščlanjuje.
  • Redak koda 13 : Varijabla vezanja '1001' dodjeljuje se ID-u kursora umjesto ': empno'.
  • Redak koda 14-17 : Definiranje naziva stupca na temelju njihovog relativnog položaja u SQL izrazu. U našem slučaju, relativni položaj je (1) ime_ispuna, (2) emp_no (3) plaća (4) menadžer. Dakle, na temelju ove pozicije definiramo ciljnu varijablu.
  • Redak koda 18 : Izvršenje upita pomoću DBMS_SQL.EXECUTE. Vraća broj obrađenih zapisa.
  • Redak koda 19-33 : Dohvaćanje zapisa pomoću petlje i prikazivanje istih.
  • Redak koda 20: DBMS_SQL.FETCH_ROWS dohvatit će jedan zapis iz obrađenih redaka. Može se pozivati ​​više puta za dohvaćanje svih redaka. Ako ne može dohvatiti retke, vratit će 0, izlazeći tako iz petlje.

Sažetak

U ovom smo odjeljku razgovarali o dinamičkom SQL-u i načinima izvršavanja DINAMIČKOG SQL-a. Također smo vidjeli različite korake u izvršavanju dinamičkog SQL-a na oba načina. Također smo vidjeli primjere u kojima se isti scenarij obrađuje i na NDS i na DBMS_SQL načine za izvođenje izvršenja u vrijeme izvođenja.