Delen via


Een instructie uitvoeren

Er zijn vier manieren om een instructie uit te voeren, afhankelijk van wanneer ze worden gecompileerd (voorbereid) door de database-engine en die deze definieert:

  • Directe uitvoering De toepassing definieert de SQL-instructie. Het wordt voorbereid en uitgevoerd tijdens runtime in één stap.

  • Voorbereide uitvoering De toepassing definieert de SQL-instructie. Het wordt voorbereid en uitgevoerd tijdens runtime in afzonderlijke stappen. De instructie kan eenmaal worden voorbereid en meerdere keren worden uitgevoerd.

  • Procedures De toepassing kan een of meer SQL-instructies tijdens de ontwikkeling definiëren en compileren en deze instructies opslaan in de gegevensbron als procedure. De procedure wordt een of meer keren uitgevoerd tijdens runtime. De toepassing kan beschikbare opgeslagen procedures inventariseren met behulp van catalogusfuncties.

  • Catalogusfuncties De stuurprogrammaschrijver maakt een functie die een vooraf gedefinieerde resultatenset retourneert. Deze functie verzendt meestal een vooraf gedefinieerde SQL-instructie of roept een procedure aan die hiervoor is gemaakt. De functie wordt een of meer keren uitgevoerd tijdens runtime.

Een bepaalde instructie (zoals aangegeven door de instructiehandle) kan een onbeperkt aantal keren worden uitgevoerd. De instructie kan worden uitgevoerd met verschillende SQL-instructies of kan herhaaldelijk worden uitgevoerd met dezelfde SQL-instructie. De volgende code gebruikt bijvoorbeeld dezelfde instructiegreep (hstmt1) om de tabellen in de verkoopdatabase op te halen en weer te geven. Vervolgens wordt deze ingang opnieuw gebruikt om de kolommen in een tabel op te halen die door de gebruiker zijn geselecteerd.

SQLHSTMT    hstmt1;  
SQLCHAR *   Table;  
  
// Create a result set of all tables in the Sales database.  
SQLTables(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, NULL, 0, NULL, 0);  
  
// Fetch and display the table names; then close the cursor.  
// Code not shown.  
  
// Have the user select a particular table.  
SelectTable(Table);  
  
// Reuse hstmt1 to create a result set of all columns in Table.  
SQLColumns(hstmt1, "Sales", SQL_NTS, "sysadmin", SQL_NTS, Table, SQL_NTS, NULL, 0);  
  
// Fetch and display the column names in Table; then close the cursor.  
// Code not shown.  

De volgende code laat zien hoe één ingang wordt gebruikt om herhaaldelijk dezelfde instructie uit te voeren om rijen uit een tabel te verwijderen.

SQLHSTMT      hstmt1;  
SQLUINTEGER   OrderID;  
SQLINTEGER    OrderIDInd = 0;  
  
// Prepare a statement to delete orders from the Orders table.  
SQLPrepare(hstmt1, "DELETE FROM Orders WHERE OrderID = ?", SQL_NTS);  
  
// Bind OrderID to the parameter for the OrderID column.  
SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0,  
                  &OrderID, 0, &OrderIDInd);  
  
// Repeatedly execute hstmt1 with different values of OrderID.  
while ((OrderID = GetOrderID()) != 0) {  
   SQLExecute(hstmt1);  
}  

Voor veel stuurprogramma's is het toewijzen van instructies een dure taak, dus het hergebruik van dezelfde instructie op deze manier is meestal efficiënter dan het vrijmaken van bestaande instructies en het toewijzen van nieuwe instructies. Toepassingen die resultatensets voor een instructie maken, moeten voorzichtig zijn om de cursor over de resultatenset te sluiten voordat de instructie opnieuw wordt uitgevoerd; Zie De cursor sluiten voor meer informatie.

Het opnieuw gebruiken van instructies dwingt de toepassing ook af om een beperking te voorkomen in sommige stuurprogramma's van het aantal instructies dat tegelijk actief kan zijn. De exacte definitie van 'actief' is stuurprogrammaspecifiek, maar verwijst vaak naar een instructie die is voorbereid of uitgevoerd en nog steeds resultaten beschikbaar heeft. Wanneer een INSERT-instructie bijvoorbeeld is voorbereid, wordt deze over het algemeen beschouwd als actief; nadat een SELECT-instructie is uitgevoerd en de cursor nog steeds geopend is, wordt deze over het algemeen beschouwd als actief; nadat een CREATE TABLE-instructie is uitgevoerd, wordt deze over het algemeen niet als actief beschouwd.

Een toepassing bepaalt hoeveel instructies tegelijk actief kunnen zijn op één verbinding door SQLGetInfo aan te roepen met de optie SQL_MAX_CONCURRENT_ACTIVITIES. Een toepassing kan meer actieve instructies gebruiken dan deze limiet door meerdere verbindingen met de gegevensbron te openen; omdat verbindingen duur kunnen zijn, moet het effect op de prestaties echter worden overwogen.

Toepassingen kunnen de hoeveelheid tijd beperken die is toegewezen aan een instructie die moet worden uitgevoerd met het kenmerk SQL_ATTR_QUERY_TIMEOUT instructie. Als de time-outperiode verloopt voordat de gegevensbron de resultatenset retourneert, retourneert de functie die de SQL-instructie uitvoert SQLSTATE HYT00 (time-out verlopen). Er is standaard geen time-out.

Deze sectie bevat de volgende onderwerpen.