Python でのストアード・プロシージャーの複数の結果セットの取得 (ibm_db2)

1 回のストアード・プロシージャー呼び出しによって複数の結果セットが戻される場合、ibm_db API の ibm_db.next_result 関数を使用して結果セットを取得することができます。

始める前に

複数の結果セットを持つ ibm_db.exec_immediate または ibm_db.execute 関数によって戻されるステートメント・リソースが必要です。

プロシージャー

複数の結果セットを取得するには、次のようにします。

  1. リストされた ibm_db フェッチ関数のいずれかを呼び出すことによって、プロシージャーから戻される最初の結果セットから行をフェッチします。 その際、ステートメント・リソースを引数として渡します。 (プロシージャーから戻される最初の結果セットはステートメント・リソースに関連付けられます。)
    表 1. ibm_db フェッチ関数
    関数 説明
    ibm_db.fetch_tuple 列位置によって索引付けされた、結果セット内の 1 行を表すタプルを戻します。 列には 0 から順に索引が付けられます。
    ibm_db.fetch_assoc 列名によって索引付けされた、結果セット内の 1 行を表すディクショナリーを戻します。
    ibm_db.fetch_both 列名と位置の両方によって索引付けされた、結果セット内の 1 行を表すディクショナリーを戻します。
    ibm_db.fetch_row 次の行または要求された行への結果セット・ポインターを設定します。 この関数を使用して、結果セットを繰り返して取り出します。
  2. 元のステートメント・リソースを最初の引数として ibm_db.next_result 関数に渡すことにより、後続の結果セットを取得します。 結果セットからフェッチできる行がなくなるまで、ステートメント・リソースから行をフェッチすることができます。

    取得できる結果セットがなくなった場合、またはプロシージャーが結果セットを戻さない場合に、ibm_db.next_result 関数は False を戻します。

    ibm_db API について詳しくは、 http://code.google.com/p/ibm-db/wiki/APIsを参照してください。

ストアード・プロシージャーの複数の結果セットの取得

import ibm_db
conn = ibm_db.connect( "sample", "user", "password" )
if conn:
    sql = 'CALL sp_multi()'
    stmt = ibm_db.exec_immediate(conn, sql)
    row = ibm_db.fetch_assoc(stmt)
    while row != False :
        print "The value returned : ", row
        row = ibm_db.fetch_assoc(stmt)
    
    stmt1 = ibm_db.next_result(stmt)
    while stmt1 != False:
        row = ibm_db.fetch_assoc(stmt1)
        while row != False :
            print "The value returned : ", row
            row = ibm_db.fetch_assoc(stmt1)
        stmt1 = ibm_db.next_result(stmt)

次の作業

データベースへの接続を閉じてもよい状態になったら、ibm_db.close 関数を呼び出します。 ibm_db.pconnectを使用して作成した持続接続を閉じようとすると、クローズ要求は True を返し、 IBM データ・サーバー・クライアント接続は次の呼び出し元で使用可能なままになります。