Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Hoewel statische SQL in veel situaties goed werkt, is er een klasse toepassingen waarin de gegevenstoegang niet vooraf kan worden bepaald. Stel dat een spreadsheet een gebruiker in staat stelt een query in te voeren, die vervolgens naar de DBMS wordt verzonden om gegevens op te halen. De inhoud van deze query kan uiteraard niet bekend zijn bij de programmeur wanneer het spreadsheetprogramma wordt geschreven.
Dynamische uitvoering
Om dit probleem op te lossen, gebruikt de spreadsheet een vorm van ingesloten SQL die dynamische SQL wordt genoemd. In tegenstelling tot statische SQL-instructies, die in het programma zijn vastgelegd, kunnen dynamische SQL-instructies tijdens runtime worden gebouwd en in een tekenreekshostvariabele worden geplaatst. Ze worden vervolgens naar de DBMS verzonden voor verwerking. Omdat dbms tijdens runtime een toegangsplan moet genereren voor dynamische SQL-instructies, is dynamische SQL doorgaans langzamer dan statische SQL. Wanneer een programma met dynamische SQL-instructies wordt gecompileerd, worden de dynamische SQL-instructies niet verwijderd uit het programma, zoals in statische SQL. In plaats daarvan worden ze vervangen door een functie-aanroep die de instructie doorgeeft aan de DBMS; statische SQL-instructies in hetzelfde programma worden normaal behandeld.
De eenvoudigste manier om een dynamische SQL-instructie uit te voeren, is met een EXECUTE IMMEDIATE-instructie. Met deze instructie wordt de SQL-instructie doorgegeven aan de DBMS voor compilatie en uitvoering.
Een nadeel van de INSTRUCTIE EXECUTE IMMEDIATE is dat de DBMS elk van de vijf stappen van het verwerken van een SQL-instructie moet doorlopen telkens wanneer de instructie wordt uitgevoerd. De overhead die bij dit proces betrokken is, kan aanzienlijk zijn als veel instructies dynamisch worden uitgevoerd en het is verspilling als deze instructies vergelijkbaar zijn.
Voorbereide uitvoering
Om de bovenstaande situatie aan te pakken, biedt dynamische SQL een geoptimaliseerde vorm van uitvoering, de voorbereide uitvoering, die gebruikmaakt van de volgende stappen:
Het programma maakt een SQL-instructie in een buffer, net zoals voor de EXECUTE IMMEDIATE-instructie. In plaats van hostvariabelen kan een vraagteken (?) overal in de instructietekst worden vervangen door een constante om aan te geven dat er later een waarde voor de constante wordt opgegeven. Het vraagteken wordt aangeroepen als parametermarkering.
Het programma geeft de SQL-instructie door aan de DBMS met een PREPARE-instructie, die aanvraagt dat de DBMS de instructie parseert, valideert en optimaliseert en er een uitvoeringsplan voor genereert. Het programma gebruikt vervolgens een EXECUTE-instructie (geen EXECUTE IMMEDIATE-instructie) om de PREPARE-instructie op een later tijdstip uit te voeren. Hiermee worden parameterwaarden voor de instructie doorgegeven via een speciale gegevensstructuur met de naam SQL Data Area of SQLDA.
Het programma kan de EXECUTE-instructie herhaaldelijk gebruiken, waarbij verschillende parameterwaarden worden opgegeven telkens wanneer de dynamische instructie wordt uitgevoerd.
De voorbereide uitvoering is nog steeds niet hetzelfde als statische SQL. In statische SQL worden de eerste vier stappen voor het verwerken van een SQL-instructie uitgevoerd tijdens het compileren. Bij de voorbereide uitvoering worden deze stappen nog steeds uitgevoerd, maar ze worden slechts eenmaal uitgevoerd. Uitvoering van het plan vindt alleen plaats wanneer EXECUTE wordt aangeroepen. Dit gedrag helpt bij het elimineren van enkele prestatienadelen die inherent zijn aan de architectuur van dynamische SQL.