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
- NDS - natív dinamikus SQL
- 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.