DBD-DB2-0.76 > DBD::DB2

名前

DBD::DB2 - DB2 UDBのためのデータベースドライバ

説明

DBD::DB2は、DBIと一緒に使われ、 Perl5をIBMのDB2 Universal Databaseと 通信できるようにするPerl5モジュールです。

一般には、DBDにより提供される機能のほとんどはDBIを通じて間接的に アクセスされます。

概要

  use DBI;
  use DBD::DB2::Constants;
  use DBD::DB2;

  $dbh = DBI->connect("dbi:DB2:db_name", $username, $password);

詳しくはDBIをご覧ください。

  #!/usr/local/bin/perl

  use DBI;
  use DBD::DB2::Constants;
  use DBD::DB2 qw($attrib_int $attrib_char $attrib_float
                  $attrib_date $attrib_ts);

  # 外来の属性型を作成する書き方の例
  $attrib_dec = { %$attrib_int,
                 'db2_type'  => SQL_DECIMAL,
                 'SCALE'     => 2,
                 'PRECISION' => 31 };

  #$DBI::dbi_debug=9; # デバッグの出力を増やす

  #接続をオープンし、カラムの最大サイズにLongReadLenを設定します
  $dbh = DBI->connect("dbi:DB2:sample","","", { LongReadLen => 102400 } );
  if (!defined($dbh)) { exit; }

  # 以下の一連の処理に注意、ステートメントにはパラメータ・マーカーは
  # 何も入っていません。それは実行のための一連の処理になっています。
  # 単にprepareしてexecuteしてください。
  $stmt = "SELECT empno, photo_format FROM emp_photo WHERE
            photo_format = 'gif';";
  $sth = $dbh->prepare($stmt);

  $sth->execute();

  # $row[0]はデータベースからのempnoであり、$row[1]はイメージの型です。
  # この場合、型は常に"gif"になります。
  $stmt = "SELECT picture FROM emp_photo WHERE empno = ? AND
              photo_format = ? ;" ;
  # ステートメントをprepare、2つのパラメータ・マーカーが入っています
  $pict_sth = $dbh->prepare($stmt);
  while( @row = $sth->fetchrow ) {
   # カレント・ディレクトリにempno.typeという名前で出力ファイルを作ります。
    open(OUTPUT,">$row[0].$row[1]") || die "Can't open $row[0].$row[1]";
    binmode OUTPUT;

    # bind_paramを使ってDB2コードにパラメータのための値が入っている変数が
    # どこかを伝えます。加えて、$attrib_*ハッシュの内容をベースに
    # DB2にperlの値をDB2の値に変換する方法を伝えます。
    # 実行のたびに、パラメータ毎に1回のbind_param呼び出します。
    $pict_sth->bind_param(1,$row[0]);
    $pict_sth->bind_param(2,$row[1]);
    $pict_sth->execute();

    # blobを取得するためfetchします
    @row = $pict_sth->fetchrow;

    print OUTPUT $row[0];
    @row = "";

    close(OUTPUT);
    # blobカーソルをクローズします
    $pict_sth->finish();
  }
  # 余分にblobカーソルをクローズします。--無害なはずです。
  $pict_sth->finish();
  # 検索の基準となる選択カーソルをクローズします。
  $sth->finish();
  $dbh->disconnect();

接続属性

以下のDB2接続属性がサポートされています。(接続属性の設定と問い合わせ の情報については、DBIのガイドをご覧ください。)サポートされている値も 示されています:ブール値はPerlのtrueやfalseを示し、 大文字で示されているトークンはDB2の定数です('use DBD::DB2::Constants'が 入っていることを確認してください。)

  db2_access_mode      SQL_MODE_READ_ONLY あるいは SQL_MODE_READ_WRITE
  db2_clischema        文字列
  db2_close_behavior   SQL_CC_NO_RELEASE あるいは SQL_CC_RELEASE
  db2_connect_node     整数 (DBI->connectメソッドで設定されなければいけません;
                       後から変更することはできません)
  db2_current_schema   文字列
  db2_db2estimate      整数
  db2_db2explain       以下の1つ:
                         SQL_DB2EXPLAIN_OFF
                         SQL_DB2EXPLAIN_SNAPSHOT_ON
                         SQL_DB2EXPLAIN_MODE_ON
                         SQL_DB2EXPLAIN_SNAPSHOT_MODE_ON
  db2_info_acctstr     文字列
  db2_info_applname    文字列
  db2_info_userid      文字列
  db2_info_wrkstnname  文字列
  db2_longdata_compat  ブール値
  db2_quiet_mode       整数
  db2_sqlerrp          文字列(読み込みのみ)
  db2_txn_isolation    以下のうちの1つ:
                         SQL_TXN_READ_UNCOMMITTED
                         SQL_TXN_READ_COMMITTED
                         SQL_TXN_REPEATABLE_READ
                         SQL_TXN_SERIALIZABLE
                         SQL_TXN_NOCOMMIT

DB2の古いバージョンでは、全ての属性が使えるわけではありません。 これらの属性についてのさらに詳しい情報は、DB2 Call Level Interface Guide and Reference, Chapter 5. CLI Functions,SQLSetConnectAttr をご覧ください。上記で示された属性名はドキュメントに載っているCLI属性に 似ています(例えば db2_access_modeはSQL_ATTR_ACCESS_MODEと同じです)。

ステートメント属性

以下のDB2ステートメント属性がサポートされています(ステートメント属性 の設定と問い合わせの情報については、DBIガイドをご覧ください。) サポートされている値も示されています:ブール値はPerlのtrueやfalseを 参照しています。

  db2_concurrency               以下のうちの1つ:
                                  SQL_CONCUR_READ_ONLY
                                  SQL_CONCUR_LOCK
                                  SQL_CONCUR_VALUES
  db2_cursor_hold               ブール値
  db2_deferred_prepare          ブール値
  db2_earlyclose                ブール値
  db2_max_length                整数
  db2_max_rows                  整数
  db2_more_results              ブール値 (読込のみ、以下のセクション:
                                  複数のリザルト・セット)
  db2_noscan                    ブール値
  db2_optimize_for_nrows        整数
  db2_prefetch                  ブール値
  db2_query_optimization_level  整数
  db2_query_timeout             整数 (以下の注意をご覧ください)
  db2_retrieve_data             ブール値
  db2_row_number                整数 (読込のみ)
  db2_txn_isolation             One of the following:
                                  SQL_TXN_READ_UNCOMMITTED
                                  SQL_TXN_READ_COMMITTED
                                  SQL_TXN_REPEATABLE_READ
                                  SQL_TXN_SERIALIZABLE
                                  SQL_TXN_NOCOMMIT

これらの属性についてのさらに詳しい情報は、DB2 Call Level Interface Guide and Reference, Chapter 5. CLI Functions, SQLSetStmtAttr をご覧ください。上記で示された属性名はドキュメントに載っているCLI属性に 似ています(例えば db2_deferred_prepareはSQL_ATTR_DEFERRED_PREPAREと同じです)。

注意: 版によってはCLI GuideではSQL_ATTR_QUERY_TIMEOUTが Windows 3.1だけに有効であるといっています。これは正しくありません。 全てのプラットホームで機能します。その本の最近の版では修正されています。

データ・ソース名(=Data Source Names) (DSNs)

あなたがDBI->connect()メソッドで指定したデータベース名は ローカルなカタログに入っているDBデータベース・エイリアスです。 この情報が既にカタログに入っているので、ホスト名やポート番号を 入れません。リモートのデータベースにアクセスするためには、 リモート・ノード、(AS/400、MVSそしてVM/VSEデータベースのための) DCSデータベース、そしてデータベース・エイリアスをカタログに いれてください。クライアント-サーバー間の通信を設定するための 助けとして、DB2 Installation and Configuration Supplement をご覧ください。ホスト・データベースへアクセスすることの情報に ついては、DB2 Connect User's Guideをご覧ください。

DBI->data_sources('DB2') はカタログに入っている全てのデータベースの リストを返します。

パラメータのバインド

DBD::DB2は以下のパラメータをバインドするメソッドをサポートしています:

  入力のみのパラメータ:
  $rc = $sth->bind_param($p_num, $bind_value);
  $rc = $sth->bind_param($p_num, $bind_value, $bind_type);
  $rc = $sth->bind_param($p_num, $bind_value, \%attr);

  入出力用、リファレンスによる出力あるいは入力:
  $rc = $sth->bind_param_inout($p_num, \$bind_value, $max_len);
  $rc = $sth->bind_param_inout($p_num, \$bind_value, $max_len, $bind_type);
  $rc = $sth->bind_param_inout($p_num, \$bind_value, $max_len, \%attr)

属性

属性ハッシュは特定のデータ型についての情報の集まりです。それぞれの 属性はコンパイル時に判定することができます(既に定義されている属性ハッシュ のリストは、DB2.pmをご覧ください)。実行時に作成され、実行時に変更されます。

以下の属性がDBD::DB2によってサポートされています:

  TYPE            SQL_CHAR, SQL_BINARY, SQL_INTEGER など.
  PRECISION       カラムお大きさ
  SCALE           10進数
  db2_param_type  SQL_PARAM_INPUT, SQL_PARAM_OUTPUT など.
  db2_c_type      SQL_C_CHAR あるいは SQL_C_BINARY
  db2_type        TYPEの同意語:SQL_CHAR, SQL_BINARY, SQL_INTEGER など
  db2_file        ブール値。下記参照

後方互換性のため、以下の古い属性名もまだサポートされています。 これらはDBD::DB2の将来のリリースではサポートされないかもしれないことに 注意してください。そのため新しい属性名を使い始めることは良い考えです:

  Stype   db2_typeと同じ
  Prec    PRECISIONと同じ
  Scale   SCALEと同じ
  ParamT  db2_param_typeと同じ
  Ctype   db2_c_typeと同じ
  File    db2_fileと同じ

新しい属性ハッシュを作成する最も簡単な方法は既存のハッシュを 変更することです:

  $new_type = { %$existing_type, 'db2_type' => SQL_"NewTYPE" };

あるいは新しい型の完全に作成することです:

  $attrib_char = { 'db2_param_type' => SQL_PARAM_INPUT,
                   'db2_c_type'     => SQL_C_CHAR,
                   'db2_type'       => SQL_CHAR,
                   'PRECISION'      => 254,
                   'SCALE'          => 0,
                 };

ステートメントが"describe"され、適切な値が使われるので、 一般的には属性は必要ではありません。しかし以下の状況では、属性が 必要とされます:

  - SQLDescribeParamをサポートしていないデータベース・サーバ:
      - DB2 for MVS, 5.1.2より前のバージョン
      - DB2 for VM
      - DB2 for AS/400
  - 登録されていないプロシージャをCALLするステートメント
  - 以下のようなデフォルトではない動きを要望する場合:
      - LOBパラメータに直接ファイルをバインドする
      - 出力のみのパラメータをバインドする

属性が常に必要とされないとしても、"describe"ステップを不要とするため、 それらを提供することはパフォーマンスを改善します。 特に'db2_type'と'SCALE'は両方とも、属性与えられるか、SQLDescribeParamを 通して自動的に取得されなければいけません。

パラメータ・タイプ (入力、出力、そして入出力)

bind_param() は入力のみのパラメータのためだけに使うことが出来ます。 そのためdb2_param_type属性は無視されます。bind_param_inout()は 入出力を想定していますが、属性ハッシュでのdb2_param_typeを通して パラメータを入力のみあるいは出力のみを指示することができます:

  db2_param_type => SQL_PARAM_INPUT

あるいは

  db2_param_type => SQL_PARAM_OUTPUT

bind_param_inout()に与えられる'maxlen'の値が、全てのありうる入力値 だけでなく出力値にも十分に大きくなければいけません。

bind_param_inout()を使ってリファレンスにより入力値をバインドする

この関数は - その名前にもかかわらず - 一度、入力パラメータ変数を バインドすると再びバインドすることなく繰り返し実行することができる ようにするためにも使うことが出来ます。bind_param()を使った以下の 例について考えてみてください:

  $sth->prepare( "INSERT INTO MYTABLE (INTCOL) VALUES(?)" );
  for(...)
  {
    $int = ...;                  # 新しい値
    $sth->bind_param( 1, $int ); # バインドするときに値を設定
    $sth->execute();
  }

繰り返したびに新しい値をバインドします。これを以下の様にして より効率的にすることができます:

  $sth->prepare( "INSERT INTO MYTABLE (INTCOL) VALUES(?)" );
  $sth->bind_param_inout( 1,
                          \$input,
                          20, # いかなるintegerにも20バイトで十分
                          { db2_param_type => SQL_PARAM_INPUT } );
  for(...)
  {
    $input = ...     # 新しい値を設定
    $sth->execute(); # 実行時に新しい値が読み込まれる
  }

変数がリファンレスによってバインドされているために、入力値が バインド字に値がコピーされるbind_param()ではなく、実行時に デリファレンスされていることに注意してください。 'maxlen'の値は全ての予想される入力値に対して十分に大きくなければ いけません。

入力LOBパラメータにファイルをバインドする

属性を以下のように指定することにより、LOBパラメータにファイルを 直接バインドすることができます:

  db2_file => 1

この場合、bind_param()に渡される値はファイル名です。

これは入力でLOBパラメータに対してのみ適切です。便宜上、 以下のあらかじめ定義されている属性ハッシュが提供されています:

  $attrib_blobfile
  $attrib_clobfile
  $attrib_dbclobfile

LongReadLen

LongReadLenのデフォルト値は32700であり、SQL_LONG型の最大サイズと同じ です。これは取り出されるカラムにのみ適用されます;出力パラメータには 適用されません。 このオプションは以下のカラム型に適用できます:

  SQL_LONGVARBINARY
  SQL_LONGVARCHAR
  SQL_LONGVARGRAPHIC
  SQL_BLOB
  SQL_CLOB
  SQL_DBCLOB

値を変更するためには、接続属性で提供してください:

  $dbh = DBI->connect( $db, $user, $pw, { LongReadLen => 100 } );

あるいは接続後のいつれかに設定してください

  $dbh->{LongReadLen} = 100;

LOBデータをバラバラに取り出す

LOBカラムは通常のデータ取り出しメソッドによって完全にサポート されていますが、一度にLOB全体を取り出すさい、(LongReadLen設定に 従って)大量のメモリを食いかねません。代わりの方法として以下のものが あります:

  $buf = $sth->blob_read( $field, $offset, $len );

これは与えられたLOBフィールドから$lenバイトまでを返します。 読み込むデータが残っていなければ、'undef'が返されます。 名前にもかかわらず、この関数は全てのLOB型(BLOB、CLOBそしてDBCLOB)に 機能します。効率を最大限にするため、最初の取り出しで、LOBデータが まったく取り出されないように実行する前にLongReadLenを0に 設定してください(しかしLongReadLenは全ての長い(=long)フィールドに 影響を与えることを忘れないでください)。

現在、DB2は$offsetパラメータを無視します。この関数はDBIで 公式にはドキュメントになっていないことに注意してください。 そのため変更されるかもしません。

複数のリザルト・セット

以下のようにdb2_more_resultsステートメント属性を使って、 複数のリザルト・セットを処理することが出来ます:

  do
  {
    while( @row = $sth->fetchrow_array )
    {
      # 行データを処理する
    }
  } while( $sth->{db2_more_results} );

この属性にアクセスすると、現在のリザルト・セットをクローズし、 新しいものをオープンします。リザルト・セットがもうなければ、 この属性はfalseを返し、stateを02000に設定します。

テーブル情報の取得

$dbh->tablesと$dbh->table_infoの両方がサポートされています。 dbh->tablesにより返されるテーブル名は修飾されています。 つまりそれらは<schema>.<table>という形式になります。属性が何も 指定されなければ、全てのテーブル、ビュー、エイリアスなどの情報が 返されます。DBI 1.14以降では、リストを絞り込むため以下の属性を 使うことが出来ます:

  TABLE_SCHEM  スキーマ名パターン、デフォルトは全てのスキーマ
  TABLE_NAME   テーブル名パターン、デフォルトは全てのテーブル
  TABLE_TYPE   テーブル型;以下のものの1つあるいはカンマで
               区切って複数、デフォルトは全てのタイプ:
               separated by commas, default is all types:
                 TABLE, VIEW, SYSTEM TABLE, ALIAS, SYNONYM

それぞれのパターン引数には以下のものが入ります:

  - 何らかの1文字を表すアンダースコア文字(_)。
  - 0または複数の文字の並びを表すパーセント文字(%)。
    1つの%が入っているパターンの値を与えることは、その
    その引数に空文字列を与えたのと同じであることに注意してください。
  - それら自体を表す文字。文字の場合には重要です。

メタデータ文字(_, %)そのものを扱うためには、その文字の前に バックスラッシュ(\)を付けてください。エスケープ文字そのものは 続けて2回繰り返すことによってパターンの一部として指定することが できます。

例えば、スキーマ'CHOMSKY'のための全てのテーブルとビューのリストを 取得するためには以下のようにします;

  @tables = $dbh->tables( { 'TABLE_SCHEM' => 'CHOMSKY',
                            'TABLE_TYPE'  => 'TABLE,VIEW' } );

スキーマのリストの取得

全てのスキーマのリストを取得するためには、以下の特別な 書き方を使うことができます:

  @schemas = $dbh->tables( { 'TABLE_SCHEM' => '%',
                             'TABLE_TYPE'  => '' } );

あるいは

  $sth = $dbh->table_info( { 'TABLE_SCHEM' => '%',
                             'TABLE_TYPE'  => '' } );

結果にはデータ・ソースのために適切な全てのスキーマが入っています。 DBI 1.14以上が必要です。

テーブル型のリストの取得

サポートされているテーブル型のリストを取得するためには、以下の特別な 書き方を使うことが出来ます:

  $sth = $dbh->table_info( { 'TABLE_TYPE'  => '%',
                             'TABLE_SCHEM' => '',
                             'TABLE_NAME'  => '' } );

結果にはデータ・ソースのために適切な全てのテーブル型が入っています。 DBI 1.14以上が必要です。