Python での結果セットからの行または列のフェッチ

1 つ以上の結果セットを返すステートメントを実行した後、ibm_db API で使用可能ないずれかの関数を使って、返された行を繰り返して取り出します。 大きいデータ (BLOB データや CLOB データなど) を格納する列が結果セットに含まれる場合、メモリー使用量が多くなるのを避けるために、列ごとにデータを取得することができます。

始める前に

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

手順

結果セットからデータをフェッチするには、次のようにします。

  1. いずれかのフェッチ関数を呼び出すことにより、結果セットからデータをフェッチします。
    表 1. ibm_db フェッチ関数
    関数 説明
    ibm_db.fetch_tuple 列位置によって索引付けされた、結果セット内の 1 行を表すタプルを戻します。列には 0 から順に索引が付けられます。
    ibm_db.fetch_assoc 列名によって索引付けされた、結果セット内の 1 行を表すディクショナリーを戻します。
    ibm_db.fetch_both 列名と位置の両方によって索引付けされた、結果セット内の 1 行を表すディクショナリーを戻します。
    ibm_db.fetch_row 次の行または要求された行への結果セット・ポインターを設定します。 この関数を使用して、結果セットを繰り返して取り出します。
    これらの関数は、リストされた引数を受け入れます。
    stmt
    有効なステートメント・リソース。
    row_number
    結果セットから取り出す行の番号。 ibm_db.exec_immediate または ibm_db.prepare 関数の呼び出し時に両方向スクロール・カーソルを要求した場合には、このパラメーターの値を指定してください。 デフォルトの前方スクロール・カーソルを使用すると、フェッチ・メソッドを呼び出すたびに、結果セット内の次の行が戻されます。
  2. オプション: ibm_db.fetch_row 関数を呼び出した場合は、結果セットから繰り返して取り出すたびに、ibm_db.result 関数を呼び出すことにより、指定された列から値を取得します。 行の中の列の位置を表す整数 (0 で始まる)、または列の名前を表すストリングのどちらかを渡すことによって、列を指定できます。
  3. 結果セットの終わりに達したことを示す False がフェッチ・メソッドから戻されるまで、行のフェッチを継続します。

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

例 1: ibm_db.fetch_both 関数を呼び出すことにより、結果セットから行をフェッチします


import ibm_db

conn = ibm_db.connect("database","username","password")
sql = "SELECT * FROM EMPLOYEE"
stmt = ibm_db.exec_immediate(conn, sql)
dictionary = ibm_db.fetch_both(stmt)
while dictionary != False:
    print "The ID is : ",  dictionary["EMPNO"]
    print "The Name is : ", dictionary[1]
    dictionary = ibm_db.fetch_both(stmt)

例 2: ibm_db.fetch_tuple 関数を呼び出すことにより、結果セットから行をフェッチします


import ibm_db

conn = ibm_db.connect("database","username","password")
sql = "SELECT * FROM EMPLOYEE"
stmt = ibm_db.exec_immediate(conn, sql)
tuple = ibm_db.fetch_tuple(stmt)
while tuple != False:
    print "The ID is : ", tuple[0]
    print "The name is : ", tuple[1]
    tuple = ibm_db.fetch_tuple(stmt)

例 3: ibm_db.fetch_assoc 関数を呼び出すことにより、結果セットから行をフェッチします


import ibm_db

conn = ibm_db.connect("database","username","password")
sql = "SELECT * FROM EMPLOYEE"
stmt = ibm_db.exec_immediate(conn, sql)
dictionary = ibm_db.fetch_assoc(stmt)
while dictionary != False:
    print "The ID is : ", dictionary["EMPNO"]
    print "The name is : ", dictionary["FIRSTNME"]
    dictionary = ibm_db.fetch_assoc(stmt)

例 4: 結果セットから列をフェッチします


import ibm_db

conn = ibm_db.connect("database","username","password")
sql = "SELECT * FROM EMPLOYEE"
stmt = ibm_db.exec_immediate(conn, sql)
while ibm_db.fetch_row(stmt) != False:
    print "The Employee number is : ",  ibm_db.result(stmt, 0)
    print "The last name is : ", ibm_db.result(stmt, "LASTNAME") 

次のタスク

データベースへの接続を閉じてもよい状態になったら、ibm_db.close 関数を呼び出します。 ibm_db.pconnect を使って作成された持続的な接続を閉じようと試行した場合、クローズ要求は True を戻しますが、次の呼び出し元は引き続き接続を使用できます。