Dynaaminen SQL on ohjelmointitekniikka, jonka avulla voit luoda SQL-käskyjä dynaamisesti ajon aikana. Voit luoda yleiskäyttöisempiä, joustavampia sovelluksia dynaamisen SQL: n avulla, koska SQL-käskyn koko teksti ei ehkä ole tiedossa kokoamisen aikana. Esimerkiksi dynaamisen SQL: n avulla voit luoda menettelyn, joka toimii taulukossa, jonka nimi tiedetään vasta ajon aikana.
Oraclen aiemmissa julkaisuissa ainoa tapa ottaa dynaaminen SQL käyttöön PL / SQL-sovelluksessa oli käyttämällä DBMS_SQL
-pakettia. Oracle8i esittelee natiivin dynaamisen SQL: n, vaihtoehdon DBMS_SQL
-paketille. Natiivin dynaamisen SQL: n avulla voit sijoittaa dynaamiset SQL-lauseet suoraan PL / SQL-lohkoihin.
Tämä luku käsittelee seuraavia aiheita:
- Mikä on dynaaminen SQL?
- Milloin käyttää dynaamista SQL: ää
- dynaamista SQL-skenaariota Natiivin dynaamisen SQL: n avulla
- Natiivi dynaaminen SQL vs. DBMS_SQL-paketti
- Sovellus Kehityskielet, lukuun ottamatta PL / SQL
Mikä on dynaaminen SQL?
Dynaamisen SQL: n avulla voit kirjoittaa ohjelmia, jotka viittaavat SQL-käskyihin, joiden kokoteksti on tuntematon vasta ajon aikana. Ennen kuin keskustellaan yksityiskohtaisesti dynaamisesta SQL: stä, staattisen SQL: n selkeä määritelmä voi olla hyvä lähtökohta dynaamisen SQL: n ymmärtämiselle. Staattiset SQL-käskyt eivät muutu suorituksesta suoritukseen. Staattisten SQL-käskyjen koko teksti tunnetaan käännöksessä, mikä tarjoaa seuraavat edut:
- Onnistunut kokoaminen varmistaa, että SQL-käskyt viittaavat kelvollisiin tietokantaobjekteihin.
- Onnistunut kokoaminen varmistaa, että tarvittavat oikeudet ovat käytettävissä tietokantaobjektien käyttämiseen.
- Staattisen SQL: n suorituskyky on yleensä parempi kuin dynaaminen SQL.
Näiden etujen vuoksi sinun tulee käyttää dynaamista SQL: ää vain, jos et voi käyttää staattista SQL: tä tavoitteidesi saavuttamiseen tai jos staattisen SQL: n käyttö on hankalaa verrattuna dynaamiseen SQL: ään. Staattisella SQL: llä on kuitenkin rajoituksia, jotka voidaan voittaa dynaamisella SQL: llä. Et välttämättä aina tiedä SQL-käskyjen koko tekstiä, jotka on suoritettava PL / SQL-menettelyssä. Ohjelma saattaa hyväksyä käyttäjän syötteen, joka määrittelee suoritettavat SQL-käskyt, tai ohjelman on ehkä suoritettava käsittely, jotta voidaan määrittää oikea toimintatapa. Tällaisissa tapauksissa sinun tulisi käyttää dynaamista SQL: ää.
Harkitse esimerkiksi raportointisovellusta, joka suorittaa vakiokyselyjä taulukoille tietovarastoympäristössä, jossa tarkkaa taulukon nimeä ei tunneta ajon aikana. Jos haluat tallentaa suuren määrän tietovarastoa tehokkaasti, luot uuden taulukon joka vuosineljänneksen vuosineljänneksen laskutustietojen tallentamiseksi. Kaikilla näillä taulukoilla on täsmälleen sama määritelmä ja ne on nimetty vuosineljänneksen alkukuukauden ja -vuoden mukaan, esimerkiksi INV_01_1997
, INV_04_1997
, INV_07_1997
, INV_10_1997
, INV_01_1998
jne. Tällöin voit käyttää dynaamista Raportointisovelluksesi SQL määrittää taulukon nimen ajonaikaisesti.
Staattisen SQL: n kanssa kaikki tietojen määritystiedot, kuten taulukon määritelmät, joihin ohjelman SQL-käskyt viittaavat, on oltava tiedossa käännettäessä. Jos tietojen määritelmä muuttuu, sinun on muutettava ja käännettävä ohjelma uudelleen. Dynaamiset SQL-ohjelmat pystyvät käsittelemään tietojen määrittelytietojen muutoksia, koska SQL-käskyt voivat muuttua ”lennossa” ajon aikana. Siksi dynaaminen SQL on paljon joustavampi kuin staattinen SQL. Dynaamisen SQL: n avulla voit kirjoittaa uudelleenkäytettävää sovelluskoodia, koska koodi määrittää prosessin, joka on riippumaton käytetyistä SQL-käskyistä.
Lisäksi dynaaminen SQL antaa sinun suorittaa SQL-käskyjä, joita staattinen ei tue SQL-ohjelmat, kuten DDL-lausekkeet. Näiden lausuntojen tuki antaa sinun saavuttaa enemmän PL / SQL-ohjelmiesi avulla.
Dynaamiset SQL-ohjelmat tarkoittavat ohjelmia, jotka sisältävät dynaamisen SQL: n; tällaiset ohjelmat voivat sisältää myös staattisen SQL: n. Staattiset SQL-ohjelmat ovat ohjelmia, jotka sisältävät vain staattisen SQL: n eikä dynaamista SQL: ää.
Milloin käyttää dynaamista SQL
Käytä dynaamista SQL: ää tapauksissa, joissa staattinen SQL ei tue toiminto, jonka haluat suorittaa, tai tapauksissa, joissa et tiedä tarkkoja SQL-käskyjä, jotka on suoritettava PL / SQL-menettelyllä. Nämä SQL-käskyt voivat riippua käyttäjän syötteistä tai ne voivat riippua ohjelman tekemästä työstä. Seuraavissa osioissa kuvataan tyypillisiä tilanteita, joissa sinun tulee käyttää dynaamista SQL: ää, ja tyypillisiä ongelmia, jotka voidaan ratkaista dynaamisen SQL: n avulla.
Dynaamisten DML-lauseiden suorittaminen
Voit suorittaa dynaamisen SQL: n DML-käskyt, joissa tarkka SQL-käsky tiedetään vasta ajon aikana.Esimerkkejä, katso DML-esimerkit kohdista ”Esimerkkejä DBMS_SQL-pakettikoodista ja alkuperäisestä dynaamisesta SQL-koodista” ja ”Näyte DML-toiminnasta”.
Staattisen SQL: n tukemien lauseiden suorittaminen PL / SQL
PL / SQL: ssä et voi suorittaa seuraavan tyyppisiä lauseita staattisella SQL: llä:
- DDL-lausekkeet, kuten
CREATE
,DROP
,GRANT
jaREVOKE
- Istunnonohjauskielen (SCL) käskyt, kuten
ALTER
SESSION
jaSET
ROLE
Katso myös:Oracle8i SQL -viite lisätietoja DDL- ja SCL-käskyistä.
Käytä dynaamista SQL: ää, jos sinun on suoritettava jokin tämän tyyppisistä lausekkeista PL / SQL-lohko.
Lisäksi PL / SQL: n staattinen SQL ei salli TABLE
-lausekkeen käyttöä SELECT
lausunnot. Dynaamisessa SQL: ssä ei ole tällaista rajoitusta. Esimerkiksi seuraava PL / SQL-lohko sisältää lausekkeen SELECT
, joka käyttää lauseketta TABLE
ja natiivia dynaamista SQL:
Dynaamisten kyselyjen suorittaminen
Dynaamisen SQL: n avulla voit luoda sovelluksia, jotka suorittavat dynaamisia kyselyjä, jotka ovat kyselyitä, joiden kokoteksti tiedetään vasta ajon aikana. Monen tyyppisten sovellusten on käytettävä dynaamisia kyselyitä, mukaan lukien:
- sovellukset, joiden avulla käyttäjät voivat syöttää tai valita kyselyhakua tai lajitteluperusteita suorituksen aikana
- sovellukset, jotka antavat käyttäjille mahdollisuuden syöttää tietoja tai valitse optimointivihjeet ajon aikana
- Sovellukset, jotka kyselevät tietokannasta, jossa taulukoiden tietomäärittelyt muuttuvat jatkuvasti
- Sovellukset, jotka kyselevät tietokannasta, jossa uusia taulukoita luodaan usein
Esimerkkejä on kohdassa ”Kyselyesimerkki” ja kyselyesimerkkejä kohdassa ”Dynaaminen SQL-skenaario, joka käyttää natiivia dynaamista SQL: ää”.
Viittaa tietokantaobjekteihin, joita ei ole kokoonpanossa
Monen tyyppisten sovellusten on oltava vuorovaikutuksessa säännöllisesti tuotettujen tietojen kanssa. Esimerkiksi voi olla mahdollista määrittää tietokantataulukoiden määritelmä käännettäessä, mutta ei taulukoiden nimiä, koska uusia taulukoita luodaan säännöllisesti. Sovelluksesi on käytettävä tietoja, mutta taulukoiden tarkkoja nimiä ei voida tietää ennen ajonaikaa.
Dynaaminen SQL voi ratkaista tämän ongelman, koska dynaamisen SQL: n avulla voit odottaa ajonaikaa määritelläksesi taulukoiden nimet, joita sinun on käytettävä. Esimerkiksi ”Mikä on dynaaminen SQL?” -Kohdassa käsitellyssä tietovarastosovelluksessa uusia taulukoita luodaan joka neljännes, ja näillä taulukoilla on aina sama määritelmä. Tässä tapauksessa saatat sallia käyttäjän määrätä taulukon nimen ajon aikana seuraavan tyyppisellä dynaamisella SQL-kyselyllä:
Suorituksen optimointi dynaamisesti
Jos käytät staattista SQL, sinun on päätettävä kääntämisen aikana, kuinka haluat rakentaa SQL-lauseesi, onko lausekkeissasi vihjeitä, ja jos sisällytät vihjeitä, tarkalleen mitä vihjeitä sinulla on. Dynaamisen SQL: n avulla voit kuitenkin luoda SQL-käskyn tavalla, joka optimoi suorituksen ja / tai yhdistää vihjeet SQL-käskyyn dynaamisesti. Tämän avulla voit muuttaa vihjeitä nykyisen tietokantatilastosi perusteella ilman kääntämistä.
Esimerkiksi seuraava menettely käyttää muuttujaa nimeltä a_hint
, jotta käyttäjät voivat välittää vihjeasetus SELECT
-käskyyn:
Tässä esimerkissä käyttäjä voi välittää minkä tahansa seuraavista arvoista a_hint
:
Dynaamisten PL / SQL-lohkojen kutsuminen
Voit käyttää EXECUTE
IMMEDIATE
-lauseke anonyymien PL / SQL-lohkojen kutsumiseksi. Dynaamisten PL / SQL-lohkojen kutsumisesta voi olla hyötyä sovellusten laajennuksissa ja mukautuksissa, joissa suoritettava moduuli määritetään dynaamisesti ajon aikana.
Oletetaan esimerkiksi, että haluat kirjoittaa sovelluksen, joka ottaa tapahtuman numero ja lähetykset tapahtuman käsittelijälle. Käsittelijän nimi on muodossa EVENT_HANDLER_
event_num, jossa event_num on tapahtuman numero. Yksi lähestymistapa olisi toteuttaa välittäjä kytkinlausekkeena, kuten alla on esitetty, jossa koodi käsittelee jokaisen tapahtuman soittamalla staattisen puhelun asianomaiselle käsittelijälle.
Tämä koodi ei ole kovin laajennettavissa, koska lähettäjän koodi on päivitettävä aina, kun uuden tapahtuman käsittelijä lisätään. Natiivin dynaamisen SQL: n avulla voit kuitenkin kirjoittaa seuraavanlaisen laajennettavan tapahtumien lähettäjän:
Dynaamisten toimintojen suorittaminen Invoker-Rightsin avulla
Käyttämällä invoker-rights-ominaisuutta dynaamisen kanssa SQL, voit rakentaa sovelluksia, jotka antavat dynaamisia SQL-lauseita invokerin etuoikeuksien ja skeeman alla.Nämä kaksi ominaisuutta, invoker-oikeudet ja dynaaminen SQL, mahdollistavat uudelleenkäytettävien sovellusten alikomponenttien rakentamisen, jotka voivat toimia ja käyttää invokerin tietoja ja moduuleja.
PL / SQL-käyttäjän opas ja viite lisätietoja kutsuttajien oikeuksien ja alkuperäisen dynaamisen SQL: n käytöstä.
Dynaaminen SQL-skenaario, joka käyttää omaa dynaamista SQL: ää
Tässä osassa kuvattu skenaario kuvaa tehoa ja joustavuutta alkuperäisen dynaamisen SQL: n. Tämä skenaario sisältää esimerkkejä, jotka osoittavat, kuinka voit suorittaa seuraavat toiminnot alkuperäisen dynaamisen SQL: n avulla:
- Suorita DDL- ja DML-toiminnot
- Suorita yhden rivin ja monirivikyselyt
tietomalli
Tämän skenaarion tietokanta on yrityksen henkilöstötietokanta (nimeltään hr
), jolla on seuraava tietomalli :
Päätaulukko nimeltä offices
sisältää luettelon kaikista yrityksen sijainneista. Taulukolla offices
on seuraava määritelmä :
Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)
Useat emp_
sijaintitaulukot sisältävät työntekijätiedot, missä sijainti on sen kaupungin nimi, jossa toimisto Esimerkiksi taulukko nimeltä emp_houston
sisältää yrityksen Houstonin toimiston työntekijätiedot, kun taas taulukko nimeltä emp_boston
sisältää työntekijän tietoja yrityksen Bostonin toimistosta.
Jokainen emp_
sijaintitaulukolla on seuraava määritelmä:
Seuraavissa osioissa kuvataan erilaisia alkuperäisiä dynaamisia SQL-toimintoja, jotka voidaan suorittaa hr
tietokanta.
DML-esimerkkitoiminto
Seuraava natiivi dynaaminen SQL-menettely antaa korotuksen kaikille työntekijöille, joilla on tietty työnimike:
DDL-esimerkkitoiminta
Lauseke EXECUTE IMMEDIATE
voi suorittaa DDL-operaatioita. Esimerkiksi seuraava menettely lisää toimiston sijainnin:
Seuraava toimenpide poistaa toimiston sijainnin:
Dynaaminen yksirivinen kysely
EXECUTE
IMMEDIATE
-lauseke voi suorittaa dynaamisia yksirivisiä kyselyitä. Voit määrittää sidontamuuttujat lausekkeessa USING
ja hakea tuloksena olevan rivin lauseen INTO
-lausekkeessa määritettyyn kohteeseen.
Seuraava toiminto hakee tietystä sijainnista tiettyä työtä suorittavien työntekijöiden määrän:
Dynaaminen monirivinen kysely
OPEN-FOR
, FETCH
ja CLOSE
lauseet voivat suorittaa dynaamisia monirivisiä kyselyitä. Esimerkiksi seuraavassa menettelyssä luetellaan kaikki työntekijät, joilla on tietty työ määrätyssä paikassa:
Native Dynamic SQL vs. DBMS_SQL-paketti
Oracle tarjoaa kaksi tapaa käyttää dynaamista SQL: ää PL / SQL: ssä: natiivi dynaaminen SQL ja DBMS_SQL
-paketti. Natiivin dynaamisen SQL: n avulla voit sijoittaa dynaamiset SQL-käskyt suoraan PL / SQL-koodiin. Nämä dynaamiset lauseet sisältävät DML-käskyjä (mukaan lukien kyselyt), PL / SQL-nimettömiä lohkoja, DDL-käskyjä, tapahtumien hallinta-lauseita ja istunnon ohjauslausekkeita.
Voit käsitellä useimpia natiivia dynaamisia SQL-lauseita käyttämällä = ”c304b268a8”> IMMEDIATE
-lauseke. Jos haluat käsitellä monirivistä kyselyä (SELECT
-lauseke), käytä OPEN-FOR
, FETCH
– ja CLOSE
-lausekkeet.
Jos haluat käyttää natiivia dynaamista SQL: ää, COMPATIBLE
-alustusparametriksi on asetettava 8.1.0 tai uudempi. Katso lisätietoja COMPATIBLE
-parametrista kohdasta Oracle8i Migration.
DBMS_SQL
-paketti on PL / SQL-kirjasto, joka tarjoaa ohjelmallisen sovellusliittymän Suorita SQL-lauseet dynaamisesti. Paketissa DBMS_SQL
on ohjelmallisia käyttöliittymiä kohdistimen avaamiseen, kohdistimen jäsentämiseen, sidontaan jne. Ohjelmat, jotka käyttävät pakettia DBMS_SQL
, soittavat tähän pakettiin dynaamisten SQL-toimintojen suorittamiseksi.
Seuraavissa osissa on yksityiskohtaista tietoa molempien menetelmien eduista.
PL / SQL-käyttäjän oppaassa ja viitteessä on yksityiskohtaista tietoa alkuperäisen dynaamisen SQL: n ja Oracle8in toimittamien PL / SQL-pakettien viitteestä. div id = ”2890d77e7e”>
-paketti. PL / SQL-käyttäjän oppaassa natiiviin dynaamiseen SQL: ään viitataan yksinkertaisesti dynaamisena SQL: nä.
Natiivin dynaamisen SQL: n edut
Natiivi dynaaminen SQL tarjoaa seuraavat edut DBMS_SQL
-paketti:
Helppokäyttöisyys
Natiivin dynaamisen SQL: n käyttö on paljon yksinkertaisempaa kuin paketin DBMS_SQL
.Koska alkuperäinen dynaaminen SQL on integroitu SQL: ään, voit käyttää sitä samalla tavalla kuin tällä hetkellä staattista SQL: ää PL / SQL-koodissa. Lisäksi natiivi dynaaminen SQL-koodi on yleensä kompaktimpi ja luettavampi kuin vastaava koodi, joka käyttää pakettia DBMS_SQL
.
DBMS_SQL
-pakettia ei ole yhtä helppokäyttöinen kuin alkuperäinen dynaaminen SQL. On olemassa monia menettelyjä ja toimintoja, joita on käytettävä tiukassa järjestyksessä. Yleensä yksinkertaisten toimintojen suorittaminen vaatii suuren määrän koodia, kun käytät pakettia DBMS_SQL
. Voit välttää tämän monimutkaisuuden käyttämällä sen sijaan natiivia dynaamista SQL: ää.
Taulukko 8-1 kuvaa eron koodin määrässä, joka vaaditaan saman toiminnon suorittamiseen DBMS_SQL
paketti ja natiivi dynaaminen SQL.
Taulukko 8-1 DBMS_SQL-paketin ja alkuperäisen dynaamisen SQL-koodin vertailu
Suorituskyvyn parannukset
Natiivin dynaamisen SQL: n suorituskyky PL / SQL: ssä on verrattavissa staattisen SQL: n suorituskykyyn, koska PL / SQL-tulkkissa on sisäänrakennettu tuki natiiville dynaamiselle SQL: lle. Siksi natiivia dynaamista SQL: ää käyttävien ohjelmien suorituskyky on paljon parempi kuin ohjelmien, jotka käyttävät pakettia DBMS_SQL
. Tyypillisesti natiivien dynaamisten SQL-käskyjen suorituskyky on 1,5–3 kertaa parempi kuin vastaavilla käskyillä, jotka käyttävät pakettia DBMS_SQL
. Suorituskykyparannuksesi voivat tietysti vaihdella sovelluksestasi riippuen.
DBMS_SQL
-paketti perustuu proseduurisovellusliittymään ja siitä johtuen aiheuttaa suurten menettelyjen puhelun ja datakopioiden yleiskustannukset. Esimerkiksi aina, kun sidot muuttujan, paketti DBMS_SQL
kopioi PL / SQL-sidosmuuttujan tilaansa myöhempää käyttöä varten suorituksen aikana. Vastaavasti joka kerta, kun suoritat haun, tiedot kopioidaan ensin DBMS_SQL
-paketin hallinnoimaan tilaan ja haetut tiedot kopioidaan sitten sarake kerrallaan sopivaan tilaan. PL / SQL-muuttujat, mikä johtaa huomattaviin yleiskustannuksiin tietojen kopioinnista. Sitä vastoin natiivi dynaaminen SQL niputtaa käskyjen valmistelun, sitomisen ja suorittamisen vaiheet yhdeksi toiminnoksi, mikä minimoi tiedon kopioinnin ja menettelykutsupyynnöt ja parantaa suorituskykyä.
Suorituskyky Vihje
Kun käytät joko alkuperäistä dynaamista SQL-koodia tai DBMS_SQL
-pakettia, voit parantaa suorituskykyä käyttämällä sidosmuuttujia, koska sidontamuuttujien avulla Oracle voi jakaa yhden kohdistimen useille SQL-käskyille.
Esimerkiksi seuraava natiivi dynaaminen SQL-koodi ei käytä sitovia muuttujia:
Jokaiselle erilliselle my_deptno
muuttujalle luodaan uusi kohdistin, joka voi aiheuttaa resurssikilpailuja ja heikkoa suorituskykyä. Sen sijaan sido my_deptno
sidontamuuttujana, kuten seuraavassa esimerkissä:
Tässä käytetään samaa kohdistinta uudelleen sidonnan eri arvoihin my_deptno
, mikä parantaa suorituskykyä ja skaalautuvuutta.
Tuki käyttäjän määrittelemille tyypeille
Natiivi dynaaminen SQL tukee kaikkia staattisen SQL: n tukemia tyyppejä PL / SQL. Siksi natiivi dynaaminen SQL tukee käyttäjän määrittelemiä tyyppejä, kuten käyttäjän määrittelemiä objekteja, kokoelmia ja REFs
. DBMS_SQL
-paketti ei tue näitä käyttäjän määrittelemiä tyyppejä.
DBMS_SQL
-paketti tarjoaa rajoitettua tukea taulukoille. Katso lisätietoja Oracle8in toimittamista PL / SQL-pakettien ohjeista.
Tietueiden hakemisen tuki
Natiivi dynaaminen SQL ja staattinen SQL tukevat molemmat tietueisiin hakemista, mutta DBMS_SQL
-paketti ei. Natiivin dynaamisen SQL: n avulla kyselystä johtuvat rivit voidaan noutaa suoraan PL / SQL-tietueisiin.
Seuraavassa esimerkissä kyselyn rivit haetaan emp_rec
tietue:
DBMS_SQL-paketin edut
Paketti DBMS_SQL
tarjoaa seuraavat edut natiiviin dynaamiseen SQL: ään verrattuna:
Asiakaspuolen ohjelmien tuki
DBMS_SQL
-pakettia tuetaan tällä hetkellä asiakaspuolen ohjelmissa, mutta natiivi dynaaminen SQL ei. Jokainen asiakaspalvelupuolen DBMS_SQL
-paketin kutsu kääntyy PL / SQL-kaukosäätimen kutsuksi (RPC); nämä puhelut tapahtuvat, kun joudut sitomaan muuttujan, määrittelemään muuttujan tai suorittamaan käskyn.
DESCRIBE-tuki
DESCRIBE_COLUMNS
-toimintoa DBMS_SQL
-paketissa voidaan käyttää kuvaa sarakkeita avatulle ja jäsennetylle kohdistimelle DBMS_SQL
-kohdassa. Toiminnot ovat samanlaisia kuin SQL * Plus: n DESCRIBE
-komennossa. Natiivilla dynaamisella SQL: llä ei ole DESCRIBE
-toimintoa.
Joustavan dynaamisen SQL-tuen käyttö
Joukkotiedosto-SQL on kyky käsitellä useita tietorivejä yhdessä DML-käskyssä. Bulk SQL parantaa suorituskykyä vähentämällä kontekstinvaihtoa SQL: n ja isäntäkielen välillä. Tällä hetkellä DBMS_SQL
-paketti tukee dynaamista massakoodausta.
Vaikka alkuperäisessä dynaamisessa SQL: ssä ei ole suoraa tukea joukkotoiminnoille, voit simuloida natiivia dynaamista joukkos SQL laittamalla SQL-joukkolauseke joukkoon ”BEGIN
… END
” ja suorittamalla lohko dynaamisesti. Tämän kiertotavan avulla voit ymmärtää joukkomuotoisen SQL-edut natiivissa dynaamisessa SQL-ohjelmassa. Esimerkiksi seuraava alkuperäinen dynaaminen SQL-koodi kopioi taulukon ename
-sarakkeen toiseen:
Useiden rivien päivitykset ja poistot PALAUTUSlausekkeella
Paketti DBMS_SQL
tukee lauseita RETURNING
, jotka päivittävät tai poistavat useita rivejä. Natiivi dynaaminen SQL tukee RETURNING
-lauseketta vain, jos yksi rivi palautetaan.
”DML-palautusesimerkki” esimerkkejä DBMS_SQL
-pakettikoodi ja natiivi dynaaminen SQL-koodi, joka käyttää lauseketta RETURNING
.
Tuki yli 32 kt: n SQL-lauseille
DBMS_SQL
paketti tukee yli 32 kt: n SQL-käskyjä; natiivi dynaaminen SQL ei.
SQL-lauseiden uudelleenkäyttö
PARSE
-prosessi DBMS_SQL
-paketti jäsentää SQL-käskyn kerran. Ensimmäisen jäsentämisen jälkeen lausetta voidaan käyttää useita kertoja erilaisilla sidosargumenteilla.
Natiivi dynaaminen SQL sen sijaan valmistelee SQL-käskyn suoritettavaksi joka kerta, kun käskyä käytetään. Lausekkeiden valmisteluun kuuluu tyypillisesti jäsentäminen, optimointi ja suunnitelman luominen. Lausunnon valmistamisesta joka kerta, kun sitä käytetään, seurauksena on pieni suoritussakko. Oraclen jaettu kohdistinmekanismi minimoi kuitenkin kustannukset, ja suorituskyvyn rangaistus on tyypillisesti triviaali verrattuna alkuperäisen dynaamisen SQL: n suorituskykyeduihin.
Esimerkkejä DBMS_SQL-pakettikoodista ja alkuperäisestä dynaamisesta SQL-koodista
Seuraavat esimerkit havainnollistavat koodin eroja, jotka ovat välttämättömiä toimintojen suorittamiseksi paketin DBMS_SQL
ja alkuperäisen dynaamisen SQL: n kanssa. Erityisesti seuraavat tyypit esitetään:
- Kysely
- DML-operaatio
- DML-palautusoperaatio
Yleensä natiivi dynaaminen SQL-koodi on helpommin luettavissa ja kompakti, mikä voi parantaa kehittäjien tuottavuutta.
Kyselyesimerkki
Seuraava esimerkki sisältää dynaamisen kyselylausekkeen yhdellä sidontamuuttujalla (:jobname
) ja kaksi valintasaraketta (ename
ja sal
):
stmt_str := "SELECT ename, sal FROM emp WHERE job = :jobname";
Tämä esimerkki kysyy työntekijöiltä, joilla on j ob description SALESMAN
job
-sarakkeessa emp
-taulukossa. Taulukko 8-2 näyttää esimerkkikoodin, joka suorittaa tämän kyselyn käyttämällä DBMS_SQL
-pakettia ja natiivia dynaamista SQL: ää.
Taulukko 8-2 Kysely DBMS_SQL-paketin ja alkuperäisen dynaamisen SQL: n avulla
DML-esimerkki
seuraava esimerkki sisältää dynaamisen INSERT
-lausekkeen taulukolle, jossa on kolme saraketta:
stmt_str := "INSERT INTO dept_new VALUES (:deptno, :dname, :loc)";
Tämä esimerkki lisää uuden rivin joiden sarakearvot ovat PL / SQL-muuttujissa deptnumber
, deptname
ja location
. Taulukossa 8-3 on esimerkkikoodi, joka suorittaa tämän DML-operaation DBMS_SQL
-paketin ja alkuperäisen dynaamisen SQL: n avulla.
Taulukko 8-3 DML-käyttö DBMS_SQL-paketin ja Natiivi dynaaminen SQL
DML-paluuesimerkki
Seuraava esimerkki sisältää dynaamisen UPDATE
lause, joka päivittää osaston sijainnin, kun sille annetaan osaston numero (deptnumber
) ja uusi sijainti (location
), ja palaa sitten osaston nimi:
stmt_str := "UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname";
Tämä esimerkki lisää uuden rivin, jonka sarakearvot ovat PL / SQL-muuttujissa deptnumber
, deptname
ja location
. Taulukossa 8-4 on esimerkkikoodi, joka suorittaa tämän DML-palautustoiminnon käyttämällä DBMS_SQL
-pakettia ja natiivia dynaamista SQL: ää.
Taulukko 8-4 DML-palautustoiminto DBMS_SQL: n avulla Paketti ja alkuperäinen dynaaminen SQL
Muut kuin PL / SQL-sovelluskehityskielet
Tämän luvun keskustelu on toistaiseksi ollut noin PL / SQL-tuki dynaamiselle SQL: lle.Voit kuitenkin käyttää muita sovelluskehityskieliä dynaamista SQL: ää käyttävien ohjelmien toteuttamiseen. Näitä sovelluskehityskieliä ovat C / C ++, COBOL ja Java.
Jos käytät C / C ++: ta, voit kehittää sovelluksia, jotka käyttävät dynaamista SQL: ää Oracle Call Interface (OCI) -palvelun kanssa, tai voit käyttää Pro * C / C ++ -esikääntäjää dynaamisten SQL-laajennusten lisäämiseen C: hen. koodi. Vastaavasti, jos käytät COBOLia, voit käyttää Pro * COBOL-esikääntäjää lisäämään dynaamisia SQL-laajennuksia COBOL-koodiin. Jos käytät Java-ohjelmaa, voit kehittää sovelluksia, jotka käyttävät dynaamista SQL: ää JDBC: n kanssa.
Aiemmin ainoa tapa käyttää dynaamista SQL: ää PL / SQL-sovelluksissa oli DBMS_SQL
-paketti. Tämän paketin käytössä on useita rajoituksia, mukaan lukien suorituskykyongelmat. Näin ollen sovelluskehittäjät ovat saattaneet käyttää yhtä PL / SQL: n yllä mainituista vaihtoehdoista dynaamisen SQL: n toteuttamiseksi. Kuitenkin, kun PL / SQL: ssä otetaan käyttöön natiivi dynaaminen SQL, monet PL / SQL: n käytön dynaamiseen SQL: ään haittapuolista on nyt poistettu.
Jos sinulla on sovellus, joka käyttää OCI: tä, Pro * C / C ++ tai Pro * COBOL dynaamiseen SQL-suoritukseen, dynaamisten SQL-operaatioiden suorittamiseen tarvittavat verkon kiertomatkat voivat vahingoittaa suorituskykyä. Koska nämä sovellukset sijaitsevat yleensä asiakkailla, dynaamisten SQL-toimintojen suorittamiseen tarvitaan enemmän verkkopuheluja. Jos sinulla on tämän tyyppinen sovellus, harkitse dynaamisen SQL-toiminnon siirtämistä tallennettuihin menettelyihin ja PL / SQL: ään tallennettuihin toimintoihin, jotka käyttävät natiivia dynaamista SQL: ää. Se saattaa parantaa sovelluksesi suorituskykyä, koska tallennetut menettelyt voivat sijaita palvelimella, mikä eliminoi verkon yleiskustannukset. Tämän jälkeen voit soittaa PL / SQL-tallennettuihin menettelyihin ja tallennettuihin toimintoihin sovelluksesta.
Lisätietoja Oraclen tallennettujen toimintojen ja tallennettujen toimintojen kutsumisesta muista kuin PL / SQL-sovelluksista , katso:
- Oracle Call Interface Programmer’s Guide
- Pro * C / C ++ Precompiler Programmer’s Guide
- Pro * COBOL Precompiler Programmer Opas
- Oracle8i Java Stored Procedures -kehittäjän opas