Chiamate di procedura

Una procedura è un oggetto eseguibile archiviato nell’origine dati. In genere, si tratta di una o più istruzioni SQL precompilate. La sequenza di escape per la chiamata a una procedura è la seguente

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

dove procedure-name specifica il nome di una procedura e parameter specifica un parametro della procedura.

Per ulteriori informazioni sulla sequenza di escape per la chiamata di procedura, vedi Sequenze di escape per chiamata di procedura nell'Appendice C: Grammatica SQL.

Una procedura può avere zero o più parametri. Una procedura può inoltre restituire un valore, come indicato dal marcatore di parametro opzionale ?= all'inizio della sintassi. Se un parametro è un parametro di input/output, può essere un valore letterale o un marcatore di parametro. Tuttavia, le applicazioni interoperabili devono usare sempre marcatori di parametro perché alcune origini dati non accettano valori di parametro letterali. Se il parametro è un parametro di output, deve essere un marcatore di parametro. I marcatori di parametro devono essere associati a SQLBindParameter prima dell'esecuzione dell'istruzione della chiamata di procedura.

I parametri di input e di input/output possono essere omessi dalle chiamate alle procedure. Se una procedura viene chiamata con parentesi ma senza alcun parametro, come {call procedure-name()}, il driver indica all'origine dati di utilizzare il valore predefinito per il primo parametro. Se la procedura non include alcun parametro, ciò può causare la mancata esecuzione. Se una procedura viene chiamata senza parentesi, come {call procedure-name} il driver non invia alcun valore di parametro.

È possibile specificare valori letterali per parametri di input e di input/output nelle chiamate alle procedure. Suppioniamo che la procedura InsertOrder, ad esempio, includa cinque parametri di input. La chiamata seguente a InsertOrder omette il primo parametro, fornisce un valore letterale per il secondo parametro e utilizza un marcatore di parametro per i parametri terzo, quarto e quinto:

{call InsertOrder(, 10, ?, ?, ?)}   // Not interoperable!  

Si noti che se si omette un parametro, la virgola che lo delimita rispetto ad altri parametri deve comunque essere presente. Se si omette un parametro di input o di input/output, la procedura utilizza il valore predefinito del parametro. Un altro modo per specificare il valore predefinito di un parametro di input o di input/output consiste nell'impostare il valore del buffer di lunghezza/indicatore associato al parametro su SQL_DEFAULT_PARAM.

Se si omette un parametro di input/output o se si fornisce un valore letterale per il parametro, il driver ignora il valore di output. Analogamente, se il marcatore di parametro per il valore restituito di una procedura viene omesso, il driver ignora il valore restituito. Se, infine, un'applicazione specifica un parametro di valore restituito per una procedura che non restituisce alcun valore, il driver imposta il valore per il buffer di lunghezza/indicatore associato al parametro su SQL_NULL_DATA.

Supponiamo che la procedura PARTS_IN_ORDERS crei un set di risultati contenente un elenco di ordini che contengono un determinato numero di parte. Il codice seguente chiama questa procedura per il numero di parte 544:

SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0,  
                  &PartID, 0, PartIDInd);  
  
// Place the department number in PartID.  
PartID = 544;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "{call PARTS_IN_ORDERS(?)}", SQL_NTS);  

Per determinare se un'origine dati supporta le procedure, un'applicazione chiama SQLGetInfo con l'opzione SQL_PROCEDURES.

Per altre informazioni sulle procedure, vedi Procedure.