Dela via


Köra en instruktion

Det finns fyra sätt att köra en -instruktion, beroende på när de kompileras (förbereds) av databasmotorn och vem som definierar dem:

  • Direktkörning Programmet definierar SQL-instruktionen. Den förbereds och exekveras under körningstid i ett enda steg.

  • Förberedd exekvering Programmet definierar SQL-instruktionen. Den förbereds och körs under körning i separata steg. Uttrycket kan förberedas en gång och köras flera gånger.

  • Förfaranden Programmet kan definiera och kompilera en eller flera SQL-instruktioner vid utvecklingstillfället och lagra dessa instruktioner på datakällan som en procedur. Vid körning utförs proceduren en eller flera gånger. Programmet kan räkna upp tillgängliga lagrade procedurer med hjälp av katalogfunktioner.

  • Katalogfunktioner Drivrutinsskrivaren skapar en funktion som returnerar en fördefinierad resultatuppsättning. Vanligtvis skickar den här funktionen en fördefinierad SQL-instruktion eller anropar en procedur som skapats för detta ändamål. Funktionen körs en eller flera gånger vid körning.

En viss instruktion (som identifieras av dess instruktionshandtag) kan köras valfritt antal gånger. -instruktionen kan köras med en mängd olika SQL-instruktioner, eller så kan den köras upprepade gånger med samma SQL-instruktion. Följande kod använder till exempel samma instruktionshandtag (hstmt1) för att hämta och visa tabellerna i försäljningsdatabasen. Den återanvänder sedan handtaget för att hämta kolumnerna i en tabell som användaren har valt.

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.  

Och följande kod visar hur ett enda handtag används för att upprepade gånger köra samma instruktion för att ta bort rader från en tabell.

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);  
}  

För många drivrutiner är allokering av instruktioner en dyr uppgift, så att återanvända samma instruktion på det här sättet är vanligtvis effektivare än att frigöra befintliga instruktioner och allokera nya. Program som skapar resultatuppsättningar med ett uttalande måste vara noga med att stänga markören över resultatuppsättningen innan uttalandet utförs igen. Mer information finns i Stänga markören.

Att återanvända uttalanden tvingar också applikationen att undvika en begränsning i vissa drivrutiner för antalet uttalanden som kan vara aktiva samtidigt. Den exakta definitionen av "aktiv" är drivrutinsspecifik, men den refererar ofta till alla instruktioner som har förberetts eller körts och som fortfarande har tillgängliga resultat. När en INSERT-instruktion har förberetts anses den till exempel vara aktiv. När en SELECT-instruktion har körts och markören fortfarande är öppen anses den vanligtvis vara aktiv. När en CREATE TABLE-instruktion har körts anses den vanligtvis inte vara aktiv.

Ett program avgör hur många instruktioner som kan vara aktiva på en enda anslutning samtidigt genom att anropa SQLGetInfo med alternativet SQL_MAX_CONCURRENT_ACTIVITIES. Ett program kan använda mer aktiva instruktioner än den här gränsen genom att öppna flera anslutningar till datakällan. eftersom anslutningar kan vara dyra bör dock effekten på prestanda beaktas.

Program kan begränsa den tid som tilldelas för en instruktion som ska köras med SQL_ATTR_QUERY_TIMEOUT-instruktionsattributet. Om tidsgränsen upphör att gälla innan datakällan returnerar resultatuppsättningen returnerar funktionen som kör SQL-instruktionen SQLSTATE HYT00 (tidsgränsen har upphört att gälla). Som standard finns det ingen tidsgräns.

Det här avsnittet innehåller följande avsnitt.