Eseguire un'istruzione

Esistono quattro modi per eseguire un'istruzione, a seconda di quando vengono compilati (preparati) dal motore di database e da chi li definisce:

  • Esecuzione diretta L'applicazione definisce l'istruzione SQL. Viene preparata ed eseguita in un singolo passaggio in fase di esecuzione.

  • Esecuzione preparata L'applicazione definisce l'istruzione SQL. Viene preparata ed eseguita in passaggi separati in fase di esecuzione. L'istruzione può essere preparata una volta ed eseguita più volte.

  • Procedure L'applicazione può definire e compilare una o più istruzioni SQL in fase di sviluppo e archiviarle nell'origine dati come procedura. La procedura viene eseguita una o più volte in fase di esecuzione. L'applicazione può enumerare le stored procedure disponibili utilizzando le funzioni catalogo.

  • Funzioni catalogo Il writer del driver crea una funzione che restituisce un set di risultati predefinito. In genere, questa funzione invia un'istruzione SQL predefinita o chiama una procedura creata a questo scopo. La funzione viene eseguita una o più volte in fase di esecuzione.

Una particolare istruzione (identificata dal relativo handle di istruzione) può essere eseguita un numero qualsiasi di volte. L'istruzione può essere eseguita con un'ampia gamma di istruzioni SQL diverse oppure può essere eseguita ripetutamente con la stessa istruzione SQL. Per esempio, il codice seguente usa lo stesso handle di istruzione (hstmt1) per recuperare e visualizzare le tabelle nel database Sales. Quindi riutilizza l’handle per riprendere le colonne in una tabella selezionata dall'utente.

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.  

Il codice seguente mostra come viene usato un singolo handle per eseguire ripetutamente la stessa istruzione per eliminare delle righe da una tabella.

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

Per molti driver, l'allocazione di istruzioni è un'attività costosa, per cui in genere è più efficiente riutilizzare la stessa istruzione piuttosto che liberare le istruzioni esistenti e allocare nuove istruzioni. Le applicazioni che creano set di risultati in un'istruzione devono assicurarsi di chiudere il cursore sul set di risultati prima di rieseguire l'istruzione; per ulteriori informazioni, vedere Chiudere il cursore.

Il riutilizzo delle istruzioni obbliga inoltre l'applicazione a evitare una limitazione in alcuni driver riguardo al numero di istruzioni che possono essere attive contemporaneamente. La definizione esatta di "attivo" è specifica del driver, ma spesso fa riferimento a qualsiasi istruzione che è stata preparata o eseguita e i cui risultati sono ancora disponibili. Per esempio, un'istruzione INSERISCI viene generalmente considerata attiva dopo la sua preparazione; un'istruzione SELEZIONA, viene generalmente considerata attiva dopo l’esecuzione se il cursore è ancora aperto; un'istruzione CREATE TABLE, non viene generalmente considerata attiva dopo l’esecuzione.

Un'applicazione determina il numero di istruzioni che possono essere attive in contemporanea su una singola connessione chiamando SQLGetInfo con l'opzione SQL_MAX_CONCURRENT_ACTIVITIES. Un'applicazione può usare più istruzioni attive rispetto a questo limite aprendo più connessioni all'origine dati; tuttavia, poiché le connessioni possono essere costose, bisogna considerare l'effetto sulle prestazioni.

Le applicazioni possono limitare la quantità di tempo assegnata per l'esecuzione di un'istruzione con l'attributo di istruzione SQL_ATTR_QUERY_TIMEOUT. Se il periodo di timeout scade prima che l'origine dati restituisca il set di risultati, la funzione che esegue l'istruzione SQL restituisce SQLSTATE HYT00 (timeout scaduto). Per impostazione predefinita, non è previsto alcun timeout.

Questa sezione contiene i seguenti argomenti: