Prozeduraufrufe

Bei einer Prozedur handelt es sich um ein ausführbares Objekt, das in der Datenquelle gespeichert ist. In der Regel handelt es sich dabei um eine oder mehrere vorkompilierte SQL-Anweisungen. Die Escapesequenz für das Aufrufen einer Prozedur lautet wie folgt

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

Dabei gibt procedure-name den Namen einer Prozedur an und Parameter gibt einen Parameter für eine Prozedur an.

Weitere Informationen zur Prozeduraufruf-Escapesequenz finden Sie unter Prozeduraufruf-Escapesequenz in Anhang C: SQL-Grammatik.

Eine Prozedur kann 0 (null) oder mehr Parameter haben. Sie kann außerdem einen Wert zurückgeben, wie durch die optionale Parametermarkierung ?= am Anfang der Markierung angegeben. Wenn es sich bei Parameter um einen Eingabe- oder einen Eingabe-/Ausgabeparameter handelt, kann ein Literalwert oder eine Parametermarkierung verwendet werden. Interoperable Anwendungen sollten jedoch immer Parametermarkierungen verwenden, da einige Datenquellen keine Literalparameterwerte akzeptieren. Wenn es sich bei Parameter um einen Ausgabeparameter handelt, muss eine Parametermarkierung verwendet werden. Parametermarkierungen müssen mit SQLBindParameter gebunden werden, bevor die Prozeduraufrufanweisung ausgeführt wird.

Eingabe- und Eingabe-/Ausgabeparameter müssen in Prozeduraufrufen nicht angegeben werden. Wenn eine Prozedur mit Klammern aber ohne Parameter aufgerufen wird, wie beispielsweise {call procedure-name()}, weist der Treiber die Datenquelle an, für den ersten Parameter den Standardwert zu verwenden. Wenn die Prozedur keine Parameter hat, kann dies zu einem Fehler der Prozedur führen. Wenn eine Prozedur ohne Klammern aufgerufen wird, wie beispielsweise {call procedure-name}, sendet der Treiber keine Parameterwerte.

Literalwerte können in Prozeduraufrufen für Eingabe- und Eingabe-/Ausgabeparameter angegeben werden. Angenommen, die Prozedur InsertOrder hat fünf Eingabeparameter. Beim folgenden Aufruf von InsertOrder ist der erste Parameter nicht angegeben, für den zweiten Parameter ist ein Literalwert angegeben und für den dritten, vierten und fünften Parameter wird eine Parametermarkierung verwendet:

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

Wenn ein Parameter nicht angegeben wird, muss das Komma dennoch gesetzt werden, damit dieser Parameter von anderen Parametern abgegrenzt wird. Wenn ein Eingabe- oder ein Eingabe-/Ausgabeparameter ausgelassen wird, verwendet die Prozedur den Standardwert des Parameters. Eine weitere Möglichkeit, den Standardwert eines Eingabe- oder eines Eingabe-/Ausgabeparameters anzugeben, besteht darin, den Wert des an den Parameter gebundenen Längen-/Indikatorpuffers auf SQL_DEFAULT_PARAM festzulegen.

Wenn ein Eingabe-/Ausgabeparameter ausgelassen oder ein Literalwert für den Parameter angegeben wird, verwirft der Treiber den Ausgabewert. Entsprechend verwirft der Treiber den Rückgabewert, wenn die Parametermarkierung für den Rückgabewert einer Prozedur ausgelassen wird. Wenn eine Anwendung den Parameter des Rückgabewerts für eine Prozedur angibt, die keinen Wert zurückgibt, legt der Treiber den Wert des an den Parameter gebundenen Längen-/Indikatorpuffers auf SQL_NULL_DATA fest.

Angenommen, die Prozedur PARTS_IN_ORDERS erstellt ein Resultset, das eine Liste von Bestellungen enthält, die eine bestimmte Artikelnr. enthalten. Der folgende Code ruft diese Prozedur für die Artikelnr. 544 auf:

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

Um festzustellen, ob eine Datenquelle Prozeduren unterstützt, ruft eine Anwendung SQLGetInfo mit der Option SQL_PROCEDURES auf.

Weitere Informationen zu Prozeduren finden Sie unter Prozeduren.