動的 SQL ステートメントを実行するための ODBC の使用

Open Database Connectivity (ODBC) を使用すると、アプリケーション内の ODBC 関数呼び出しを通じてデータにアクセスできるようになります。 この ODBC インターフェースを使用すると、アプリケーションのプリコンパイルとバインドを行う必要がなく、アプリケーションの移植性が高まります。

ODBC インターフェースは、C と C++ アプリケーションがリレーショナル・データベースにアクセスする目的で特別に設計されています。 ODBC インターフェースを使用するアプリケーションは、さまざまなデータ・ソース上で実行でき、それぞれのデータベースに対してコンパイルを行う必要はありません。 理想的には ODBC は、ターゲット・データ・ソースがアプリケーションの作成時に分からない可能性がある、クライアント/サーバー環境に適しています。

SQLステートメントを実行するには、 ODBC 関数呼び出しを通じて Db2 に渡します。 この関数呼び出しにより、アプリケーションはデータ・ソースに接続し、SQL ステートメントを出し、戻されたデータと状況情報を受け取ります。

SQL ステートメントを準備するには、ODBC SQLPrepare() 関数を呼び出します。 次にこの SQL ステートメントを実行するには、ODBC SQLExecute() 関数を呼び出します。 どちらの場合も、そのアプリケーションは組み込みの PREPARE ステートメントまたは EXECUTE ステートメントを 含みません。 準備なしで、ステートメントを ODBC SQLExecDirect() 関数に渡して実行することができます。

ODBC アクセスの別のメリットとしては、異なるデータベース・サーバーのシステム・カタログの間の相違を考慮せずに済みます。 埋め込みSQLとは異なり、 Db2 ODBC は、 Db2 データベースファミリーに属するデータベース管理システム全体にわたって、アプリケーションがシステムカタログ情報を照会および取得するための一貫したインターフェースを提供します。 この機能により、各データベース・サーバー固有のカタログ照会を作成する必要性が減少します。 Db2 ODBC 結果テーブルをそれらのプログラムに戻すことができます。

汎用プログラミングインターフェース情報の開始。

この例では、本の在庫を維持する ODBC プログラムの一部を記載してあります。

/*********************************************************/
/* Determine which table to update                       */
/*********************************************************/
rc = SQLBindParameter( hStmt,
                       1,
                       SQL_PARAM_INPUT,
                       SQL_C_CHAR,
                       SQL_CHAR,
                       50,
                       0,
                       bktitle,
                       sizeof(bktitle),
                       &bktitle_len);
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLExecDirect( hStmt, 
							"SELECT TYPE FROM BOOK_TYPES WHERE TITLE=?"
							SQL_NTS );
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLBindCol( hStmt,
                 1,
                 SQL_C_CHAR,
                 book_type,
                 sizeof(book_type),
                 &book_type_len);
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLFetch( hStmt );
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLCloseCursor( hStmt );
if( rc != SQL_SUCCESS ) goto dberror;
/*********************************************************/
/* Update table                                          */
/*********************************************************/
strcpy( (char *)update_sqlstmt, (char *)"UPDATE ");
if( strcmp( (char *)book_type, (char *)"FICTION") == 0)
{
    strcat( (char *)update_sqlstmt, (char *)"FICTION_BOOKS" );
}
else
{
    strcpy( (char *)update_sqlstmt, (char *)"NON_FICTION_BOOKS" );
}
strcat( (char *)update_sqlstmt, 
        (char *)" SET INVENTORY = INVENTORY-1 WHERE TITLE = ?");

rc = SQLPrepare( hStmt, update_sqlstmt, SQL_NTS );
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLExecute( hStmt );
if( rc != SQL_SUCCESS ) goto dberror;

rc = SQLEndTran( SQL_HANDLE_DBC, hDbc, SQL_COMMIT );
if( rc != SQL_SUCCESS ) goto dberror;
汎用プログラミングインターフェース情報の終了。