Oracle PL / SQL dinamikus SQL oktatóanyag: Azonnali & DBMS_SQL

Tartalomjegyzék:

Anonim

Mi a dinamikus SQL?

A Dynamic SQL egy programozási módszertan utasítások generálásához és futtatásához. Elsősorban az általános célú és rugalmas programok megírásához használják, ahol az SQL utasításokat a követelmények alapján futás közben hozzák létre és futtatják.

Ebben az oktatóanyagban megtanulja-

  • Dinamikus SQL írásmódjai
  • NDS (natív dinamikus SQL) - Azonnali végrehajtása
  • DBMS_SQL dinamikus SQL-hez

Dinamikus SQL írásmódjai

A PL / SQL kétféle módon írja be a dinamikus SQL-t

  1. NDS - natív dinamikus SQL
  2. DBMS_SQL

NDS (natív dinamikus SQL) - Azonnali végrehajtása

A natív dinamikus SQL a dinamikus SQL írásának egyszerűbb módja. Az 'EXECUTE IMMEDIATE' paranccsal futtatja az SQL-t futás közben. De ennek használatához a futási időben használandó változó adattípusát és számát korábban ismerni kell. A DBMS_SQL-hez viszonyítva jobb teljesítményt és kevésbé összetettséget is nyújt.

Szintaxis

EXECUTE IMMEDIATE()[INTO][USING ]
  • A fenti szintaxis az EXECUTE IMMEDIATE parancsot mutatja.
  • Az INTO záradék nem kötelező és csak akkor használható, ha a dinamikus SQL egy select utasítást tartalmaz, amely lekérdezi az értékeket. A változó típusának meg kell egyeznie a select utasítás változó típusával.
  • A USING záradék nem kötelező és csak akkor használható, ha a dinamikus SQL tartalmaz bármilyen kötési változót.

1. példa : Ebben a példában az emp_no '1001' emp tábla adatait fogjuk lekérni az NDS utasítás segítségével.

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

Kimenet

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

Kód Magyarázat:

  • 2-6 kódsor: Változók deklarálása.
  • 8. kódsor: Az SQL keretezése futás közben. Az SQL tartalmazza az összerendelés változót az ': empno' feltételben.
  • 9. kódsor: A keretes SQL szöveg végrehajtása (ami a 8. kódsorban történik) az NDS 'EXECUTE IMMEDIATE' parancs segítségével
  • Az 'INTO' záradékban szereplő változók (lv_emp_name, ln_emp_no, ln_salary, ln_manager) az SQL lekérdezésből lekért értékek megtartására szolgálnak (emp_name, emp_no, fizetés, manager)
  • A 'USING' záradék adja meg az értékeket az SQL lekérdezés kötési változójának (: emp_no).
  • 10-13 kódsor : A beolvasott értékek megjelenítése.

DBMS_SQL dinamikus SQL-hez

A PL / SQL biztosítja a DBMS_SQL csomagot, amely lehetővé teszi a dinamikus SQL használatát. A dinamikus SQL létrehozásának és végrehajtásának folyamata a következő folyamatot tartalmazza.

  • NYITOTT KURZOR : A dinamikus SQL ugyanúgy fog végrehajtani, mint egy kurzor. Tehát az SQL utasítás végrehajtásához meg kell nyitnunk a kurzort.
  • PARSE SQL : A következő lépés a dinamikus SQL elemzése. Ez a folyamat csak ellenőrzi a szintaxist, és készen áll a lekérdezés végrehajtására.
  • BIND VARIABLE Values : A következő lépés a kötési változók értékeinek hozzárendelése, ha vannak ilyenek.
  • OSZLOP MEGHATÁROZÁSA : A következő lépés az oszlop meghatározása a select utasítás relatív pozícióinak felhasználásával.
  • VÉGREHAJT : A következő lépés az értelmezett lekérdezés végrehajtása.
  • FETCH VALUES : A következő lépés a végrehajtott értékek beolvasása.
  • ZÁRÓ KURZOR : Az eredmények beolvasása után a kurzort be kell zárni.

1. példa : Ebben a példában az emp_no '1001' emp tábla adatait fogjuk lekérni a DBMS_SQL utasítás segítségével.

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

Kimenet

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

Kód Magyarázat:

  • 1-9 kódsor : Változó nyilatkozat.
  • 10. kódsor: Az SQL utasítás keretezése.
  • 11. kódsor: A kurzor megnyitása a DBMS_SQL.OPEN_CURSOR használatával. Visszaadja a megnyitott kurzorazonosítót.
  • 12. kódsor : A kurzor megnyitása után az SQL elemzésre kerül.
  • 13. kódsor: Az „1001” kötési változó a kurzorazonosítóhoz kerül hozzárendelésre: „empno”.
  • Kódsor 14-17 : Az oszlop nevének meghatározása az SQL utasítás relatív pozíciója alapján. Esetünkben a relatív pozíció (1) emp_name, (2) emp_no (3) fizetés (4) manager. Tehát ezen pozíció alapján meghatározzuk a célváltozót.
  • 18. kódsor: A lekérdezés végrehajtása a DBMS_SQL.EXECUTE használatával. Visszaadja a feldolgozott rekordok számát.
  • Kódsor 19-33 : A rekordok lekérése egy hurok segítségével, és ugyanazok megjelenítése.
  • 20. kódsor : A DBMS_SQL.FETCH_ROWS egy rekordot fog lekérni a feldolgozott sorokból. Többször is hívható az összes sor beolvasására. Ha nem tudja beolvasni a sorokat, akkor 0-t ad vissza, így kilép a ciklusból.

Összegzés

Ebben a szakaszban megvitattuk a dinamikus SQL-t és a DYNAMIC SQL futtatásának módjait. Láttuk a dinamikus SQL végrehajtásának különböző lépéseit is. Láttunk olyan példákat is, amelyekben ugyanazt a forgatókönyvet mind NDS, mind DBMS_SQL módon kezelik a futtatás futtatásakor.