名前によるパラメーターのバインド (名前付きパラメーター)

特定の DBMS を使用すると、アプリケーションは、プロシージャ呼び出しの位置ではなく、名前でストアド プロシージャのパラメーターを指定できます。 このようなパラメーターは、名前付きパラメーターと呼ばれます。 ODBC では、名前付きパラメーターの使用がサポートされています。 ODBC では、名前付きパラメーターはストアド プロシージャの呼び出しでのみ使用され、他の SQL ステートメントでは使用できません。

ドライバーは、名前付きパラメーターが使用されているかどうかを判断する IPD のSQL_DESC_UNNAMED フィールドの値を確認します。 SQL_DESC_UNNAMEDが SQL_UNNAMED に設定されていない場合、ドライバーは IPD の SQL_DESC_NAME フィールドの名前を使用してパラメーターを識別します。 パラメーターをバインドするために、アプリケーションは SQLBindParameter を呼び出してパラメーター情報を指定し、SQLSetDescField を呼び出して IPD のSQL_DESC_NAME フィールドを設定できます。 名前付きパラメーターを使用する場合、プロシージャ呼び出しでのパラメーターの順序は重要ではなく、パラメーターのレコード番号は無視されます。

名前のないパラメーターと名前付きパラメーターの違いは、記述子のレコード番号とプロシージャ内のパラメーター番号の関係にあります。 名前のないパラメーターを使用する場合、最初のパラメーター マーカーはパラメーター記述子の最初のレコードに関連付けられます。このレコードは、プロシージャ呼び出しの最初のパラメーター (作成順) に関連します。 名前付きパラメーターを使用する場合、最初のパラメーター マーカーは引き続きパラメーター記述子の最初のレコードに関連付けられますが、記述子のレコード番号とプロシージャ内のパラメーター番号の関係は存在しなくなります。 名前付きパラメーターは、記述子レコード番号とプロシージャー パラメーター位置のマッピングを使用しません。代わりに、記述子レコード名がプロシージャー パラメーター名にマップされます。

Note

IPD の自動作成が有効になっている場合、ドライバーは、名前付きパラメーターが使用されている場合でも、記述子レコードの順序がプロシージャ定義内のパラメーターの順序と一致するように記述子を設定します。

名前付きパラメーターを使用する場合は、すべてのパラメーターに名前付きパラメーターを指定する必要があります。 パラメーターが名前付きパラメーターでない場合は、どのパラメーターも名前付きパラメーターではありません。 名前付きパラメーターと名前のないパラメーターが混在している場合、動作はドライバーに依存します。

名前付きパラメーターの例として、SQL Server ストアド プロシージャが次のように定義されているとします。

CREATE PROCEDURE test @title_id int = 1, @quote char(30) AS <blah>  

このプロシージャでは、最初のパラメーター @title_id の既定値は 1 です。 アプリケーションでは、次のコードを使用して、1 つの動的パラメーターのみを指定するように、このプロシージャを呼び出すことができます。 このパラメーターは、「@quote」という名前の名前付きパラメーターです。

// Prepare the procedure invocation statement.  
SQLPrepare(hstmt, "{call test(?)}", SQL_NTS);  
  
// Populate record 1 of ipd.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,  
                  30, 0, szQuote, 0, &cbValue);  
  
// Get ipd handle and set the SQL_DESC_NAMED and SQL_DESC_UNNAMED fields  
// for record #1.  
SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0);  
SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@quote", SQL_NTS);  
  
// Assuming that szQuote has been appropriately initialized,  
// execute.  
SQLExecute(hstmt);