8 Dynamische SQL

Dynamische SQL is een programmeertechniek waarmee u tijdens runtime dynamisch SQL-instructies kunt bouwen. U kunt meer algemene, flexibele toepassingen maken door dynamische SQL te gebruiken, omdat de volledige tekst van een SQL-instructie mogelijk onbekend is bij het compileren. Met dynamische SQL kunt u bijvoorbeeld een procedure maken die werkt op een tabel waarvan de naam pas tijdens runtime bekend is.

In eerdere releases van Oracle was de enige manier om dynamische SQL in een PL / SQL-toepassing te implementeren door het DBMS_SQL -pakket te gebruiken. Oracle8i introduceert native dynamische SQL, een alternatief voor het DBMS_SQL -pakket. Met behulp van native dynamische SQL kunt u dynamische SQL-instructies rechtstreeks in PL / SQL-blokken plaatsen.

Dit hoofdstuk behandelt de volgende onderwerpen:

  • Wat is dynamische SQL?
  • Wanneer dynamische SQL gebruiken
  • Een dynamisch SQL-scenario met native dynamische SQL
  • Native Dynamic SQL versus het DBMS_SQL-pakket
  • Applicatie Ontwikkeltalen anders dan PL / SQL

Wat is dynamische SQL?

Dynamic SQL stelt u in staat om programma’s te schrijven die verwijzen naar SQL-instructies waarvan de volledige tekst pas bekend is tijdens runtime. Voordat dynamische SQL in detail wordt besproken, kan een duidelijke definitie van statische SQL een goed uitgangspunt zijn voor het begrijpen van dynamische SQL. Statische SQL-instructies veranderen niet van uitvoering tot uitvoering. De volledige tekst van statische SQL-instructies is bekend bij het compileren, wat de volgende voordelen biedt:

  • Succesvolle compilatie verifieert dat de SQL-instructies verwijzen naar geldige databaseobjecten.
  • Succesvolle compilatie verifieert dat de benodigde rechten aanwezig zijn om toegang te krijgen tot de databaseobjecten.
  • De prestaties van statische SQL zijn over het algemeen beter dan die van dynamische SQL.

Vanwege deze voordelen moet u dynamische SQL alleen gebruiken als u geen statische SQL kunt gebruiken om uw doelen te bereiken, of als het gebruik van statische SQL omslachtig is in vergelijking met dynamische SQL. Statische SQL heeft echter beperkingen die kunnen worden overwonnen met dynamische SQL. Mogelijk kent u niet altijd de volledige tekst van de SQL-instructies die in een PL / SQL-procedure moeten worden uitgevoerd. Mogelijk accepteert uw programma gebruikersinvoer die de uit te voeren SQL-instructies definieert, of het kan zijn dat uw programma wat verwerkingswerkzaamheden moet voltooien om de juiste actie te bepalen. In dergelijke gevallen moet u dynamische SQL gebruiken.

Denk bijvoorbeeld aan een rapportagetoepassing die standaardquery’s uitvoert op tabellen in een datawarehouse-omgeving waar de exacte tabelnaam tot aan runtime onbekend is. Om de grote hoeveelheid data in het datawarehouse efficiënt op te vangen, maakt u elk kwartaal een nieuwe tabel om de factuurgegevens voor het kwartaal op te slaan. Deze tabellen hebben allemaal exact dezelfde definitie en krijgen een naam volgens de beginmaand en het jaar van het kwartaal, bijvoorbeeld INV_01_1997, INV_04_1997, INV_07_1997, INV_10_1997, INV_01_1998, enz. In dat geval kunt u dynamische SQL in uw rapportagetoepassing om de tabelnaam tijdens runtime op te geven.

Met statische SQL moet alle gegevensdefinitie-informatie, zoals tabeldefinities, waarnaar wordt verwezen door de SQL-instructies in uw programma bekend zijn bij het compileren. Als de gegevensdefinitie verandert, moet u het programma wijzigen en opnieuw compileren. Dynamische SQL-programma’s kunnen veranderingen in gegevensdefinitie-informatie verwerken, omdat de SQL-instructies tijdens runtime “on the fly” kunnen veranderen. Daarom is dynamische SQL veel flexibeler dan statische SQL. Met dynamische SQL kunt u toepassingscode schrijven die herbruikbaar is, omdat de code een proces definieert dat onafhankelijk is van de specifieke gebruikte SQL-instructies.

Bovendien kunt u met dynamische SQL SQL-instructies uitvoeren die niet worden ondersteund in statische SQL-programma’s, zoals DDL-instructies (Data Definition Language). Ondersteuning voor deze verklaringen stelt u in staat meer te bereiken met uw PL / SQL-programma’s.

Opmerking:

De term dynamische SQL-programma’s betekent programma’s die dynamische SQL bevatten; dergelijke programma’s kunnen ook statische SQL bevatten. Statische SQL-programma’s zijn die programma’s die alleen statische SQL bevatten en geen dynamische SQL.

Wanneer moet u dynamische SQL gebruiken

U moet dynamische SQL gebruiken in gevallen waarin statische SQL de bewerking die u wilt uitvoeren, of in gevallen waarin u niet de exacte SQL-instructies kent die moeten worden uitgevoerd door een PL / SQL-procedure. Deze SQL-instructies kunnen afhankelijk zijn van gebruikersinvoer, of ze kunnen afhankelijk zijn van verwerkingswerkzaamheden door het programma. De volgende secties beschrijven typische situaties waarin u dynamische SQL zou moeten gebruiken en typische problemen die kunnen worden opgelost door dynamische SQL te gebruiken.

Dynamische DML-instructies uitvoeren

U kunt dynamische SQL gebruiken om uit te voeren DML-instructies waarin de exacte SQL-instructie pas bekend is tijdens runtime.Zie voor voorbeelden de DML-voorbeelden in de “Voorbeelden van DBMS_SQL-pakketcode en native dynamische SQL-code” en “Voorbeeld van DML-bewerking”.

Uitvoeren van verklaringen die niet worden ondersteund door statische SQL in PL / SQL

In PL / SQL kunt u de volgende typen instructies niet uitvoeren met statische SQL:

  • Data definition language (DDL) -instructies, zoals CREATE, DROP, GRANT en REVOKE
  • Session Control Language (SCL) -instructies, zoals ALTER SESSION en SET ROLE
    Zie ook:

    Oracle8i SQL Reference voor informatie over DDL- en SCL-statements.

Gebruik dynamische SQL als u een van deze soorten instructies binnen een PL / SQL-blok.

Bovendien staat statische SQL in PL / SQL het gebruik van de TABLE -clausule in de SELECT verklaringen. Er is geen dergelijke beperking in dynamische SQL. Het volgende PL / SQL-blok bevat bijvoorbeeld een SELECT -instructie die de TABLE -clausule en native dynamische SQL gebruikt:

Dynamische query’s uitvoeren

U kunt dynamische SQL gebruiken om toepassingen te maken die dynamische query’s uitvoeren, dit zijn query’s waarvan de volledige tekst pas bekend is tijdens runtime. Veel soorten applicaties hebben dynamische queries nodig, waaronder:

  • Applicaties waarmee gebruikers zoekcriteria voor zoekopdrachten of sorteercriteria kunnen invoeren of kiezen tijdens runtime
  • Applicaties waarmee gebruikers kunnen invoeren of kies optimalisatiehints tijdens runtime
  • Applicaties die een database opvragen waar de gegevensdefinities van tabellen voortdurend veranderen
  • Applicaties die een database opvragen waar vaak nieuwe tabellen worden gemaakt

Zie voor voorbeelden “Queryvoorbeeld” en bekijk de queryvoorbeelden in “Een dynamisch SQL-scenario met native dynamische SQL”.

Verwijzen naar databaseobjecten die niet bestaan bij compilatie

Veel soorten applicaties moeten interactie hebben met gegevens die periodiek worden gegenereerd. Het kan bijvoorbeeld mogelijk zijn om de definitie van de databasetabellen bij compilatie te bepalen, maar niet de namen van de tabellen, omdat er periodiek nieuwe tabellen worden gegenereerd. Uw toepassing heeft toegang tot de gegevens nodig, maar er is geen manier om de exacte namen van de tabellen te weten tot aan de runtime.

Dynamic SQL kan dit probleem oplossen, omdat u met Dynamic SQL kunt wachten tot runtime om de tabelnamen waartoe u toegang moet hebben. In de voorbeeld-datawarehouse-toepassing die wordt besproken in “Wat is dynamische SQL?”, Worden bijvoorbeeld elk kwartaal nieuwe tabellen gegenereerd en hebben deze tabellen altijd dezelfde definitie. In dit geval kunt u een gebruiker toestaan de naam van de tabel tijdens runtime op te geven met een dynamische SQL-query die lijkt op de volgende:

Uitvoering dynamisch optimaliseren

Als u statische SQL, u moet bij het compileren beslissen hoe u uw SQL-statements wilt construeren, of u hints in uw statements wilt hebben en, als u hints opneemt, welke hints u precies wilt hebben. U kunt echter dynamische SQL gebruiken om een SQL-instructie op te bouwen op een manier die de uitvoering optimaliseert en / of de hints dynamisch samenvoegt tot een SQL-instructie. Hierdoor kunt u de hints wijzigen op basis van uw huidige databasestatistieken, zonder dat u opnieuw hoeft te compileren.

De volgende procedure gebruikt bijvoorbeeld een variabele met de naam a_hint om gebruikers toe te staan om een hintoptie door te geven aan de SELECT instructie:

In dit voorbeeld kan de gebruiker een van de volgende waarden doorgeven voor a_hint:

Om dynamische PL / SQL-blokken aan te roepen

U kunt de EXECUTE IMMEDIATE statement om anonieme PL / SQL-blokken aan te roepen. De mogelijkheid om dynamische PL / SQL-blokken aan te roepen kan handig zijn voor applicatie-uitbreiding en aanpassing waarbij de uit te voeren module dynamisch wordt bepaald tijdens runtime.

Stel dat u een applicatie wilt schrijven die een gebeurtenis accepteert nummer en verzendt naar een handler voor de gebeurtenis. De naam van de handler heeft de vorm EVENT_HANDLER_ event_num, waarbij event_num het nummer van de gebeurtenis is. Een benadering zou zijn om de dispatcher te implementeren als een switch-instructie, zoals hieronder wordt getoond, waarbij de code elke gebeurtenis afhandelt door een statische aanroep naar de juiste handler.

Deze code is niet erg uitbreidbaar omdat de dispatcher-code moet worden bijgewerkt wanneer een handler voor een nieuwe gebeurtenis wordt toegevoegd. Als u echter native dynamische SQL gebruikt, kunt u een uitbreidbare gebeurtenisverzender schrijven die lijkt op de volgende:

Dynamische bewerkingen uitvoeren met Invoker-rechten

Door de functie invoker-rechten te gebruiken met dynamische SQL, u kunt applicaties bouwen die dynamische SQL-instructies uitgeven onder de rechten en het schema van de aanvaller.Deze twee functies, invoker-rechten en dynamische SQL, stellen je in staat herbruikbare subcomponenten van applicaties te bouwen die kunnen werken met en toegang hebben tot de gegevens en modules van de invoker.

Zie ook:

PL / SQL User’s Guide and Reference voor informatie over het gebruik van invokersrechten en native dynamische SQL.

Een dynamisch SQL-scenario met native dynamische SQL

Het scenario dat in deze sectie wordt beschreven, illustreert de kracht en flexibiliteit van native dynamische SQL. Dit scenario bevat voorbeelden die u laten zien hoe u de volgende bewerkingen kunt uitvoeren met behulp van native dynamische SQL:

  • DDL- en DML-bewerkingen uitvoeren
  • Query’s met één rij en meerdere rijen uitvoeren

Gegevensmodel

De database in dit scenario is de personeelsdatabase van een bedrijf (genaamd hr) met het volgende gegevensmodel :

Een hoofdtabel met de naam offices bevat de lijst met alle bedrijfslocaties. De offices -tabel heeft de volgende definitie :

Column Name Null? Type LOCATION NOT_NULL VARCHAR2(200)

Meerdere emp_ locatietabellen bevatten de werknemersinformatie, waarbij de locatie de naam is van de stad waar het kantoor bevindt zich. Een tabel met de naam emp_houston bevat bijvoorbeeld werknemersinformatie voor het kantoor van het bedrijf in Houston, terwijl een tabel met de naam emp_boston werknemer bevat informatie voor het kantoor van het bedrijf in Boston.

Elke emp_ locatietabel heeft de volgende definitie:

De volgende secties beschrijven verschillende native dynamische SQL-bewerkingen die kunnen worden uitgevoerd op de gegevens in de hr database.

Voorbeeld van DML-bewerking

De volgende native dynamische SQL-procedure geeft een verhoging van alle werknemers met een bepaalde functietitel:

Voorbeeld van DDL-bewerking

De instructie EXECUTE IMMEDIATE kan DDL-bewerkingen uitvoeren. De volgende procedure voegt bijvoorbeeld een kantoorlocatie toe:

Met de volgende procedure wordt een kantoorlocatie verwijderd:

Voorbeeld van dynamische zoekopdracht met één rij

De EXECUTE IMMEDIATE instructie kan dynamische query’s van één rij uitvoeren. U kunt bindvariabelen specificeren in de USING -clausule en de resulterende rij ophalen in het doel dat is gespecificeerd in de INTO -clausule van de instructie.

De volgende functie haalt het aantal werknemers op een bepaalde locatie op dat een bepaalde taak uitvoert:

Voorbeeld van dynamische query met meerdere rijen

De OPEN-FOR, FETCH, en CLOSE instructies kunnen dynamische query’s met meerdere rijen uitvoeren. In de volgende procedure worden bijvoorbeeld alle werknemers met een bepaalde functie op een bepaalde locatie weergegeven:

Native Dynamic SQL vs. het DBMS_SQL-pakket

Oracle biedt twee methoden voor het gebruik van dynamische SQL binnen PL / SQL: native dynamische SQL en het DBMS_SQL pakket. Met native dynamische SQL kunt u dynamische SQL-instructies rechtstreeks in PL / SQL-code plaatsen. Deze dynamische instructies omvatten DML-instructies (inclusief query’s), anonieme PL / SQL-blokken, DDL-instructies, transactiecontrole-instructies en sessiecontrole-instructies.

Om de meeste native dynamische SQL-instructies te verwerken, gebruikt u de EXECUTE IMMEDIATE instructie. Als u echter een query met meerdere rijen (SELECT -instructie) wilt verwerken, gebruikt u OPEN-FOR, FETCH en CLOSE instructies.

Opmerking:

Om native dynamische SQL te gebruiken, moet de COMPATIBLE initialisatieparameter moet worden ingesteld op 8.1.0 of hoger. Zie Oracle8i-migratie voor meer informatie over de parameter COMPATIBLE.

Het DBMS_SQL -pakket is een PL / SQL-bibliotheek die een programmatische API biedt om SQL-instructies dynamisch uitvoeren. Het DBMS_SQL -pakket heeft programma-interfaces om een cursor te openen, een cursor te ontleden, toevoerbindingen, enz. Programma’s die het DBMS_SQL -pakket gebruiken, bellen toe aan dit pakket om dynamische SQL-bewerkingen uit te voeren.

De volgende secties bieden gedetailleerde informatie over de voordelen van beide methoden.

Zie ook:

De PL / SQL-gebruikershandleiding en referentie voor gedetailleerde informatie over het gebruik van native dynamische SQL en de door Oracle8i geleverde referentie voor PL / SQL-pakketten voor gedetailleerde informatie over het gebruik van de DBMS_SQL pakket. In de PL / SQL gebruikershandleiding en referentie wordt naar native dynamische SQL verwezen als dynamische SQL.

Voordelen van Native Dynamic SQL

Native Dynamic SQL biedt de volgende voordelen ten opzichte van DBMS_SQL pakket:

Gebruiksgemak

Native dynamische SQL is veel eenvoudiger te gebruiken dan het DBMS_SQL pakket.Omdat native dynamische SQL is geïntegreerd met SQL, kunt u deze op dezelfde manier gebruiken als u momenteel statische SQL binnen PL / SQL-code gebruikt. Bovendien is native dynamische SQL-code doorgaans compacter en leesbaarder dan equivalente code die het DBMS_SQL -pakket gebruikt.

De DBMS_SQL -pakket is niet zo eenvoudig te gebruiken als native dynamische SQL. Er zijn veel procedures en functies die in een strikte volgorde moeten worden gebruikt. Normaal gesproken vereist het uitvoeren van eenvoudige bewerkingen een grote hoeveelheid code wanneer u het DBMS_SQL -pakket gebruikt. U kunt deze complexiteit vermijden door in plaats daarvan native dynamische SQL te gebruiken.

Tabel 8-1 illustreert het verschil in de hoeveelheid code die nodig is om dezelfde bewerking uit te voeren met behulp van de DBMS_SQL pakket en native dynamische SQL.

Tabel 8-1 Codevergelijking van DBMS_SQL-pakket en native Dynamic SQL

Prestatieverbeteringen

De prestaties van native dynamische SQL in PL / SQL zijn vergelijkbaar met de prestaties van statische SQL, omdat de PL / SQL-interpreter ingebouwde ondersteuning heeft voor native dynamische SQL. Daarom zijn de prestaties van programma’s die native dynamische SQL gebruiken veel beter dan die van programma’s die het DBMS_SQL -pakket gebruiken. Doorgaans presteren native dynamische SQL-instructies 1,5 tot 3 keer beter dan equivalente instructies die het pakket DBMS_SQL gebruiken. Uw prestatieverbeteringen kunnen natuurlijk variëren, afhankelijk van uw aanvraag.

Het DBMS_SQL -pakket is gebaseerd op een procedurele API en, als resultaat, leidt tot hoge overhead voor procedure-aanroepen en het kopiëren van gegevens. Elke keer dat u bijvoorbeeld een variabele bindt, kopieert het DBMS_SQL -pakket de PL / SQL-bindvariabele naar zijn ruimte voor later gebruik tijdens de uitvoering. Op dezelfde manier worden elke keer dat u een ophaalactie uitvoert, eerst de gegevens gekopieerd naar de ruimte die wordt beheerd door het DBMS_SQL -pakket en vervolgens worden de opgehaalde gegevens kolom voor kolom gekopieerd naar de juiste PL / SQL-variabelen, resulterend in aanzienlijke overhead als gevolg van het kopiëren van gegevens. In tegenstelling hiermee bundelt native dynamische SQL de stappen voor het voorbereiden, binden en uitvoeren van instructies in één enkele bewerking, waardoor de overhead van het kopiëren van gegevens en procedureaanroepen wordt geminimaliseerd en de prestaties worden verbeterd.

Prestatietip

Wanneer u native dynamische SQL of het DBMS_SQL -pakket gebruikt, kunt u de prestaties verbeteren door bindvariabelen te gebruiken, omdat Oracle door bindvariabelen een enkele cursor kan delen voor meerdere SQL-instructies.

De volgende native dynamische SQL-code gebruikt bijvoorbeeld geen bindvariabelen:

Voor elke afzonderlijke my_deptno variabele wordt een nieuwe cursor gemaakt, die kan conflicten tussen hulpbronnen en slechte prestaties veroorzaken. Bind in plaats daarvan my_deptno als een bindvariabele, zoals in het volgende voorbeeld:

Hier wordt dezelfde cursor hergebruikt voor verschillende waarden van de bind my_deptno, waardoor de prestaties en schaalbaarheid worden verbeterd.

Ondersteuning voor door de gebruiker gedefinieerde typen

Native dynamische SQL ondersteunt alle typen die worden ondersteund door statische SQL in PL / SQL. Daarom biedt native dynamische SQL ondersteuning voor door de gebruiker gedefinieerde typen, zoals door de gebruiker gedefinieerde objecten, verzamelingen en REFs. Het DBMS_SQL -pakket ondersteunt deze door de gebruiker gedefinieerde typen niet.

Opmerking:

Het DBMS_SQL -pakket biedt beperkte ondersteuning voor arrays. Zie de door Oracle8i geleverde referentie voor PL / SQL-pakketten voor informatie.

Ondersteuning voor ophalen in records

Native dynamische SQL en statische SQL ondersteunen beide het ophalen in records, maar de DBMS_SQL pakket niet. Met native dynamische SQL kunnen de rijen die het resultaat zijn van een query direct worden opgehaald in PL / SQL-records.

In het volgende voorbeeld worden de rijen van een query opgehaald in de emp_rec record:

Voordelen van het DBMS_SQL-pakket

Het DBMS_SQL -pakket biedt de volgende voordelen ten opzichte van native dynamische SQL:

Ondersteuning voor client-side programma’s

Momenteel wordt het DBMS_SQL pakket ondersteund in client-side programma’s, maar native dynamische SQL is dat niet. Elke aanroep naar het DBMS_SQL -pakket van het client-side programma vertaalt zich naar een PL / SQL remote procedure call (RPC); deze oproepen vinden plaats wanneer u een variabele moet binden, een variabele moet definiëren of een instructie moet uitvoeren.

Ondersteuning voor DESCRIBE

De DESCRIBE_COLUMNS -procedure in het DBMS_SQL -pakket kan worden gebruikt om beschrijf de kolommen voor een cursor die is geopend en geparseerd via DBMS_SQL. De functionaliteit is vergelijkbaar met het DESCRIBE commando in SQL * Plus. Native dynamische SQL heeft geen DESCRIBE -faciliteit.

Ondersteuning voor Bulk Dynamic SQL

Bulk SQL is de mogelijkheid om meerdere rijen gegevens te verwerken in een enkele DML-instructie. Bulk SQL verbetert de prestaties door de hoeveelheid contextwisseling tussen SQL en de hosttaal te verminderen. Momenteel ondersteunt het DBMS_SQL -pakket bulk dynamische SQL.

Hoewel er geen directe ondersteuning is voor bulkbewerkingen in native dynamische SQL, kunt u een native dynamische bulk SQL simuleren. instructie door de bulk SQL-instructie in een “BEGINEND” blok te plaatsen en het blok dynamisch uit te voeren. Met deze tijdelijke oplossing kunt u de voordelen van bulk-SQL realiseren binnen een native dynamisch SQL-programma. De volgende native dynamische SQL-code kopieert bijvoorbeeld de ename -kolom van de ene tabel naar de andere:

Updates en verwijderingen van meerdere rijen met een RETURNING-clausule

Het DBMS_SQL -pakket ondersteunt instructies met een RETURNING -clausule die meerdere rijen actualiseert of verwijdert. Native dynamische SQL ondersteunt alleen een RETURNING -clausule als een enkele rij wordt geretourneerd.

Zie ook:

“DML Returning Example” voor voorbeelden van DBMS_SQL pakketcode en native dynamische SQL-code die een RETURNING -clausule gebruikt.

Ondersteuning voor SQL-statements groter dan 32 KB

De DBMS_SQL pakket ondersteunt SQL-statements groter dan 32KB; native dynamische SQL niet.

Hergebruik van SQL-instructies

De PARSE -procedure in de DBMS_SQL package parseert een SQL-instructie eenmaal. Na de eerste ontleding kan de instructie meerdere keren worden gebruikt met verschillende sets bindargumenten.

In tegenstelling hiermee bereidt native dynamische SQL een SQL-instructie voor op uitvoering telkens wanneer de instructie wordt gebruikt. Voorbereiding van verklaringen omvat doorgaans parsing, optimalisatie en het genereren van plannen. Het opstellen van een verklaring telkens wanneer deze wordt gebruikt, leidt tot een kleine prestatievergoeding. Het gedeelde cursormechanisme van Oracle minimaliseert echter de kosten, en de prestatieverbeteringen zijn doorgaans triviaal in vergelijking met de prestatievoordelen van native dynamische SQL.

Voorbeelden van DBMS_SQL-pakketcode en native dynamische SQL-code

De volgende voorbeelden illustreren de verschillen in de code die nodig zijn om bewerkingen uit te voeren met het DBMS_SQL -pakket en native dynamische SQL. De volgende typen voorbeelden worden specifiek weergegeven:

  • Een query
  • Een DML-bewerking
  • Een DML-terugkerende bewerking

In het algemeen is de native dynamische SQL-code leesbaarder en compacter, wat de productiviteit van ontwikkelaars kan verbeteren.

Queryvoorbeeld

Het volgende voorbeeld bevat een dynamische vraaginstructie met één bindvariabele (:jobname) en twee geselecteerde kolommen (ename en sal):

stmt_str := "SELECT ename, sal FROM emp WHERE job = :jobname";

Dit voorbeeldvragen voor werknemers met de j ob beschrijving SALESMAN in de job kolom van de emp tabel. Tabel 8-2 toont voorbeeldcode die deze query uitvoert met behulp van het DBMS_SQL -pakket en native dynamische SQL.

Tabel 8-2 Query’s met behulp van het DBMS_SQL-pakket en native Dynamic SQL

DML-voorbeeld

Het het volgende voorbeeld bevat een dynamische INSERT instructie voor een tabel met drie kolommen:

stmt_str := "INSERT INTO dept_new VALUES (:deptno, :dname, :loc)";

In dit voorbeeld wordt een nieuwe rij ingevoegd waarvoor de kolomwaarden zich in de PL / SQL-variabelen bevinden deptnumber, deptname en location. Tabel 8-3 toont voorbeeldcode die deze DML-bewerking uitvoert met behulp van het DBMS_SQL -pakket en native dynamische SQL.

Tabel 8-3 DML-bewerking met behulp van het DBMS_SQL-pakket en Native Dynamic SQL

DML Returning Example

Het volgende voorbeeld bevat een dynamische UPDATE instructie die de locatie van een afdeling bijwerkt wanneer het afdelingsnummer (deptnumber) en een nieuwe locatie (location) wordt gegeven, en retourneert de naam van de afdeling:

stmt_str := "UPDATE dept_new SET loc = :newloc WHERE deptno = :deptno RETURNING dname INTO :dname";

In dit voorbeeld wordt een nieuwe rij ingevoegd waarvan de kolomwaarden in de PL / SQL-variabelen staan deptnumber, deptname, en location. Tabel 8-4 toont voorbeeldcode die deze DML-retourbewerking uitvoert met behulp van het DBMS_SQL -pakket en native dynamische SQL.

Tabel 8-4 DML-retourbewerking met behulp van de DBMS_SQL Pakket en native dynamische SQL

Andere talen voor applicatieontwikkeling dan PL / SQL

Tot dusver is de discussie in dit hoofdstuk over PL / SQL-ondersteuning voor dynamische SQL.U kunt echter andere talen voor toepassingsontwikkeling gebruiken om programma’s te implementeren die gebruikmaken van dynamische SQL. Deze talen voor applicatie-ontwikkeling zijn onder andere C / C ++, COBOL en Java.

Als u C / C ++ gebruikt, kunt u applicaties ontwikkelen die dynamische SQL gebruiken met de Oracle Call Interface (OCI), of u kunt de Pro * C / C ++ precompiler gebruiken om dynamische SQL-extensies toe te voegen aan uw C code. Evenzo, als u COBOL gebruikt, kunt u de Pro * COBOL-precompiler gebruiken om dynamische SQL-extensies aan uw COBOL-code toe te voegen. Als u Java gebruikt, kunt u toepassingen ontwikkelen die dynamische SQL gebruiken met JDBC.

In het verleden was de enige manier om dynamische SQL te gebruiken in PL / SQL-toepassingen door de pakket. Er zijn een aantal beperkingen aan het gebruik van dit pakket, waaronder prestatieproblemen. Daarom hebben applicatieontwikkelaars mogelijk een van de hierboven besproken alternatieven voor PL / SQL gebruikt om dynamische SQL te implementeren. Met de introductie van native dynamische SQL in PL / SQL zijn veel van de nadelen van het gebruik van PL / SQL voor dynamische SQL nu geëlimineerd.

Als u een applicatie heeft die OCI gebruikt, is Pro * C / C ++, of Pro * COBOL voor dynamische SQL-uitvoering, kunnen de netwerkrondes die nodig zijn om dynamische SQL-bewerkingen uit te voeren, de prestaties nadelig beïnvloeden. Omdat deze toepassingen zich doorgaans op clients bevinden, zijn er meer netwerkoproepen nodig om dynamische SQL-bewerkingen te voltooien. Als u dit type toepassing heeft, overweeg dan om de dynamische SQL-functionaliteit te verplaatsen naar opgeslagen procedures en opgeslagen functies in PL / SQL die native dynamische SQL gebruiken. Hierdoor kunnen de prestaties van uw toepassing worden verbeterd, omdat de opgeslagen procedures zich op de server kunnen bevinden, waardoor de netwerkoverhead wegvalt. U kunt dan de opgeslagen PL / SQL-procedures en opgeslagen functies vanuit de applicatie aanroepen.

Zie ook:

Voor informatie over het aanroepen van opgeslagen Oracle-procedures en opgeslagen functies vanuit niet-PL / SQL-applicaties , raadpleeg:

  • Oracle Call Interface Programmer’s Guide
  • Pro * C / C ++ Precompiler Programmer’s Guide
  • Pro * COBOL Precompiler Programmer “s Guide
  • Oracle8i Java Stored Procedures Developer’s Guide

Leave a Reply

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *