プロシージャ呼び出し

プロシージャは、データ ソースに格納されている実行可能なオブジェクトです。 これは通常、プリコンパイルされた 1 つ以上の SQL ステートメントです。 プロシージャを呼び出すエスケープ シーケンスは、次の構文を使用します。

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

ここでは、プロシージャ ネームがプロシージャの名前を指定し、 パラメーターがプロシージャのパラメーターを指定します。

プロシージャ呼び出しのエスケープ シーケンスの詳細については、「付録 C: SQL 文法」のプロシージャ呼び出しエスケープ シーケンスを参照してください。

プロシージャには、0 個以上のパラメーターを指定できます。 また、構文の開始にオプション パラメーター マーカー ?= を指定することによって示されるとおり、値を返すこともできます。 パラメーターが入力パラメーターまたは入出力パラメーターの場合は、リテラルまたはパラメーター マーカーを使用できます。 ただし、相互運用可能なアプリケーションでは、リテラル パラメーター値を受け入れないデータ ソースがあるため、常にパラメーター マーカーを使用する必要があります。 パラメーターが出力パラメーターの場合、パラメーター マーカーを使用する必要があります。 プロシージャ呼び出しステートメントを実行する前に、パラメーター マーカーを SQLBindParameter にバインドする必要があります。

プロシージャ呼び出しでは、入力パラメーターと入出力パラメーターを省略できます。 かっこだけを指定し、パラメーターを指定しないでプロシージャを呼び出した場合({call procedure-name()})、ドライバーは最初のパラメーターの既定値を使用するように、データ ソースに指示します。 プロシージャにパラメーターを指定しないと、プロシージャが失敗する可能性があります。 かっこを付けないでプロシージャを呼び出すと({call procedure-name})、ドライバーはパラメーター値を送信しません。

プロシージャ呼び出しでは、入力パラメーターや入出力パラメーターとしてリテラルを指定できます。 たとえば、InsertOrder プロシージャには 5 つの入力パラメーターがあるとします。 次の InsertOrder の呼び出しでは、最初のパラメーターを省略し、2 番目のパラメーターとしてリテラルを指定して、3 番目、4 番目、5 番目のパラメーターとしてパラメーター マーカーを使用しています

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

パラメーターを省略する場合でも、他のパラメーターとの区切りを示すコンマは省略できないことに注意してください。 入力パラメーターまたは入出力パラメーターを省略すると、プロシージャはそのパラメーターの既定値を使用します。 他の方法で入力パラメーターまたは入出力パラメーターの既定値を指定するには、そのパラメーターにバインドされる長さ/インジケーター バッファーの値を SQL_DEFAULT_PARAM に設定します。

入出力パラメーターを省略した場合、または入出力パラメーターとしてリテラルを指定した場合、ドライバーは出力値を破棄します。 同様に、プロシージャの戻り値のパラメーター マーカーを省略した場合、ドライバーは戻り値を破棄します。 最後に、値を返さないプロシージャに戻り値パラメーターを指定すると、ドライバーは、そのパラメーターにバインドされる長さ/インジケーター バッファーの値を SQL_NULL_DATA に設定します。

プロシージャ PARTS_IN_ORDERSが、特定の部品番号を含む注文のリストを含む結果セットを作成するとします。 次のコードは、部品番号 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);  

データ ソースがプロシージャをサポートしているかどうかを判断するために、アプリケーションは SQL_PROCEDURES オプションを使用して SQLGetInfo を呼び出します。

プロシージャの詳細については、「プロシージャ」を参照してください。