プロシージャ呼び出し

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

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

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

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

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

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

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

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

パラメーターを省略した場合でも、他のパラメーターから区切るコンマが表示される必要があることに注意してください。 入力パラメーターまたは入出力パラメーターを省略すると、プロシージャはそのパラメーターの既定値を使用します。 入力パラメーターまたは入出力パラメーターの既定値を指定するもう 1 つの方法は、パラメーターにバインドされている長さ/インジケーター バッファーの値を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 を呼び出します。

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