DBI-FAQモジュール Ver.0.38(日本語チョウ訳)

by Hippo2000(2000/7/11)

日本語チョウ訳シリーズ DBI::FAQモジュール(DBIのFAQ)なのです。前回のVer.0.37からの最大の違いは本が出たことでしょう(^^)。

DBI 1.14に含まれているDBI::FAQは0.37です。最新のFAQは、http://www.symbolstone.org/technology/perl/DBI/doc/faq.html から見ることが出来ます。(こちらのほうが最新になります)

これもやっぱり、わかりにくい説明は本物を見てください。(^^;

原本の著作権はAlligator Descartes 氏ほかの方々がお持ちです(詳しくは著作権情報を見てください)。

Alligator Descartes さんからは、最新に合わせるように努力することなどを条件に公開を許可されましています。(そういいながら半年近くも手がでなかった...)

内容等が間違っていたら修正します。ご連絡ください。


目次


名前

DBI::FAQ -- Perl5データベース・インターフェースに対するよくある質問

DBI Frequently Asked Questions v.0.38
Last updated: February 8th, 2000


概要

    perldoc DBI::FAQ

バージョン

このドキュメントは現在 version 0.38, as of February 8th, 2000.です。


説明

このドキュメントはDBIメーリングリストやDBI開発チームのメンバーに個人的によせられたもののうち、特に頻繁に訊ねられた質問に対する回答を提供します。


基本的な情報と情報源


1.1 DBI、DBperl、Oraperl、*perlって何ですか?

DBIの設計者にして作者であるTim Bunceの言葉を借りれば

    "DBI is a database access Application Programming Interface (API)
      for the Perl Language. The DBI API Specification defines a set
      of functions, variables and conventions that provide a consistent
      database interface independant of the actual database being used.''
DBIは、Perl言語のためのアプリケーション・プログラミング・インターフェース(API)です。
DBIは関数、変数、規約などを定義し、実際に使われているデータベースに依存しない一貫性のある
データベース・インターフェースを提供します。

簡単にいえば、DBIインターフェースは複数のデータベース種類へ透過的にアクセスすることを可能にします。そのためOracle、informix、mSQL、Sybaseなどデータベースであればなんであっても接続していれば、3GLレイヤでの仕組みについて知る必要はありません。DBIで定義されてるAPIはすべてのこれらすべてのデータベースで機能します。

同じ様な利点として、2つの異なるベンダーの異なるデータベースに1つのPerlスクリプトで接続できる、つまりOracleデータベースからデータを読み込み、Informixデータベースに入れるのをやりたいといったことを1つのプログラムで可能です。DBIレイヤは簡単にそして強力にこれをできるようにします。

基本的な流れを以下の図で示します。:

[ DBI Architecture ]

DBperl はインターフェース仕様の古い名前です。今では普通oraperl, isqlperl, ingperl などのような、perl4モジュールを示すために使われます。これらのインタフェースは標準となるAPIを持っておらず、通常サポートされていません

DBPerlモジュール、対応するDBI、そしてサポート情報の一覧を以下に示します。この一覧にある作者が、通常、同じデータベースのDBIモジュールをメンテナンスしているというわけではないことにご注意下さい。これらのEメールアドレスは未確認ですし、以下の一覧にあるPerl4モジュールについての問い合わせにだけ使って下さい。DBIドライバの問い合わせはdbi-users メーリングリストへお願いします。

    モジュール  必要なデータベース   作者            DBI
    ----------- -----------------   ------          ---
    Sybperl     Sybase              Michael Peppler DBD::Sybase
                                    <mpeppler@itf.ch>
    Oraperl     Oracle 6 & 7        Kevin Stock     DBD::Oracle
                                    <dbi-users@isc.org>
    Ingperl     Ingres              Tim Bunce &     DBD::Ingres
                                    Ted Lemon
                                    <dbi-users@isc.org>
    Interperl   Interbase           Buzz Moschetti  DBD::Interbase
                                    <buzz@bear.com>
    Uniperl     Unify 5.0           Rick Wargo      None
                                    <rickers@coe.drexel.edu>
    Pgperl      Postgres            Igor Metz       DBD::Pg
                                    <metz@iam.unibe.ch>
    Btreeperl   NDBM                John Conover    SDBM?
                                    <john@johncon.com>
    Ctreeperl   C-Tree              John Conover    None
                                    <john@johncon.com>
    Cisamperl   Informix C-ISAM     Mathias Koerber None
                                    <mathias@unicorn.swi.com.sg>
    Duaperl     X.500 Directory     Eric Douglas    None
                User Agent

しかしながら、いくつかのDBIモジュールはDBPerlエミュレーション・レイヤを持っています。そのためDBD::OracleはOraperlエミュレーション・レイヤを提供しています。これで古いoraperlスクリプトを修正なしに動かすことが出来ます。エミュレーション・レイヤはoraperl API呼び出しをDBI呼び出しに変換し、DBIスイッチを通して実行します。

エミュレーション・レイヤの一覧を以下の表に示します:

    モジュール   エミュレーション・レイヤ  ステータス
    ------          ---------------     ------
    DBD::Oracle     Oraperl             完成
    DBD::Informix   Isqlperl            開発中
    DBD::Ingres     Ingperl             完成?
    DBD::Sybase     Sybperl             作業中? ( 要確認 )
    DBD::mSQL       Msqlperl            DBD::mSQL-0.61で
                                        実験的に提供

Msqlperl エミュレーションは特殊なケースです。MsqlperlmSQLデータベースのためのPerl5ドライバですが、DBI仕様に従っていません。これを使うことはDBD::mSQLの利点に反しています。Msqlperl はCPANのこのアドレスからダウンロードすることができます。:

    http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl

 


1.2. どこで手に入りますか?

Comprehensive Perl Archive Network リソースが、DBIとドライバの最新バージョンが取得されるために使えます。CPANには、以下のアドレスにあるTom Christiansenの すばらしいCPAN multiplexer プログラムを通じてもアクセスすることができます。:

    http://www.perl.com/CPAN/

特定のバージョン情報とドライバの正確なURLについては、以下のアドレスにあるDBIドライバ一覧とDBIモジュールページをご覧下さい:

    http://www.symbolstone.org/technology/perl/DBI

このリストは夜間、CPANからの情報をベースに自動的に生成され、更新されます。


1.3. さらに詳しい情報はどこで手に入りますか?

 

DBIについてはいくつかの情報源があります。

"Programming the Perl DBI"
"Programming the Perl DBI''はAlligator DescartesとTim Bunceによって書かれ、O'Reilly & Associatesから出版されたDBIについての公式な 本です。この本は2000年 2月9日にリリースされました。

目次は以下のようになっています:

    Preface
    1. Introduction
        From Mainframes to Workstations
        Perl
        DBI in the Real World
        A Historical Interlude and Standing Stones
    2. Basic Non-DBI Databases
        Storage Managers and Layers
        Query Languages and Data Functions
        Standing Stones and the Sample Database
        Flat-File Databases
        Putting Complex Data into Flat Files
        Concurrent Database Access and Locking
        DBM Files and the Berkeley Database Manager
        The MLDBM Module
        Summary
    3. SQL and Relational Databases
        The Relational Database Methodology
        Datatypes and NULL Values
        Querying Data
        Modifying Data Within Tables
        Creating and Destroying Tables
    4. Programming with the DBI
        DBI Architecture
        Handles
        Data Source Names
        Connection and Disconnection
        Error Handling
        Utility Methods and Functions
    5. Interacting with the Database
        Issuing Simple Queries
        Executing Non-SELECT Statements
        Binding Parameters to Statements
        Binding Output Columns
        do() Versus prepare()
        Atomic and Batch Fetching
    6. Advanced DBI
        Handle Attributes and Metadata
        Handling LONG/LOB Data
        Transactions, Locking, and Isolation
    7. ODBC and the DBI
        ODBC -- Embraced and Extended
        DBI -- Thrashed and Mutated
        The Nuts and Bolts of ODBC
        ODBC from Perl
        The Marriage of DBI and ODBC
        Questions and Choices
        Moving Between Win32::ODBC and the DBI
        And What About ADO?
    8. DBI Shell and Database Proxying
        dbish -- The DBI Shell
        Database Proxying
    A. DBI Specification
    B. Driver and Database Characteristics
    C. ASLaN Sacred Site Charter
    Index

この本はすべての大きな書店で手に入れることができます。また以下のサイトからオンラインで注文することができます。

O'Reilly & Associates

    http://www.oreilly.com/catalog/perldbi

または Amazon

    http://www.amazon.com/exec/obidos/ASIN/1565926994/dbi

(訳者注:日本語版はただいま作成中とのことです)

POD 文書
POD は文書の固まりで、いつもはPerlプログラムのコードの"その場"に文書があり、埋め込まれています。モジュールのプログラマやユーザに役に立つ資源を提供します。DBIとドライバのためのPODはごくありふれたものになってきています。そしてこれらのモジュールの文書はPerlに入っているperldocプログラムで読むことが出来ます。
 
DBIの仕様
DBI仕様のPODは以下のコマンドで読むことが出来ます:
    perldoc DBI

仕様は"Programming the Perl DBI''の付録Aにも載っています。

Oraperl
DBD::Oracleに同梱されているOraperlエミュレーション・レイヤのユーザは、以下のようにタイプすることでOraperlインターフェースでどのようにプログラムするかを読むことが出来ます:
    perldoc Oraperl

これはKevin Stockが書いたPerl4のための元のoraperlマニュアルページの更新されたコピーを生成します。oraperl APIがすべて表示され、説明がされます。

Drivers
DBDモジュールのユーザはプライベートな関数やそのドライバの癖を以下のようにタイプすることで読むことが出来ます。:
    perldoc <driver>

例えばDBD::mSQL ドライバは、以下のようにタイプするとアクセスすることができるドライバ独自のドキュメントと一緒に提供されています。

    perldoc DBD::mSQL
よくある質問
このドキュメント、よくある質問(=Frequently Asked Questions )はPODドキュメントとして使えます! あなたのシステムで以下のようにタイプすると読むことが出来ます。
    perldoc DBI::FAQ

これは常に、または簡単にインターネットに接続できない人にとってはより便利かもしれません。DBI::FAQ モジュールはより新しいバージョンのためにダウンロードされインストールされなければなりません。

DBI モジュールと一緒に入るDBI::FAQ はちょっとだけ古いかもしれません。

 
POD一般
PODの書き方、POD一般の原則は以下のようにタイプすることにより読むことが出来ます。
    perldoc perlpod
Tkモジュールをインストールしているユーザは、tkpodというTkをベースとしたPODリーダが使えることを聞いて興味をもつかもしれません。これは簡単に読める形にPODを整形します。Tk::PODと呼ばれるモジュールとしてCPANを通じて使うことが出来ます。これを強くお勧めします。
 
ドライバとデータベースの特徴
"Programming the Perl DBI''のAppendix Bのために作成されたドライバの要約が以下のサイトからオンラインで利用できます:
    http://www.symbolstone.org/technology/perl/DBI

のドライバ情報テーブルにあります。これらの要約には利用するデータベースを選ぶときに助けになるであろう、各ドライバとデータベースについての標準化された情報が入っています。ドライバでの論点やドライバがDBI仕様と十分に互換性がないといったことを簡単に知らせもします。

雑談、ちょっとしたニュース、評論
    http://www.symbolstone.org/technology/perl/DBI/tidbits
簡単な点をはっきりさせようとしたり、最新のドキュメントの草案を完璧に仕上げようとするDBIメーリング・リストでのたくさんの人たちからの、その時々の一連の雑談があります。かなりのばらつきがありますが、インターフェースの作業に洞察力を与えています。
 
 
記事
DBIについて書かれた記事のリストがDBI WWWページから見ることができます:
    http://www.symbolstone.org/technology/perl/DBI

これらの記事はAlligatorとTimによって書かれたPerl Journal記事から、より最近のabout.comからオンラインで流れた大失敗まで、年代も品質もバラつきがあります。

READMEファイル
各ドライバに入っているREADME ファイルには、時々(じゃなかった、本当に!)役に立つ情報が入っています。これはユーザにはぴったりかもしれません。それをお読みください。これのおかげで、役に立たない我々の存在が少しはましにしてくれます。これらはメインのDBI WWWページからすべて読むことができます。
    http://www.symbolstone.org/technology/perl/DBI
メーリング・リスト
Ted Lemonによって運営されているDBIのためのメーリングリストが3つあります。これらすべての参加・脱退が以下のURLのWWWからできます。
    http://www.isc.org/dbi-lists.html

参加できるリストは以下の通りです:

dbi-announce
このメールリングリストはアナウンスためだけのものです。トラフィックはほんの少しです。アナウンスは通常、DBI WWWページにも掲載されます。

もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。

  メッセージ本体を'subscribe'として 'dbi-announce-request@isc.org'にEメール
dbi-dev
このメーリングリストは開発者がDBIインターフェース、API、ドライバの仕組みのためのアイデアやコンセプトを議論するために使われることを想定しています。開発者や関心がある人のための集まりです。トラフィックは少しです。

もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。

  メッセージ本体を'subscribe'として'dbi-dev-request@isc.org'にEメール 
dbi-users
このメーリングリストはバグ報告、問題の議論、一般的な問い合わせに使われる一般的な議論のリストです。中規模のトラフィックがあります。

もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。

 メッセージ本体を'subscribe'として'dbi-users-request@isc.org'にEメール 
メーリングリストのアーカイブ
US Mailing List Archives
    http://outside.organic.com/mail-archives/dbi-users/

3つのメーリングリストの検索可能なハイパーメール(hypermail)アーカイブ。かなり古いトラフィックでも閲覧できるようになっているものもあります。

European Mailing List Archives
    http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest

上記のUS archiveと同じ。

 
(訳者注:実際には違うサイトに移っているようです)

コンパイルでの問題


2.1. コンパイルでの問題または「testが失敗する!」

まず最初に、そのドライバのREADMEをみて、その問題に役に立つ情報がないか調べてください。あなたのアーキテクチャとオペレーティング・システムまたはデータベースでは既知のバグかもしれません。あらかじめオンラインにあるREADMEファイルをチェックすることもできます:

    http://www.symbolstone.org/technology/perl/DBI

既知のバグであれば、たぶん修正されるまで待つべきでしょう。もし本当にそれを修正する必要があるのであれば、以下のことに挑戦してみてください。

 
自分で修正してみる
この方法は気の弱い方には普通、お勧めしません。本当に修正がうまくいったと思ったならば、パッチファイル(文脈での差異)を以下の説明と一緒に作者へ送ってください:
作者にEメールする 泣き言はやめて!
障害があるドライバのWWWページに記載されているアドレスにEメールしてください。記載されているものに対応していなければ知っている作者のアドレス直接Eメールするのはやめてください

我々はやらなければならない本来の仕事を持っていることが多く、障害のためのメーリングリストをきちんと読んでいます。それにそのダメになっているプラットホームにはアクセスしたこともないかもしれませんし、なんの助けにもならないかもしれません。厳しく聞こえることは謝りますが、しかしそういうものなのです!

しかし我々がボケっとしている夜中の3時に、あなたが創造の妖精を捕まることができるかもしれません。そして5分以内にパッチをとることができるかもしれません。我々は同じような環境で働いているので、DBIサークルではユーザの障害を正しく認識しようとする雰囲気があります。

作者にEメールしようとするならば、なるべく多くの情報を伝えてください。つまり:

送る情報が多いほど、より早く問題を追いかけることができるこをと忘れないでください。役に立たない情報を送れば、何も返ってこないと思ってください。

最後に、Tim Bunceも含めて、作者によっては直接メールしないように特に要望している人もいることに注意してください。彼らの要望を尊重し、対応するモジュールのREADMEファイルにのっているEメールアドレスを使ってください。

dbi-users メーリング・リストにメールを送る
何か問題があったらメーリングリストにccすることは通常、とても賢明な考えです。作者は全員このリストを読みます。そのためそこへメールすることによって何も失うことはありません。

プラットフォームとドライバについて


3.1 ODBCとDBIは何が違うのですか?

アーキテクチャの面からいえばあまり大きな違いはありません。両方ともプログラミングインターフェースを定義していますし、実際に機能ために複数のドライバをロードすることを可能にしています。

使いやすさの面からいえば大きく違います。DBIはPerl自身のような「上位レベル」インターフェースです。難しいことを可能としながら、単純なことを簡単にしようとしています。ODBCは「下位レベル」インターフェースです。全て(ナットにボルトにノブに文字盤といった=All nuts-bolts-knobs-and-dials.)基本的な部品です。

いまやDBIのためのODBCドライバ(DBD::ODBC)もあります。「何が違うの?」という質問は次の質問としてより多く繰り返されています。

"Programming the Perl DBI''のChapter 7は、この話題についてさらに詳細にカバーしています。ご覧になってください。


3.2 Win32::ODBCとDBD::ODBCは何が違うのですか?

DBIつまりDBD::ODBCは、Win32::ODBCとは違う原理を持っています。

Win32::ODBCモジュールは下位レベルのODBC APIをカバーする"薄い"レイヤです。DBIはより簡単で「より上位のレベル」のインタフェースを定義します。

Win32::ODBCモジュールはより多くのODBC APIへアクセスできるようにします。DBIとDBD::ODBCは基本的なものだけにアクセスできるようにします。(しかしWin32::ODBCとは違ってDBIとDBD::ODBCは、データベースサーバの負荷を減らし、劇的にパフォーマンスを向上させるパラメータの結びつけや複数の準備(prepare)されたステートメントをサポートしています。)

Win32::ODBCモジュールはWin32システムでしか動きません。DBIとDBD::ODBCは非常に移植性が高く、Win32でもUnixでも動きます。

DBIとDBD::ODBCモジュールはWin32のためのPerl5.004バイナリ・ディストリビューションの標準部分として提供されます。(古くて、標準ではないActiveState版では動きません)
(訳者注:ActiveStateでもDBIと一部のDBDが提供されています。ただし古いバージョンのこともあります。)

DBIとDBD::ODBC使って書かれたスクリプトはWin32上でWin32::ODBCよりも速く動き、サポートされている他のデータベースタイプへ簡単に移行することが出来ます。DBIはオプションでエラー時の自動的出力やdie()することを提供しています。これはアプリケーションをより簡単に、より強力にします。現在DBD::ODBCドライバはバージョン0.16は新しく、完全に安定はしていません。新しいリリースでは[次のTPJが出版されるの日と比べて :-]すぐに対応つもりです、そしてより進化し、より多くのODBC機能を提供します。

まとめると:DBIが提供しているよりも多くのODBC APIにアクセスする必要があれば、Win32::ODBCモジュールがベストな選択です。そうでなければDBIとDBD::ODBCの組み合わせが一番なのではないでしょうか。

"Programming the Perl DBI''のChapter 7は、この話題についてさらに詳細にカバーしています。ご覧になってください。


3.3 DBIはWindows95/NTプラットホームでもサポートされていますか?

ついにそうなりました!Jeff Urlwin がこれらのフォーマットでのDBIとDBD::ODBCの構築のためにこつこつと働いてきました。そしてより安定したPerlとMakemakerがついに出来ました。プロジェクトは飛躍的に進行しています。

Win32版のDBIDBD::Oracleは標準のDBI一部となりました。そのためバージョン0.81以降のDBIをダウンロードするとよりより新しいDBD::Oracleバージョンを使うことになります。


3.4 DBIでMicrosoft AccessやSQL-Serverにアクセスできますか?

はい。DBD::ODBCドライバを使って下さい。


3.5 〜というデータベースのためのDBDはありますか?

それはDBIドライバページにのっていますか?

    http://www.symbolstone.org/technology/perl/DBI

もしなければありません。そのページにそのデータベースのドライバが全く載っていないということは、だれもそのために作業をすることをアナウンスしていないということを意味し、そのようなドライバを書くことが出来ないということを意味しません。

以上のことから、もしあなたがそのドライバについてのアナウンスを上記のページ以外で見たとすると、実際にはDBIドライバでないか、仕様を満足していないのかもしれません。このため、そのようなプログラムの問題についての質問はDBIメーリングリストに送られるべきでは本当にありません


3.6 DBMって何ですか?なぜその代わりにDBIを使わなければならないのですか?

"DBI - The Database Interface for Perl 5''からの抜粋:

    "UNIX was originally blessed with simple file-based "databases'', namely
    the dbm system. dbm lets you store data in files, and retrieve
    that data quickly. However, it also has serious drawbacks.
        File Locking
        The dbm systems did not allow particularly robust file locking
        capabilities, nor any capability for correcting problems arising through
        simultaneous writes [ to the database ].
        Arbitrary Data Structures
        The dbm systems only allows a single fixed data structure:
        key-value pairs. That value could be a complex object, such as a
        [ C ] struct, but the key had to be unique. This was a large
        limitation on the usefulness of dbm systems.
    However, dbm systems still provide a useful function for users with
    simple datasets and limited resources, since they are fast, robust and 
    extremely well-tested. Perl modules to access dbm systems have now
    been integrated into the core Perl distribution via the
    AnyDBM_File module.''

 

     "UNIXには簡単なファイルベースのデータベースがあります。名前をdbmシステムといいます。
    dbmにより、データをファイルに格納したり、データを早く取り出したりすることができます。
    しかし、それには重要な欠点も持っています。
        ファイルロック
        dbmシステムは特に強力なファイルロックを許していませんし、[データベースへの]
        同時書き込みにより発生する問題を修正する能力もありません。
        任意のデータ構造
        dbmシステムは1つのキーと値の組という決まったのデータ構造だけを許します。
        値は[C]の構造体のように、複雑なオブジェクトにもすることができますが、キーは
        ユニークでなければなりません。これはdbmシステムの使い勝手には大きな制限です。
    しかし、dbmシステムは、早く強力で非常によくテストされているので、
    簡単なデータセットと限られたリソースでユーザに便利な機能を提供しています。
    dbmシステムにアクセスするためのPerlモジュールはAnyDBM_Fileモジュールを通じて、
    コアPerl配布セットに統合されています。”

要するに、DBMは基本的にリードオンリーのデータベース、または簡単なデータセットを完全に満足させる解決法です。しかし強力なトランザクション的なロックはいうまでもなく、よりスケーラブルなデータセット操作のためには、ユーザにDBIを通じてより強力なデータベース・エンジンを使うことをお勧めします。

"Programming the Perl DBI''のChapter 2は、DBMファイルについて詳しく述べています。


3.7 どのデータベースがお勧めですか?

各データセット、計画される使用法そしてシステム構成が人によって違うので、目指している答えが出しにくく特に難しい領域です。

現在の著者の視点からは、データセットが比較的小さく、テーブルが100万行よりも小さく、データベースのテーブル数が1000よりも少なければ、mSQLは完璧に受け入れられるあなたの問題の解決法でしょう。このデータベースは非常に安く、とても強力で、すぐれたサポートを持っています。さらに詳しい情報が、以下のHughes Technology WWWサイトにあります:

    http://www.hughes.com.au

より強力なデータベースエンジンでmSQLと同じような感じのMySQLを見ることを望むかもしれません:

    http://www.tcx.se

データセットが100万行よりも大きいかテーブル数が1000より多ければ、あるいはよりお金を持っているか、より大きなマシンを持っていれば、Oracle RDBMSをお勧めします。OracleのWWWサイトはさらなる情報のすぐれた情報源です。

    http://www.oracle.com

Informix は、考えるの価値があるもう1つのハイ・エンドなRDBMSです。OracleとInformixとはさまざまな違いがあり、あまりにも複雑なのでこの文書で詳しくのべることはできません。Informixの情報は以下のWWWサイトで見つかります:

    http://www.informix.com

WWWフロントエンド・アプリケーションの場合、CGIスクリプトとOracle RDBMSとの接続時間の遅さや、各Oracleの接続が消費するリソースの量からmSQLがよい選択かもしれません。 mSQL はより軽く、少ないリソースでより速く動きます。

この意見は、他の人の意見を何も代表しませんし、いかなる企業のスポンサーシップや意見も反映していません。まさにそのままです。


3.8 〜という機能はDBIでサポートされていますか?

あなたが要求している機能が標準でない、データベース特有の機能であれば、答えはnoでしょう。

DBIは、ほとんどのデータベースで動く汎用的な APIを反映しており、データベース特有の機能は持っていません。

しかし、ドライバの作者は、もし彼らがそう望むのであれば、DBI APIの中で定義されているfunc()メソッドを通じて、データベース特有の機能を呼び出すための仕組みを入れることができます。スクリプト開発者はfuncメソッドを通じて提供される機能を使うことは、データベースをまたがったが移植できないだろうということに注意して下さい。


プログラムについての質問


4.1 DBIはCGIプログラムに使えますか?

一言で言えば、Yesです!DBIはCGIプログラムではとても便利です!事実、CGIプログラムはDBIの主要な使い道の2つのうちの1つだともいえます。

DBIはCGIプログラマにユーザへのWWWをフロントとしたデータベースのための能力を与えます。それはユーザがそれを使うことが出来るように手入れの行き届いた膨大な量のデータを提供します。もしサイトがデータベースサーバが対処可能な量よりも遙かに多くのトラフィックを受け取るならば、CGIスクリプトを何も変更することなく、データベースサーバをアップグレードすることも、DBIは可能にします。


4.2 DBD::OracleとCGIとの接続はどのようにすれば速くなりますか?

    John D. Groenveldによる回答

Apache httpd はクライアント要求のサービスのためにhttpdの子供のプールを保持します。

Doug MacEachernのApache mod_perl モジュールを使うと、perl インタープリタはhttpdの子供に埋め込まれます。CGI、DBI、その他の好きなモジュールを各子供が起動する時点でロードすることができます。これらのモジュールはディスク上で変更されない限り再ロードされません。

Apacheについてのさらなる情報は,Apache Projectの WWW サイトをご覧下さい:

    http://www.apache.org

mod_perl モジュールは、CPANの以下のアドレスからダウンロードできます。

    http://www.perl.com/cgi-bin/cpan_mod?module=Apache

4.3 DBIとCGIを接続したままにするにはどうすればよいですか?

    John D. Groenveldによる回答

Edmund Merglの Apache::DBI モジュールを使うと、データベース・ログインはhttpdの子供それぞれのハッシュに格納されます。もしあなたのアプリケーションが1つのデータベース・ユーザをベースにしていたら、この接続は各子供によって開始されます。現在、データベース接続はhttpdの子供の間で共有することはできません。

Apache::DBI はCPANの以下のアドレスからダウンロードできます。

    http://www.perl.com/cgi-bin/cpan_mod?module=Apache::DBI

4.4 「コマンドラインでは動くのに、httpdからでは失敗します!」なぜでしょうか?

基本的に、これはそれをコマンドラインから実行したときユーザは、DBD::Oracleの場合であればORACLE_HOME、ORACLE_SID、TWO_TASKといった環境変数が正しく設定されていたために発生するということがよくあります。

httpd プロセスは通常、何も環境変数が設定されていない「だれでもない(=nobody)」ユーザIDの下で起動されます。この状況のもとでスクリプトを実行しようとしても失敗するでしょう。

この問題を解決する方法の一つとして、あなたのスクリプトの最初で、BEGIN{ }ブロックのなかでデータベースのための環境を設定することがあります。もう1つの方法としては、WWWサーバをあなたのCGIスクロプトにある環境変数を渡すように設定することです。

同時に、手がかりを求めてhttpdエラーログファイルや、より詳細な情報のために 「Idiot's Guide To Solving Perl / CGI Problems'」と「Perl CGI Programming FAQ」もチェックするべきです。これはDBI関連の問題ではないようです。

「Idiot's Guide To Solving Perl / CGI Problems'」は以下のアドレスにあります:

The "Idiot's Guide To Solving Perl / CGI Problems'' can be located at:

    http://www.perl.com/perl/faq/index.html

"Perl CGI Programming FAQ''もここにあります。これらの文書を両方とも注意深く読んで下さい!


4.5 SELECTステートメントから返される行の数はどのように取得できますか?

数えて下さい。DBIのドキュメントでrows()メソッドを読んで下さい。


その他の質問


5.1 DBIでマルチスレッドはできますか?

Perl version 5.005 以降では、マルチスレッドをサポートするように作られます。DBI(version 1.02)はまだマルチスレッドをサポートしていません、このため、同時にDBIに1つより多くのスレッドをDBIに入らせるのは安全ではありません。

将来のバージョンでは、既に使われている間はDBIを抑留するスレッドを自動的にブロックすることにより、DBIはスレッド−セーフ(しかしスレッド−ホットではない)になる予定です。

マルチスレッドのSELECTステートメントを持っているOracleのためのOCIの例のコードは以下のアドレスにあります:

    http://www.symbolstone.org/technology/oracle/oci/orathreads.tar.gz

5.2 DBIではBLOBデータをどのように扱えばよいのですか?

DBIでBLOBデータを取り扱うことは、まさにそのままです。BLOBカラムはSELECTステートメントで通常のカラムと同じように指定されます。しかしながら、LongReadLen属性を使ってそのデータベース・ハンドルが取得することができるBLOBの最大の大きさを指定する必要もあります。

例:

    ### $dbh is a connected database handle
    $sth = $dbh->prepare( "SELECT blob_column FROM blobby_table" );
    $sth->execute;

これは失敗します。

    ### $dbh is a connected database handle
    ### Set the maximum BLOB size...
    $dbh->{LongReadLen} = 16384;        ### 16Kb...Not much of a BLOB!
    $sth = $dbh->prepare( "..." );

指定された値よりも大きなカラム値がないのであれば、これは成功します。

もしBLOBデータがLongReadLenの値よりも長ければ、エラーが発生します。しかしながら、もし長ければ取り出されたBLOBをLongReadLenの大きさに自動的に切り捨てるという追加の機能をDBIは提供しています。これはエラーを発生を押さえますが、しかし取り出されたBLOBデータを使い物にならなくするかもしれません。

この動きはLongTruncOk属性によって制御されており、デフォルトではfalseに設定されます(このため長すぎるBLOBの取り出しは失敗します)。

    ### Set BLOB handling such that it's 16Kb and can be truncated
    $dbh->{LongReadLen} = 16384;
    $dbh->{LongTruncOk} = 1;

BLOBデータの切り捨ては、BLOBにランレングス符号化方式のデータが入っている場合には大した問題にはならないかもしれません、しかしZIPファイルのように、データの最後にチェックサムが入っているデータは使い物にならなくなるでしょう。


5.2 DBIでストアド・プロシージャを呼び出すのはどのようにすればよいですか?

DBIはデータベースに依存しないストアド・プロシージャの呼び出し方法を定義していません。

しかし、ほとんどのデータベースがそれらをサポートし、SQLステートメントから呼び出す方法を提供しています−そしてDBIはそれをしっかりとサポートしています。

そこで目標のデータベース、例えばOracleデータベースなどでストアド・プロシージャが作ってあるとすると、$dbh->do()を使ってそのプロシージャをすぐに実行することができます。以下に例をあげます:

    $dbh->do( "BEGIN someProcedure; END;" );   # Oracle特有

prepareとexecuteを使うこともできます、これは何度もプロシージャを呼び出すときにはお勧めです。


5.4 DBIでストアドプロシージャからの戻り値を取得するにはどのようにすればよいですか?

    Jeff Urlwinの回答
    $sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" );
    $sth->bind_param(1, $a);
    $sth->bind_param_inout(2, \$path, 2000);
    $sth->bind_param_inout(3, \$success, 2000);
    $sth->execute;

エラーチェックもお忘れなく!(もしくはRaiseError属性を使って下さい)


5.5 DBIでデータベースの作成、削除はどのようにすればよいですか?

データベースの作成、削除はあまりにも抽象的な概念なので、DBIでは適切にサポートできません。例えば、Oracleはデータベースを削除するという考えを全くサポートしていません。同様にOracleでは、データベースサーバが基本的にデータベースであり、mSQLではサーバ・プロセスはなんの問題もなく、そこで作られたデータベースなしに動きます。この問題はあまりにも異なるために、それなりに価値がある方法では攻略できません。

このため、いくつかのドライバはデータベースの作成、削除はプライベートなfunc()メソッドを通じて提供しています。この機能をサポートしているかについては、使っているドライバのドキュメントをチェックして下さい。


5.6 DBIはcommitまたはrollbackステートメントはどのようにすることができますか?

DBIの仕様の commit() 、rollback() メソッドをご覧下さい。

"Programming the Perl DBI''のChapter 6は、DBIのコンテキストでのトランザクション操作についてより詳しく述べています。


5.7 DBIではNULL値はどのように扱われますか?

DBIでは、NULL値はundefとして扱われるような仕様になっています。NULLはデータベースにNULLとして挿入できます。例えば以下のようにできます:

    $rv = $dbh->do( "INSERT INTO table VALUES( NULL )" );

しかし問い合わせの戻りでは、NULLはundefかどうかで調べます。これは全てのドライバでの標準です。


5.8 funcメソッドはいったい何をするのですか?

func()メソッドは、データベース特有の機能へのエントリ・ポイントとしてDBIの中で定義されています。例えばデータベースの作成、削除といったことです。これらのデータベース特有のメソッドの呼び出しは簡単です。たとえば1つの引数をもつcreateDatabaseメソッドの呼び出しは以下のように書けます:

    $rv =$dbh->func( 'argument', 'createDatabase' );

ソフトウェア開発者はfunc()メソッドがデータベース間で移植性がないことに注意して下さい。


5.9 DBIは2000年以降も大丈夫ですか?

DBIは日付が何であるかを理解する知識を持っていません。このためDBI自身は2000年問題を抱えていません。それぞれのドライバが内部では日付を取り扱うコードを使っているかもしれませんし、このため潜在的には2000年問題の疑いはありますが、しかしこれはありそうもないことです。

以下のアドレスにあるPerl FAQの"Does Perl have a Year 2000 problem?'' (=Perlは2000年問題を抱えていますか?)も読みたいかもしれません:

    http://www.perl.com/CPAN/doc/FAQs/FAQ/PerlFAQ.html

サポートとトレーニング

Perl5データベースインターフェースはフリー ソフトウェアです。いかなる保証もしません。詳細はDBI READMEをご覧下さい。

しかしながら、いくつかの組織がDBIについて技術サポートやトレーニング・プログラムを提供しています。現在作者はこれらのサービスの質がどれくらいのものかを知りません。ここに入っているリンクは参考のためのものであり、なんら推奨するものではありません。自己の責任においてお使い下さい


商用サポート

The Perl Clinic
The Perl ClinicはPerlDBIやそのドライバを含むPerlに関連する問題のサポートを商用で提供しています。サポートはDBIDBD::Oracleの作者であるTim BunceやActiveStateと一緒になって提供されています。サービスについての詳しい情報は以下のURLをご覧下さい:
    http://www.perlclinic.com

トレーニング

Westlake Solutions
Perl CGI開発経験者のためのハンズ−オンクラスで、PerlとDBI.pmを使ったデータベースに接続するCGIスクリプトの書き方を教えます。このコースは、PerlによるCGIスクリプトについての他の4つのコースとともに、Washington, DC; Virginia州Arlington、そして要求に合わせて世界中のオン・サイトで開かれています。
 
詳細については以下のURLをご覧ください:
    http://www.westlake.com/training

その他のリファンレス

このセクションでは、DBIユーザに興味深そうなその他のWWWリンクを提供します。これらは確認されていません、サイトが見つからなかったり、ドキュメントが見あたらなかったりするかもしれません。

    http://www-ccs.cs.umass.edu/db.html
    http://www.odmg.org/odmg93/updates_dbarry.html
    http://www.jcc.com/sql_stnd.html

作者(=AUTHOR)

(原文のまま)

Alligator Descartes <http://www.symbolstone.org/descarte/contact.html>. Portions are Copyright their original stated authors.

訳者注:(あくまでも参考です)
Alligator Descartes <http://www.symbolstone.org/descarte/contact.html>. 一部は元々発言した著者の著作物です。


著作権(COPYRIGHT)

This document is Copyright (c)1994-2000 Alligator Descartes, with portions Copyright (c)1994-2000 their original authors. This module is released under the 'Artistic' license which you can find in the perl distribution.

This document is Copyright (c)1997-2000 Alligator Descartes. All rights reserved. Permission to distribute this document, in full or in part, via email, Usenet, ftp archives or http is granted providing that no charges are involved, reasonable attempt is made to use the most current version and all credits and copyright notices are retained ( the AUTHOR and COPYRIGHT sections ). Requests for other distribution rights, including incorporation into commercial products, such as books, magazine articles or CD-ROMs should be made to Alligator Descartes <http://www.symbolstone.org/descarte/contact.html>.

 

訳者注:(あくまでも参考です)
このドキュメントはAlligator Descartesの著作物(Copyright (c)1994-2000 Alligator Descartes)であり、一部は元の著者の著作物(Copyright (c)1994-2000 their original authors)です。このモジュールはperlディストリビューションでの「Aritistic」ライセンスのもとにリリースされています。

このドキュメントはAlligator Descartesの著作物(Copyright (c)1997-2000 Alligator Descartes)です。全ての権利を有します。このドキュメントの全てあるいは一部を、Eメール、Usernet、ftpアーカイブ、またはhttpで配布することは、料金を要求しないこと、適正に最新のバージョンを使うように努めること、すべての作者、著作権の注意を残すこと(AUTHORとCOPYRIGHTセクション)を備えることで、許可します。書籍、雑誌記事またはCD-ROMのような商品に含める場合には、Alligator Descartes <http://www.symbolstone.org/descarte/contact.html>に別の配布権利を請求する必要があります。


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。