A dinamikus SQL egy olyan programozási technika, amely lehetővé teszi az SQL utasítások dinamikus felépítését futás közben. Dinamikus SQL használatával általánosabb célú, rugalmas alkalmazásokat hozhat létre, mivel az SQL utasítás teljes szövege ismeretlen lehet a fordítás során. Például a dinamikus SQL lehetővé teszi egy olyan eljárás létrehozását, amely egy olyan táblán működik, amelynek neve csak futásig ismert.
Az Oracle korábbi kiadásaiban a dinamikus SQL PL / SQL alkalmazásban történő megvalósításának egyetlen módja az volt, hogy a DBMS_SQL
csomag használatával. Az Oracle8i natív dinamikus SQL-t vezet be, amely a DBMS_SQL
csomag alternatívája. A natív dinamikus SQL használatával dinamikus SQL utasításokat közvetlenül elhelyezhet PL / SQL blokkokban.
Ez a fejezet a következő témákat fedi le:
- Mi az a dinamikus SQL?
- Mikor érdemes dinamikus SQL-t használni
- Dinamikus SQL-forgatókönyv natív dinamikus SQL használatával
- Natív dinamikus SQL és a DBMS_SQL csomag
- alkalmazás Fejlesztési nyelvek, kivéve PL / SQL
Mi a dinamikus SQL?
A dinamikus SQL lehetővé teszi olyan SQL utasításokra hivatkozó programok írását, amelyek teljes szövege futásig nem ismert. Mielőtt részletesen megvitatnánk a dinamikus SQL-t, a statikus SQL egyértelmű meghatározása jó kiindulópontot jelenthet a dinamikus SQL megértéséhez. A statikus SQL utasítások végrehajtásról végrehajtásra nem változnak. A statikus SQL utasítások teljes szövege ismert a fordítás során, amely a következő előnyökkel jár:
- A sikeres fordítás ellenőrzi, hogy az SQL utasítások érvényes adatbázis-objektumokra hivatkoznak-e.
- A sikeres fordítás ellenőrzi, hogy a szükséges jogosultságok rendelkezésre állnak-e az adatbázis-objektumok eléréséhez.
- A statikus SQL teljesítménye általában jobb, mint a dinamikus SQL.
Ezen előnyök miatt csak akkor használjon dinamikus SQL-t, ha a statikus SQL-t nem tudja elérni céljainak megvalósításához, vagy ha a statikus SQL használata nehézkes a dinamikus SQL-hez képest. A statikus SQL-nek azonban vannak korlátai, amelyeket a dinamikus SQL segítségével lehet legyőzni. Nem biztos, hogy mindig tudja az SQL utasítások teljes szövegét, amelyeket PL / SQL eljárásban kell végrehajtani. A program elfogadhat olyan felhasználói adatbevitelt, amely meghatározza az végrehajtandó SQL utasításokat, vagy a programnak szüksége lehet néhány feldolgozási munkára, hogy meghatározza a helyes műveletet. Ilyen esetekben dinamikus SQL-t kell használnia.
Vegyünk például egy jelentési alkalmazást, amely szabványos lekérdezéseket hajt végre olyan adattárházi környezetek tábláin, ahol a pontos táblanév futásig nem ismert. Az adattárházban található nagy mennyiségű adat hatékony elhelyezéséhez minden negyedévben új táblázatot kell létrehoznia a negyedéves számlaadatok tárolásához. Ezeknek a táblázatoknak pontosan ugyanaz a meghatározása, és a negyedév kezdő hónapjának és évének megfelelően nevezik őket, például INV_01_1997
, INV_04_1997
, INV_07_1997
, INV_10_1997
, INV_01_1998
stb. Ilyen esetben használhat dinamikusat SQL a jelentési alkalmazásban a tábla nevének futás közbeni megadásához.
Statikus SQL esetén az összes adatmeghatározási információt, például a táblázat meghatározásait, amelyekre a program SQL utasításai hivatkoznak, ismerni kell a fordítás során. Ha az adatdefiníció megváltozik, meg kell változtatnia és újrafordítania a programot. A dinamikus SQL programok képesek kezelni az adatdefiníciós információk változását, mert az SQL utasítások futás közben “menet közben” változhatnak. Ezért a dinamikus SQL sokkal rugalmasabb, mint a statikus SQL. A dinamikus SQL lehetővé teszi újrafelhasználható alkalmazáskód megírását, mivel a kód meghatároz egy folyamatot, amely független a felhasznált SQL utasításoktól.
Ezenkívül a dinamikus SQL lehetővé teszi olyan statikusan nem támogatott SQL utasítások végrehajtását is SQL programok, például adatmeghatározási nyelv (DDL) utasítások. Ezeknek az állításoknak a támogatásával többet érhet el a PL / SQL programjaival.
A dinamikus SQL programok kifejezés olyan programokat jelent, amelyek dinamikus SQL-t tartalmaznak; az ilyen programok tartalmazhatnak statikus SQL-t is. A statikus SQL programok azok a programok, amelyek csak statikus SQL-t tartalmaznak, és nem tartalmaznak dinamikus SQL-t.
Mikor kell használni a dinamikus SQL-t
Akkor használjon dinamikus SQL-t, ha a statikus SQL nem támogatja a végrehajtani kívánt művelet, vagy olyan esetekben, amikor nem ismeri azokat a pontos SQL utasításokat, amelyeket egy PL / SQL eljárásnak kell végrehajtania. Ezek az SQL utasítások függhetnek a felhasználói beviteltől, vagy a program által végzett feldolgozási munkától. A következő szakaszok leírják azokat a tipikus helyzeteket, amikor dinamikus SQL-t kell használni, és tipikus problémákat, amelyek megoldhatók a dinamikus SQL használatával.
Dinamikus DML-utasítások végrehajtása
Dinamikus SQL-t használhat végrehajtásra DML utasítások, amelyekben a pontos SQL utasítás futásig nem ismert.Példákért tekintse meg a “Példák a DBMS_SQL csomagkódra és a natív dinamikus SQL kódra” és a “Példa a DML műveletekre” című DML példákat.
A Statikus SQL által nem támogatott utasítások végrehajtása a PL / SQL
PL / SQL-ben nem lehet a következő típusú utasításokat végrehajtani statikus SQL használatával:
- Adatmeghatározási nyelv (DDL) utasítások, például
CREATE
,DROP
,GRANT
ésREVOKE
- Munkamenet-vezérlő nyelv (SCL) utasítások, például
ALTER
SESSION
ésSET
ROLE
Lásd még:Oracle8i SQL Reference a DDL és SCL utasításokkal kapcsolatos információkért.
Használjon dinamikus SQL-t, ha az ilyen típusú utasítások bármelyikét egy PL-ben kell végrehajtania / SQL blokk.
Ezenkívül a statikus SQL a PL / SQL-ben nem teszi lehetővé a TABLE
záradék használatát a SELECT
állítások. A dinamikus SQL-ben nincs ilyen korlátozás. Például a következő PL / SQL blokk tartalmaz egy SELECT
utasítást, amely a TABLE
záradékot és a natív dinamikus SQL-t használja:
Dinamikus lekérdezések végrehajtása
A dinamikus SQL használatával olyan alkalmazásokat hozhat létre, amelyek dinamikus lekérdezéseket hajtanak végre, amelyek olyan kérdések, amelyek teljes szövege futásig nem ismert. Sok típusú alkalmazásnak dinamikus lekérdezéseket kell használnia, ideértve a következőket:
- Olyan alkalmazások, amelyek lehetővé teszik a felhasználók számára, hogy futás közben adjanak meg vagy választhassanak lekérdezési keresési vagy rendezési feltételeket
- Olyan alkalmazások, amelyek lehetővé teszik a felhasználók számára a bevitelt vagy válasszon optimalizálói tippeket futás közben
- Olyan alkalmazások, amelyek lekérdeznek egy adatbázist, ahol a táblák adatmeghatározásai folyamatosan változnak
- Olyan alkalmazások, amelyek lekérdeznek egy adatbázist, ahol gyakran új táblákat hoznak létre
Példákért lásd: “Lekérdezési példa”, és tekintse meg a lekérdezési példákat a “Dinamikus SQL-forgatókönyv natív dinamikus SQL használatával” részben.
Olyan adatbázis-objektumok hivatkozására, amelyek nem léteznek a fordítás során
Sokféle alkalmazásnak kölcsönhatásba kell lépnie az időszakosan létrehozott adatokkal. Lehetséges például az adatbázis-táblák definíciójának meghatározása a fordításkor, de a táblák neve nem, mivel időszakosan új táblákat generálnak. Az alkalmazásnak hozzáférnie kell az adatokhoz, de a táblázatok pontos nevét futásig nem lehet tudni.
A dinamikus SQL megoldhatja ezt a problémát, mert a dinamikus SQL lehetővé teszi, hogy futásig várjon a táblázatnevek, amelyekhez hozzáférnie kell. Például a „Mi az a dinamikus SQL?” Témában tárgyalt minta adattárház alkalmazásban minden negyedévben új táblák jönnek létre, és ezeknek a tábláknak mindig ugyanaz a meghatározása. Ebben az esetben megengedheti a felhasználónak, hogy futás közben adja meg a tábla nevét a következőhöz hasonló dinamikus SQL lekérdezéssel:
A futtatás dinamikus optimalizálása
Ha statikusat használ SQL, az összeállítás során el kell döntenie, hogyan szeretné összeállítani az SQL utasításokat, hogy tartalmaznak-e tippeket az utasításaiban, és ha tartalmaz tippeket, akkor pontosan melyik tippeket kell megadnia. A dinamikus SQL segítségével azonban létrehozhat egy SQL utasítást oly módon, hogy optimalizálja a végrehajtást és / vagy dinamikusan összefűzze a tippeket SQL utasítássá. Ez lehetővé teszi a tippek módosítását az aktuális adatbázis-statisztikák alapján, újrafordítás nélkül.
Például a következő eljárás a a_hint
nevű változót használja a felhasználók engedélyezésére. tipp opció átadása a SELECT
utasításnak:
Ebben a példában a felhasználó a következő értékek bármelyikét átadhatja a a_hint
:
Dinamikus PL / SQL blokkok meghívása
Használhatja a EXECUTE
IMMEDIATE
utasítás névtelen PL / SQL blokkok meghívására. A dinamikus PL / SQL blokkok meghívásának képessége hasznos lehet az alkalmazásbővítésnél és a testreszabásnál, ahol a futtatandó modult futás közben dinamikusan határozzák meg.
Tegyük fel például, hogy olyan alkalmazást szeretne írni, amely eseményt vesz igénybe számot és az esemény kezelőjéhez történő elküldést. A kezelő neve EVENT_HANDLER_
event_num formátumú, ahol az event_num az esemény száma. Az egyik megközelítés az lenne, ha a diszpécsert kapcsoló utasításként valósítanák meg, az alábbiak szerint, ahol a kód minden eseményt úgy kezel, hogy statikus hívást kezdeményez a megfelelő kezelőjének.
Ez a kód nem túl bővíthető, mert a diszpécser kódja frissíteni kell, amikor egy új esemény kezelőjét hozzáadják. A natív dinamikus SQL használatával azonban az alábbihoz hasonló kiterjeszthető esemény-diszpécsert írhat:
Dinamikus műveletek végrehajtása az Invoker-Rights használatával
Az invoker-rights szolgáltatás dinamikus használatával SQL, létrehozhat olyan alkalmazásokat, amelyek dinamikus SQL utasításokat adnak ki az invoker privilégiumaival és sémájával.Ez a két szolgáltatás, az invoker-jogok és a dinamikus SQL lehetővé teszi olyan újrafelhasználható alkalmazás-alkomponensek felépítését, amelyek képesek működni és elérni az invoker adatait és moduljait.
PL / SQL felhasználói kézikönyv és útmutató az invoker-jogok és a natív dinamikus SQL használatáról.
Dinamikus SQL-forgatókönyv natív dinamikus SQL használatával
Az ebben a szakaszban ismertetett forgatókönyv bemutatja a hatékonyságot és a rugalmasságot natív dinamikus SQL. Ez a forgatókönyv olyan példákat tartalmaz, amelyek bemutatják, hogyan hajtsa végre a következő műveleteket natív dinamikus SQL használatával:
- DDL és DML műveletek végrehajtása
- Egysoros és többsoros lekérdezések végrehajtása
Adatmodell
A jelen forgatókönyvben szereplő adatbázis a vállalat emberi erőforrás-adatbázisa (hr
néven) a következő adatmodellel :
A offices
nevű főtábla tartalmazza az összes vállalat helyének listáját. A offices
táblázat a következő definícióval rendelkezik :
Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)
Több emp_
helytábla tartalmazza az alkalmazottak adatait, ahol a hely annak a városnak a neve, ahol az iroda található Például egy emp_houston
nevű tábla a vállalat Houstoni irodájának alkalmazotti adatait tartalmazza, míg az emp_boston
nevű tábla alkalmazottat tartalmaz információk a cég bostoni irodájához.
Mindegyik emp_
helytábla a következő definícióval rendelkezik:
A következő szakaszok különféle natív dinamikus SQL műveleteket írnak le, amelyek a hr
adatokon hajthatók végre. adatbázis.
Minta DML művelet
A következő natív dinamikus SQL eljárás emelést ad minden adott munkakörrel rendelkező alkalmazottnak:
DDL művelet minta
A EXECUTE IMMEDIATE
utasítás DDL műveleteket hajthat végre. Például a következő eljárás hozzáad egy irodahelyet:
A következő eljárás törli az irodai helyet:
Dinamikus egysoros lekérdezés minta
A EXECUTE
IMMEDIATE
utasítás dinamikus egysoros lekérdezéseket hajthat végre. Megadhat kötési változókat a USING
záradékban, és behívhatja az eredményül kapott sort a utasítás INTO
záradékában megadott célba.
A következő függvény beolvassa az adott helyszínen egy adott munkát végző alkalmazottak számát:
Dinamikus többsoros lekérdezés
A OPEN-FOR
, FETCH
és CLOSE
utasítások dinamikus többsoros lekérdezéseket hajthatnak végre. Például a következő eljárás felsorolja az összes alkalmazottat, akik egy adott munkával rendelkeznek egy adott helyen:
Natív dinamikus SQL és a DBMS_SQL csomag
Az Oracle két módszert kínál a dinamikus SQL használatára a PL / SQL-en belül: natív dinamikus SQL és a DBMS_SQL
csomag. A natív dinamikus SQL segítségével dinamikus SQL utasításokat helyezhet közvetlenül a PL / SQL kódba. Ezek a dinamikus utasítások tartalmaznak DML utasításokat (beleértve a lekérdezéseket), PL / SQL névtelen blokkokat, DDL utasításokat, tranzakcióvezérlő utasításokat és munkamenet-vezérlő utasításokat.
A legtöbb natív dinamikus SQL utasítás feldolgozásához használja a EXECUTE
IMMEDIATE
utasítás. Többsoros lekérdezés (SELECT
utasítás) feldolgozásához azonban a OPEN-FOR
, FETCH
, és CLOSE
utasítások.
A natív dinamikus SQL használatához a COMPATIBLE
inicializálási paramétert 8.1.0 vagy újabb értékre kell állítani. Az COMPATIBLE
paraméterről az Oracle8i Migration című részben olvashat.
A DBMS_SQL
csomag egy PL / SQL könyvtár, amely programozási API-t kínál a dinamikusan hajtsa végre az SQL utasításokat. A DBMS_SQL
csomag programozott interfészekkel rendelkezik a kurzor megnyitásához, a kurzor elemzéséhez, kötések megadásához stb. A DBMS_SQL
csomagot használó programok hívást kezdeményeznek dinamikus SQL műveletek végrehajtásához.
A következő szakaszok részletes információkat nyújtanak mindkét módszer előnyeiről.
A PL / SQL felhasználói kézikönyve és a részletes információk a natív dinamikus SQL használatáról és az Oracle8i által szállított PL / SQL csomagok referenciája a DBMS_SQL
csomag. A PL / SQL felhasználói kézikönyvében a natív dinamikus SQL-t egyszerűen dinamikus SQL-nek nevezik.
A natív dinamikus SQL előnyei
A natív dinamikus SQL a következő előnyöket nyújtja a DBMS_SQL
csomag:
Könnyű használat
A natív dinamikus SQL használata sokkal egyszerűbb, mint a DBMS_SQL
csomag.Mivel a natív dinamikus SQL integrálva van az SQL-be, ugyanúgy használhatja, mint a statikus SQL-t a PL / SQL-kódon belül. Ezenkívül a natív dinamikus SQL kód általában kompaktabb és olvashatóbb, mint az egyenértékű kód, amely a DBMS_SQL
csomagot használja.
A DBMS_SQL
csomag használata nem olyan egyszerű, mint a natív dinamikus SQL. Számos olyan eljárás és funkció van, amelyet szigorú sorrendben kell használni. Az egyszerű műveletek végrehajtásához általában nagy mennyiségű kód szükséges, amikor a DBMS_SQL
csomagot használja. Ezt a bonyolultságot elkerülheti natív dinamikus SQL használatával.
A 8-1. Táblázat bemutatja az ugyanazon művelet végrehajtásához szükséges kód mennyiségének különbségét a DBMS_SQL
csomag és natív dinamikus SQL.
8-1. táblázat: A DBMS_SQL csomag és a natív dinamikus SQL kód összehasonlítása
Teljesítményjavítások
A natív dinamikus SQL teljesítménye PL / SQL-ben összehasonlítható a statikus SQL teljesítményével, mert a PL / SQL tolmács beépített támogatást nyújt a natív dinamikus SQL számára. Ezért a natív dinamikus SQL-t használó programok teljesítménye sokkal jobb, mint a DBMS_SQL
csomagot használó programok teljesítménye. A natív dinamikus SQL utasítások általában 1,5–3-szor jobban teljesítenek, mint a DBMS_SQL
csomagot használó egyenértékű utasítások. Természetesen a teljesítménynövekedés az alkalmazástól függően változhat.
A DBMS_SQL
csomag egy eljárási API-n alapul, és ennek következtében magas eljárási hívás és adatmásolási költségekkel jár. Például minden egyes változó megkötésekor a DBMS_SQL
csomag átmásolja a PL / SQL kötési változót a helyére, hogy később a végrehajtás során felhasználhassa. Hasonlóképpen, minden alkalommal, amikor egy lekérést végrehajt, először az adatokat átmásolja a DBMS_SQL
csomag által kezelt helyre, majd a lekérett adatokat egyenként, egy oszlopba másolja. PL / SQL változók, ami jelentős többletet eredményez az adatmásolásból. Ezzel szemben a natív dinamikus SQL a művelet előkészítési, összerendelési és végrehajtási lépéseit egyetlen műveletbe csomagolja, ami minimalizálja az adatmásolást és az eljáráshívás általános költségeit, és javítja a teljesítményt.
Teljesítménytipp
A natív dinamikus SQL vagy a DBMS_SQL
csomag használatakor javíthatja a teljesítményt a kötési változók használatával, mert a bekötési változók használatával az Oracle egyetlen kurzort oszthat meg több SQL utasításhoz.
Például a következő natív dinamikus SQL-kód nem használ kötési változókat:
Minden egyes különálló my_deptno
változóhoz új kurzor jön létre, amely erőforrás-versenyt és gyenge teljesítményt okozhat. Ehelyett kösse be a my_deptno
-t kötési változóként, mint a következő példában:
Itt ugyanazt a kurzort újra felhasználja a bind my_deptno
, ezáltal javítva a teljesítményt és a méretezhetőséget.
A felhasználó által definiált típusok támogatása
A natív dinamikus SQL támogatja a statikus SQL által támogatott összes típust a PL / SQL. Ezért a natív dinamikus SQL támogatja a felhasználó által definiált típusokat, például a felhasználó által definiált objektumokat, gyűjteményeket és REFs
. A DBMS_SQL
csomag nem támogatja ezeket a felhasználó által definiált típusokat.
A DBMS_SQL
csomag korlátozott támogatást nyújt a tömbökhöz. További információ az Oracle8i által biztosított PL / SQL csomagok kézikönyvében található.
A rekordok beolvasásának támogatása
A natív dinamikus SQL és a statikus SQL egyaránt támogatja a rekordokba való beolvasást, de A DBMS_SQL
csomag nem. A natív dinamikus SQL használatával a lekérdezés eredményeként kapott sorok közvetlenül betölthetők PL / SQL rekordokba.
A következő példában a lekérdezés sorai a emp_rec
record:
A DBMS_SQL csomag előnyei
A DBMS_SQL
csomag a következő előnyöket nyújtja a natív dinamikus SQL-hez képest:
Ügyféloldali programok támogatása
Jelenleg a DBMS_SQL
csomag támogatott az ügyféloldali programokban, de a natív dinamikus SQL nem. A DBMS_SQL
csomag minden hívása az ügyféloldali programból PL / SQL távoli eljáráshívássá (RPC) fordul; ezek a hívások akkor fordulnak elő, amikor változót kell kötni, változót definiálni vagy utasításokat végrehajtani.
A DESCRIBE támogatása
A DESCRIBE_COLUMNS
eljárás a DBMS_SQL
csomagban használható: írja le az DBMS_SQL
keresztül megnyitott és elemzett kurzor oszlopait. A funkcionalitás hasonló az SQL * Plus DESCRIBE
parancsához. A natív dinamikus SQL nem rendelkezik DESCRIBE
lehetőséggel.
A tömeges dinamikus SQL támogatása
A tömeges SQL több adatsor feldolgozásának lehetősége egyetlen DML utasításban. A tömeges SQL javítja a teljesítményt azáltal, hogy csökkenti az SQL és a gazdagép nyelv közötti váltás mértékét. Jelenleg a DBMS_SQL
csomag támogatja a tömeges dinamikus SQL-t.
Bár a natív dinamikus SQL-ben nincs közvetlen támogatás a tömeges műveletekhez, szimulálhat egy natív dinamikus tömeges SQL-t utasítás azáltal, hogy a tömeges SQL utasítást egy “BEGIN
… END
” blokkba helyezi, és a blokkot dinamikusan végrehajtja. Ez a megoldás lehetővé teszi a tömeges SQL előnyeinek kiaknázását egy natív dinamikus SQL programban. Például a következő natív dinamikus SQL-kód másolja az egyik tábla ename
oszlopát a másikba:
Több soros frissítés és törlés RETURNING záradékkal
A DBMS_SQL
csomag olyan RETURNING
záradékkal rendelkező utasításokat támogat, amelyek több sort frissítenek vagy törölnek. A natív dinamikus SQL csak egy RETURNING
záradékot támogat, ha egyetlen sort ad vissza.
“DML visszatérő példa” DBMS_SQL
csomagkód és natív dinamikus SQL-kód, amely RETURNING
záradékot használ.
32 KB-nál nagyobb SQL-utasítások támogatása
A DBMS_SQL
a csomag 32KB-nál nagyobb SQL utasításokat támogat; a natív dinamikus SQL nem.
SQL utasítások újrafelhasználása
A PARSE
eljárás a DBMS_SQL
package egyszer elemez egy SQL utasítást. A kezdeti elemzés után az utasítás többször használható különböző kötési argumentumok halmazával.
Ezzel szemben a natív dinamikus SQL minden utasítás használatakor előkészít egy SQL utasítást végrehajtásra. A kimutatások elkészítése általában elemzéssel, optimalizálással és tervkészítéssel jár. Minden egyes nyilatkozat elkészítése alkalmával kis teljesítménybüntetést von maga után. Az Oracle megosztott kurzormechanizmusa azonban minimalizálja a költségeket, és a teljesítménybüntetés általában csekély, ha összehasonlítjuk a natív dinamikus SQL teljesítményelőnyeivel.
Példák a DBMS_SQL csomagkódra és a natív dinamikus SQL kódra
Az alábbi példák a DBMS_SQL
csomag és a natív dinamikus SQL műveletek végrehajtásához szükséges kódbeli különbségeket mutatják be. Konkrétan a következő típusú példákat mutatjuk be:
- lekérdezés
- DML művelet
- DML visszatérő művelet
Általában a natív dinamikus SQL kód olvashatóbb és kompaktabb, ami javíthatja a fejlesztői termelékenységet.
Lekérdezési példa
A következő példa egy dinamikus lekérdezési utasítást tartalmaz, egy kötési változóval (:jobname
) és két kijelölt oszlop (ename
és sal
):
stmt_str := "SELECT ename, sal FROM emp WHERE job = :jobname";
Ez a példa a j ob description SALESMAN
a emp
táblázat job
oszlopában. A 8-2. Táblázat azt a mintakódot mutatja, amely ezt a lekérdezést a DBMS_SQL
csomag és a natív dinamikus SQL segítségével hajtja végre.
8-2. táblázat: Lekérdezés a DBMS_SQL csomag és a natív dinamikus SQL használatával
DML példa
A a következő példa dinamikus INSERT
utasítást tartalmaz egy három oszlopos táblához:
stmt_str := "INSERT INTO dept_new VALUES (:deptno, :dname, :loc)";
Ez a példa új sort illeszt be amelyek oszlopértékei a PL / SQL változókban találhatók: deptnumber
, deptname
és location
. A 8-3. Táblázat azt a mintakódot mutatja, amely ezt a DML műveletet a DBMS_SQL
csomag és a natív dinamikus SQL segítségével hajtja végre.
8-3. Táblázat: DML művelet a DBMS_SQL csomag és Natív dinamikus SQL
DML visszatérő példa
A következő példa dinamikus UPDATE
utasítás, amely frissíti az osztály helyét, amikor megadja az osztály számát (deptnumber
) és egy új helyet (location
), majd visszatér a részleg neve:
stmt_str := "UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname";
Ez a példa új sort illeszt be, amelynek oszlopértékei a PL / SQL változókban vannak deptnumber
, deptname
és location
. A 8-4. Táblázat azt a mintakódot mutatja be, amely ezt a DML visszatérési műveletet a DBMS_SQL
csomag és a natív dinamikus SQL segítségével hajtja végre.
8-4. Táblázat: DML visszatérési művelet a DBMS_SQL segítségével Csomag és natív dinamikus SQL
A PL / SQL kivételével más alkalmazásfejlesztési nyelvek
Az ebben a fejezetben eddig tárgyaltak a PL / SQL támogatásáról a dinamikus SQL számára.A dinamikus SQL-t használó programok megvalósításához azonban más alkalmazásfejlesztési nyelveket is használhat. Ezek az alkalmazásfejlesztési nyelvek a C / C ++, a COBOL és a Java nyelveket tartalmazzák.
A C / C ++ használata esetén dinamikus SQL-t használó alkalmazásokat fejleszthet ki az Oracle Call Interface (OCI) segítségével, vagy használhatja a Pro * C / C ++ előfordítót dinamikus SQL kiterjesztések hozzáadásához a C kód. Hasonlóképpen, ha COBOL-t használ, akkor a Pro * COBOL előfordító segítségével dinamikus SQL kiterjesztéseket adhat a COBOL-kódjához. Ha Java-t használ, olyan alkalmazásokat fejleszthet, amelyek dinamikus SQL-t használnak a JDBC-vel.
Korábban a PL / SQL-alkalmazásokban csak a csomag. A csomag használatának számos korlátozása van, beleértve a teljesítményre vonatkozó aggályokat is. Következésképpen az alkalmazásfejlesztők a PL / SQL fentebb tárgyalt alternatíváinak egyikét használták a dinamikus SQL megvalósításához. A natív dinamikus SQL PL / SQL-ben történő bevezetésével azonban a PL / SQL dinamikus SQL-hez történő felhasználásának számos hátránya megszűnik.
Ha van olyan alkalmazás, amely OCI-t használ, akkor a Pro * C / C ++ vagy Pro * COBOL a dinamikus SQL végrehajtáshoz a dinamikus SQL műveletek végrehajtásához szükséges hálózati körutak károsíthatják a teljesítményt. Mivel ezek az alkalmazások általában az ügyfeleken találhatók, több hálózati hívásra van szükség a dinamikus SQL műveletek végrehajtásához. Ha ilyen típusú alkalmazása van, fontolja meg a dinamikus SQL funkciók áthelyezését a natív dinamikus SQL-t használó PL / SQL tárolt eljárásokba és tárolt funkciókba. Ez javíthatja az alkalmazás teljesítményét, mivel a tárolt eljárások a szerveren tartózkodhatnak, ezáltal megszüntetve a hálózati általános költségeket. Ezután meghívhatja az alkalmazásból a PL / SQL tárolt eljárásokat és a tárolt függvényeket.
További információ az Oracle tárolt eljárások és tárolt függvények nem PL / SQL alkalmazásokból történő meghívásáról , lásd:
- Oracle Call Interface Programmer’s Guide
- Pro * C / C ++ Precompiler Programmer’s Guide
- Pro * COBOL Precompiler Programmer útmutatója
- Oracle8i Java által tárolt eljárások fejlesztői útmutatója