Appels de procédure

Une procédure est un objet exécutable stocké dans la base de données. Généralement, il s'agit d'une ou plusieurs instructions SQL qui ont été précompilées. La séquence d’échappement permettant d’appeler une procédure est la suivante :

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

procedure-name spécifie le nom d’une procédure et parameter spécifie un paramètre de procédure.

Pour plus d’informations sur la séquence d’échappement d’appel de procédure, consultez la section Séquence d’échappement d’appel de procédure dans l’annexe C : Grammaire SQL.

Une procédure peut avoir zéro, un ou plusieurs paramètres. Elle peut également retourner une valeur, comme l’indique le marqueur de paramètre optionnel ?= au début de la syntaxe. Si parameter est un paramètre d’entrée ou d’entrée/sortie, ce peut être un littéral ou un marqueur de paramètre. Toutefois, les applications interopérables doivent toujours utiliser des marqueurs de paramètres, car certaines sources de données n’acceptent pas les valeurs de paramètres littérales. Si parameter est un paramètre de sortie, ce doit être un marqueur de paramètre. Les marqueurs de paramètre doivent être liés à SQLBindParameter avant l’exécution de l’instruction d’appel de procédure.

Les paramètres d'entrée et d'entrée/sortie peuvent être omis dans les appels de procédure. Si une procédure est appelée avec des parenthèses mais sans paramètre, comme {call procedure-name()}, le pilote instruit la source de données d’utiliser la valeur par défaut comme premier paramètre. Si la procédure n’a pas de paramètre, elle peut échouer. Si une procédure est appelée sans parenthèses, comme {call procedure-name}, le pilote n’envoie aucune valeur de paramètre.

Des littéraux peuvent être spécifiés comme paramètres d'entrée et d'entrée/sortie dans les appels de procédure. Par exemple, supposons que la procédure InsertOrder possède cinq paramètres d’entrée. L’appel suivant à InsertOrder omet le premier paramètre, fournit un littéral pour le deuxième paramètre et utilise un marqueur de paramètre pour les troisième, quatrième et cinquième paramètres :

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

Notez que si un paramètre est omis, la virgule qui le sépare des autres paramètres doit encore apparaître. Si un paramètre d'entrée ou d'entrée/sortie est omis, la procédure utilise la valeur par défaut du paramètre. Une autre façon de spécifier la valeur par défaut d’un paramètre d’entrée ou d’entrée/sortie consiste à affecter la valeur SQL_DEFAULT_PARAM à la mémoire tampon de l’indicateur/longueur associée au paramètre.

Si un paramètre d’entrée/sortie est omis ou si un littéral est fourni comme paramètre, le pilote ignore la valeur de sortie. De la même façon, si le marqueur de paramètre pour la valeur de retour d'une procédure est omis, le pilote ignore la valeur de retour. Enfin, si une application spécifie un paramètre de valeur de retour pour une procédure qui ne renvoie pas de valeur, le pilote affecte la valeur SQL_NULL_DATA à la mémoire tampon de l'indicateur/longueur associée au paramètre.

Supposons que la procédure PARTS_IN_ORDERS crée un jeu de résultats qui contient une liste de commandes contenant un numéro de référence particulier. Le code suivant appelle cette procédure pour le numéro de référence 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);  

Pour déterminer si une source de données prend en charge les procédures, une application appelle SQLGetInfo avec l’option SQL_PROCEDURES.

Pour plus d’informations sur les procédures, consultez Procédures.