Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Bár a statikus SQL sok esetben jól működik, van egy olyan alkalmazásosztály, amelyben az adathozzáférés előre nem határozható meg. Tegyük fel például, hogy egy számolótábla lehetővé teszi a felhasználó számára, hogy beírjon egy lekérdezést, amelyet a számolótábla ezután elküld a DBMS-nek az adatok lekéréséhez. A lekérdezés tartalma nyilvánvalóan nem ismert a programozó számára a számolótábla program írásakor.
Dinamikus végrehajtás
A probléma megoldásához a számolótábla egy dinamikus SQL nevű beágyazott SQL-t használ. A programban keményen kódolt statikus SQL-utasításoktól eltérően a dinamikus SQL-utasítások futásidőben hozhatók létre, és egy sztringgazdaváltozóba helyezhetők. Ezután a rendszer feldolgozás céljából elküldi őket a DBMS-nek. Mivel a DBMS-nek futásidőben létre kell hoznia egy hozzáférési tervet a dinamikus SQL-utasításokhoz, a dinamikus SQL általában lassabb, mint a statikus SQL. Dinamikus SQL-utasításokat tartalmazó program fordításakor a dinamikus SQL-utasítások nem lesznek eltávolítva a programból, mint a statikus SQL-ben. Ehelyett egy függvényhívás váltja fel őket, amely átadja az utasítást a DBMS-nek; az ugyanabban a programban lévő statikus SQL-utasításokat a rendszer normál módon kezeli.
A dinamikus SQL-utasítások végrehajtásának legegyszerűbb módja az EXECUTE IMMEDIATE utasítás. Ez az utasítás átadja az SQL-utasítást a DBMS-nek fordítás és végrehajtás céljából.
Az EXECUTE IMMEDIATE utasítás egyik hátránya, hogy a DBMS-nek végig kell haladnia az SQL-utasítás feldolgozásának minden egyes lépésén az utasítás végrehajtásakor. A folyamat többletterhelése jelentős lehet, ha sok utasítást dinamikusan hajtanak végre, és pazarló, ha ezek az utasítások hasonlóak.
Előkészített végrehajtás
A fenti helyzet megoldásához a dinamikus SQL az előkészített végrehajtás nevű optimalizált végrehajtási formát kínálja, amely a következő lépéseket követi:
A program egy SQL-utasítást hoz létre egy pufferben, ugyanúgy, mint az EXECUTE IMMEDIATE utasítás esetében. Gazdagépváltozók helyett kérdőjel (?) helyettesíthető egy állandóval az utasítás szövegében bárhol, jelezve, hogy az állandó értéke később lesz megadva. A kérdőjelet paraméterjelölőnek nevezik.
A program egy PREPARE utasítással továbbítja az SQL-utasítást a DBMS-nek, amely azt kéri, hogy a DBMS elemezze, ellenőrizze és optimalizálja az utasítást, és hozzon létre egy végrehajtási tervet. A program ezután egy EXECUTE utasítást (nem AZ EXECUTE IMMEDIATE utasítást) használ a PREPARE utasítás későbbi végrehajtásához. Az utasítás paraméterértékét egy speciális adatstruktúrán, az SQL Data Area-en vagy az SQLDA-on keresztül adja át.
A program többször is használhatja az EXECUTE utasítást, és minden egyes dinamikus utasítás végrehajtásakor különböző paraméterértékeket ad meg.
Az előkészített végrehajtás még mindig nem ugyanaz, mint a statikus SQL. A statikus SQL-ben az SQL-utasítás feldolgozásának első négy lépése fordításkor történik. Az előkészített végrehajtás során ezek a lépések továbbra is a futtatás során történnek, de csak egyszer hajtódnak végre. A terv végrehajtása csak az EXECUTE meghívásra kerülése esetén történik. Ez a viselkedés segít kiküszöbölni a dinamikus SQL architektúrájában rejlő teljesítménybeli hátrányok némelyikét.