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開発チームのメンバーに個人的によせられたもののうち、特に頻繁に訊ねられた質問に対する回答を提供します。
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レイヤは簡単にそして強力にこれをできるようにします。
基本的な流れを以下の図で示します。:
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 エミュレーションは特殊なケースです。Msqlperl はmSQLデータベースのためのPerl5ドライバですが、DBI仕様に従っていません。これを使うことはDBD::mSQLの利点に反しています。Msqlperl はCPANのこのアドレスからダウンロードすることができます。:
http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl
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からの情報をベースに自動的に生成され、更新されます。
DBIについてはいくつかの情報源があります。
目次は以下のようになっています:
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
(訳者注:日本語版はただいま作成中とのことです)
perldoc DBI
仕様は"Programming the Perl DBI''の付録Aにも載っています。
perldoc Oraperl
これはKevin Stockが書いたPerl4のための元のoraperlマニュアルページの更新されたコピーを生成します。oraperl APIがすべて表示され、説明がされます。
perldoc <driver>
例えばDBD::mSQL ドライバは、以下のようにタイプするとアクセスすることができるドライバ独自のドキュメントと一緒に提供されています。
perldoc DBD::mSQL
perldoc DBI::FAQ
これは常に、または簡単にインターネットに接続できない人にとってはより便利かもしれません。DBI::FAQ モジュールはより新しいバージョンのためにダウンロードされインストールされなければなりません。
DBI モジュールと一緒に入るDBI::FAQ はちょっとだけ古いかもしれません。
perldoc perlpod
http://www.symbolstone.org/technology/perl/DBI
のドライバ情報テーブルにあります。これらの要約には利用するデータベースを選ぶときに助けになるであろう、各ドライバとデータベースについての標準化された情報が入っています。ドライバでの論点やドライバがDBI仕様と十分に互換性がないといったことを簡単に知らせもします。
http://www.symbolstone.org/technology/perl/DBI/tidbits
http://www.symbolstone.org/technology/perl/DBI
これらの記事はAlligatorとTimによって書かれたPerl Journal記事から、より最近のabout.comからオンラインで流れた大失敗まで、年代も品質もバラつきがあります。
http://www.symbolstone.org/technology/perl/DBI
http://www.isc.org/dbi-lists.html
参加できるリストは以下の通りです:
もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。
メッセージ本体を'subscribe'として 'dbi-announce-request@isc.org'にEメール
もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。
メッセージ本体を'subscribe'として'dbi-dev-request@isc.org'にEメール
もし上記のWWWページのフォームを正常に使えなければ、以下の方法で参加してください。
メッセージ本体を'subscribe'として'dbi-users-request@isc.org'にEメール
http://outside.organic.com/mail-archives/dbi-users/
3つのメーリングリストの検索可能なハイパーメール(hypermail)アーカイブ。かなり古いトラフィックでも閲覧できるようになっているものもあります。
http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest
上記のUS archiveと同じ。
まず最初に、そのドライバのREADMEをみて、その問題に役に立つ情報がないか調べてください。あなたのアーキテクチャとオペレーティング・システムまたはデータベースでは既知のバグかもしれません。あらかじめオンラインにあるREADMEファイルをチェックすることもできます:
http://www.symbolstone.org/technology/perl/DBI
既知のバグであれば、たぶん修正されるまで待つべきでしょう。もし本当にそれを修正する必要があるのであれば、以下のことに挑戦してみてください。
我々はやらなければならない本来の仕事を持っていることが多く、障害のためのメーリングリストをきちんと読んでいます。それにそのダメになっているプラットホームにはアクセスしたこともないかもしれませんし、なんの助けにもならないかもしれません。厳しく聞こえることは謝りますが、しかしそういうものなのです!
しかし我々がボケっとしている夜中の3時に、あなたが創造の妖精を捕まることができるかもしれません。そして5分以内にパッチをとることができるかもしれません。我々は同じような環境で働いているので、DBIサークルではユーザの障害を正しく認識しようとする雰囲気があります。
作者にEメールしようとするならば、なるべく多くの情報を伝えてください。つまり:
http://www.perl.com/cgi-bin/cpan_mod?module=Devel::CoreStack
送る情報が多いほど、より早く問題を追いかけることができるこをと忘れないでください。役に立たない情報を送れば、何も返ってこないと思ってください。
最後に、Tim Bunceも含めて、作者によっては直接メールしないように特に要望している人もいることに注意してください。彼らの要望を尊重し、対応するモジュールのREADMEファイルにのっているEメールアドレスを使ってください。
アーキテクチャの面からいえばあまり大きな違いはありません。両方ともプログラミングインターフェースを定義していますし、実際に機能ために複数のドライバをロードすることを可能にしています。
使いやすさの面からいえば大きく違います。DBIはPerl自身のような「上位レベル」インターフェースです。難しいことを可能としながら、単純なことを簡単にしようとしています。ODBCは「下位レベル」インターフェースです。全て(ナットにボルトにノブに文字盤といった=All nuts-bolts-knobs-and-dials.)基本的な部品です。
いまやDBIのためのODBCドライバ(DBD::ODBC)もあります。「何が違うの?」という質問は次の質問としてより多く繰り返されています。
"Programming the Perl DBI''のChapter 7は、この話題についてさらに詳細にカバーしています。ご覧になってください。
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は、この話題についてさらに詳細にカバーしています。ご覧になってください。
ついにそうなりました!Jeff Urlwin がこれらのフォーマットでのDBIとDBD::ODBCの構築のためにこつこつと働いてきました。そしてより安定したPerlとMakemakerがついに出来ました。プロジェクトは飛躍的に進行しています。
Win32版のDBI とDBD::Oracleは標準のDBI一部となりました。そのためバージョン0.81以降のDBIをダウンロードするとよりより新しいDBD::Oracleバージョンを使うことになります。
はい。DBD::ODBCドライバを使って下さい。
それはDBIドライバページにのっていますか?
http://www.symbolstone.org/technology/perl/DBI
もしなければありません。そのページにそのデータベースのドライバが全く載っていないということは、だれもそのために作業をすることをアナウンスしていないということを意味し、そのようなドライバを書くことが出来ないということを意味しません。
以上のことから、もしあなたがそのドライバについてのアナウンスを上記のページ以外で見たとすると、実際にはDBIドライバでないか、仕様を満足していないのかもしれません。このため、そのようなプログラムの問題についての質問は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ファイルについて詳しく述べています。
各データセット、計画される使用法そしてシステム構成が人によって違うので、目指している答えが出しにくく特に難しい領域です。
現在の著者の視点からは、データセットが比較的小さく、テーブルが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 はより軽く、少ないリソースでより速く動きます。
この意見は、他の人の意見を何も代表しませんし、いかなる企業のスポンサーシップや意見も反映していません。まさにそのままです。
あなたが要求している機能が標準でない、データベース特有の機能であれば、答えはnoでしょう。
DBIは、ほとんどのデータベースで動く汎用的な APIを反映しており、データベース特有の機能は持っていません。
しかし、ドライバの作者は、もし彼らがそう望むのであれば、DBI APIの中で定義されているfunc()メソッドを通じて、データベース特有の機能を呼び出すための仕組みを入れることができます。スクリプト開発者はfuncメソッドを通じて提供される機能を使うことは、データベースをまたがったが移植できないだろうということに注意して下さい。
一言で言えば、Yesです!DBIはCGIプログラムではとても便利です!事実、CGIプログラムはDBIの主要な使い道の2つのうちの1つだともいえます。
DBIはCGIプログラマにユーザへのWWWをフロントとしたデータベースのための能力を与えます。それはユーザがそれを使うことが出来るように手入れの行き届いた膨大な量のデータを提供します。もしサイトがデータベースサーバが対処可能な量よりも遙かに多くのトラフィックを受け取るならば、CGIスクリプトを何も変更することなく、データベースサーバをアップグレードすることも、DBIは可能にします。
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
John D. Groenveldによる回答
Edmund Merglの Apache::DBI モジュールを使うと、データベース・ログインはhttpdの子供それぞれのハッシュに格納されます。もしあなたのアプリケーションが1つのデータベース・ユーザをベースにしていたら、この接続は各子供によって開始されます。現在、データベース接続はhttpdの子供の間で共有することはできません。
Apache::DBI はCPANの以下のアドレスからダウンロードできます。
http://www.perl.com/cgi-bin/cpan_mod?module=Apache::DBI
基本的に、これはそれをコマンドラインから実行したときユーザは、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''もここにあります。これらの文書を両方とも注意深く読んで下さい!
数えて下さい。DBIのドキュメントでrows()メソッドを読んで下さい。
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
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ファイルのように、データの最後にチェックサムが入っているデータは使い物にならなくなるでしょう。
DBIはデータベースに依存しないストアド・プロシージャの呼び出し方法を定義していません。
しかし、ほとんどのデータベースがそれらをサポートし、SQLステートメントから呼び出す方法を提供しています−そしてDBIはそれをしっかりとサポートしています。
そこで目標のデータベース、例えばOracleデータベースなどでストアド・プロシージャが作ってあるとすると、$dbh->do()を使ってそのプロシージャをすぐに実行することができます。以下に例をあげます:
$dbh->do( "BEGIN someProcedure; END;" ); # Oracle特有
prepareとexecuteを使うこともできます、これは何度もプロシージャを呼び出すときにはお勧めです。
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属性を使って下さい)
データベースの作成、削除はあまりにも抽象的な概念なので、DBIでは適切にサポートできません。例えば、Oracleはデータベースを削除するという考えを全くサポートしていません。同様にOracleでは、データベースサーバが基本的にデータベースであり、mSQLではサーバ・プロセスはなんの問題もなく、そこで作られたデータベースなしに動きます。この問題はあまりにも異なるために、それなりに価値がある方法では攻略できません。
このため、いくつかのドライバはデータベースの作成、削除はプライベートなfunc()メソッドを通じて提供しています。この機能をサポートしているかについては、使っているドライバのドキュメントをチェックして下さい。
DBIの仕様の commit() 、rollback() メソッドをご覧下さい。
"Programming the Perl DBI''のChapter 6は、DBIのコンテキストでのトランザクション操作についてより詳しく述べています。
DBIでは、NULL値はundefとして扱われるような仕様になっています。NULLはデータベースにNULLとして挿入できます。例えば以下のようにできます:
$rv = $dbh->do( "INSERT INTO table VALUES( NULL )" );
しかし問い合わせの戻りでは、NULLはundefかどうかで調べます。これは全てのドライバでの標準です。
func()メソッドは、データベース特有の機能へのエントリ・ポイントとしてDBIの中で定義されています。例えばデータベースの作成、削除といったことです。これらのデータベース特有のメソッドの呼び出しは簡単です。たとえば1つの引数をもつcreateDatabaseメソッドの呼び出しは以下のように書けます:
$rv =$dbh->func( 'argument', 'createDatabase' );
ソフトウェア開発者はfunc()メソッドがデータベース間で移植性がないことに注意して下さい。
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について技術サポートやトレーニング・プログラムを提供しています。現在作者はこれらのサービスの質がどれくらいのものかを知りません。ここに入っているリンクは参考のためのものであり、なんら推奨するものではありません。自己の責任においてお使い下さい
http://www.perlclinic.com
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
(原文のまま)
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>.
一部は元々発言した著者の著作物です。
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>に別の配布権利を請求する必要があります。
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。