by Hippo2000(1999/11/25)
DBD::Ingresモジュールのなのです。
なおこのドキュメントではCPANで公開されているDBD::Ingresのドキュメントを日本語化したものです。わかりにくい部分は本物を見てください。(^^;;
原本の著作権はHenrik Tougaardさんがお持ちです。メールで了解をいただきました。
なお内容等が間違っていたら修正します。ご連絡ください
DBD::Ingres - IngresデータベースシステムのためのDBIドライバ
$dbh = DBI->connect("DBI:Ingres:$dbname", $user, $options, {AutoCommit=>0})
$sth = $dbh->prepare($statement)
$sth = $dbh->prepare($statement, {ing_readonly=>1})
$sth->execute
@row = $sth->fetchrow
$sth->finish
$dbh->commit
$dbh->rollback
$dbh->disconnect
and many more
DBD::IngresはIngresデータベースへのアクセスを可能にするPerl拡張です。標準DBI拡張の上に構築されており、DBIが要求するメソッドを実装しています。
このドキュメントでは"本来の"DBDとDBD::Ingresとの違いについて説明します。
Most data is returned to the perl script as strings (null values are returned as undef). This allows arbitrary precision numeric data to be handled without loss of accuracy. Be aware that perl may not preserve the same accuracy when the string is used as a number.
ほとんどのデータは文字列(string)としてPerlスクリプトに返されます(ただしNULL値はundefとして返されます)。これにより数値データの精度を落とすことなく扱うことができます。Perlが文字列を数値として扱う際に、いつでも同じ精度を保つわけではなことには注意してください。
データはCプログラムで埋め込まれたように返されます。
Integerは整数値(PerlでのIV)で返されます。
FloatとDoubleは数値(PerlでのNV)で返されます。
Date、money, char, varchar そして他の型は文字列(PerlでのPV)で返されます。
GET DBEVENT と INQUIRE_INGRES
を保留されているデータベース・イベントを取り出すために呼び出します。引数なしに呼び出すと、ブロックされたGET
DBEVENT WITH WAIT が呼び出されます。引数として数値を指定すると、GET
DBEVENT WITH WAIT= :secondsを呼び出すことになります。INQUIRE_INGRES
が関係する情報を取り出すために呼びされます。それはキーとしてname、database、text、owner、timeを持ったハッシュへのリファレンスとして返されます。値はIngresから受け取られたdbevent* の値です。イベントが取り出されなければ、undefが返されます。使用例についてはt/event.tをご覧下さい。 $event_ref = $dbh->func(10, 'get_dbevent') # 最大10秒間待つ
$event_ref = $dbh->func('get_dbevent') # ブロック
for (keys %$event_ref) {
printf "%-20s = '%s'\n", $_, $event_ref->{$_};
}
connect(dbi:Ingres:dbname[;options] [, user [, password]])
接続へのオプションはデータソース引数で渡されます。この引数は、データベース名が入っていなければいけません。その後ろにセミコロンとデータベース・オプションをつけることができます。
オプションはESQL-connectステートメントで指定するように正確に指定しなければなりません。つまり空白で区切ります。
connectを呼び出すことは以下のconnectステートメントと同じことになります:
CONNECT dbname IDENTIFIED BY user PASSWORD password OPTIONS=options
例えば.
connect("mydb", "me", "mypassword")
connect("mydb;-Rmyrole/myrolepassword", "me")
connect("thatnode::thisdb;-xw -l", "him", "hispassword")
といった具合です。
重要: DBIの仕様では、connectの後、AutoCommit はON となっています。これは通常のIngresのデフォルトに反します。
connect呼び出しは属性{ AutoCommit =
0 } を付けて終わるようにすることをお勧めします。
各呼び出しの後、エラーをチェックしたくなければ、代りに
{ AutoCommit = 0, RaiseError => 1 } を使ってください。こうすればDBI呼び出しが失敗すると、エラーメッセージとともに死にます(die)。
$dbh->do
これは、これが適用するすべての制限とともに'EXECUTE IMMEDIATE'を呼び出すことによって実装しています。
プレースホルダとバインドは$dbh->doではサポートされいません。
行を更新する必要があるならば、以下のいずれかを行うようにしてください:
{ing_readonly => 0}.
が入った$dbh->prepareた呼び出し例
$sth = $dbh->prepare("select ....", {ing_readonly => 0});
は更新のためにオープンされます、以下と同じように
$sth = $dbh->prepare("select .... for direct update of ..")
これに対して
$sth = $dbh->prepare("select .... for direct update of ..",
{ ing_readonly => 1} );
はREADONLY(読み込みのみ)でオープンされます。
実際に更新したいと思うとき、通常はカーソル名を指定する場所に、以下のようにします:
$sth->{CursorName}
その代りに、例えば以下のようにします:
$sth = $dbh->prepare("select a,b,c from t for update of b");
$sth->execute;
$row = $sth->fetchrow_arrayref;
$dbh->do("update t set b='1' where current of $sth->{CursorName}");
この後、以下のようにすることによって、更新の可能性なしにステートメントを再実行することが出来ます:
$sth->{ing_readonly} = 1;
$sth->execute;
注意 updateが今度はSQLエラーとなります。
$sth->{ing_statement} ($)
SQLステートメントのテキストが入ります。通常はデバッグのために使われます。
これはまさに新しくDBIでサポートされた$sth->{Statement}
と同じで、$sth->{ing_statement}
は非難されます。
$sth->{ing_types} (\@)
SELECTステートメントの返されるフィールドの"perl"での型の配列を返します。
型は以下のように表されます:
これらの値は整数として返されます。Perlの整数は少なくとも32ビット長なので、これは精度のロスを起こしません。
これらの値は浮動小数点実数として返されます。これは精度のロスを起こす可能性がありますが、アプリケーションがデータを参照したときにはいずれにせよ起こりうることです。(すべてのIngresツールはこれらの値を浮動小数点実数として取り出します)
$sth->TYPE (\@)
説明はDBIドキュメントをご覧ください。
ingresの変換には以下のものがあります:
私は何か忘れていませんか?
$sth->{ing_lengths} (\@)
Ingresでのフィールドの長さが入った配列を返します。例えばint2は2を、varchar(7)
は7を返すなど。
money と date フィールドは長さを持っておらず、0を返すということに注意してください。
$sth->{SqlLen} は $sth->{ing_lengths}と同じですが、使用しても非難されません。
DBIドキュメントで$sth->{PRECISION}フィールドもご覧下さい。これはmoneyやdateフィールドも含めてすべての型について「理にかなった」値を返します。
$sth->{ing_sqltypes} (\@)
フィールドのIngres型が入った配列を返します。型はIngres SQLリファレンス・マニュアルで書かれている通りに与えられます。
フィールドがNULLである可能性は$sth->{NULLABLE}で返されるので、全ての値は正の値です。
DBIドキュメントの$sth->{TYPE}フィールドもご覧下さい。
$h->state (undef)SQLSTATEはまだ実装されていません。(それほどでない)近い将来に計画されています。
実装されていません。
commit とrollback は開いているカーソルを無効にする
DBD::Ingresは$dbhが開いているカーソルを持っていると、commit、rollbackを発行すると警告します。
おそらく、commit/rollbackは$sthをundefにするでしょう。 (他のドライバが同じ問題を持つでしょうから、これは多分、DBIレイヤでなされるべきでしょう)
commitやrollbackの後、カーソルはすべて->finishされます。つまりそれらは閉じられ、それらから取り出そうとするとDBI/DBDは警告します。
DBD::Ingresの将来のバージョンは、たぶんステートメントを再びprepareするでしょう。
これは以下のことに必要です:
DBIでの新しい機能はDBD::Ingresでは実装されていません。
DBD::Ingressからデータベース・プロシージャを呼び出すことはできません。
DBIからのプロシージャ呼び出しをサポートの解決法は現在進行中です。定義されるまでは、必要が出てくるか、だれかがそれをやろうとするならば、プロシージャコールはDBD::Ingres特有の関数として(get_eventのように)実装されます。
OpenIngresの新しい機能は(まだ)DBD::Ingresでサポートされていません。
これにはBLOBと空間(spatial)データ型が含まれています。
必要が出てくればサポートが追加されるでしょう−必要であれば、ご自分で追加してください (^_^)
何か忘れているんじゃないかと心配しています。
DBIマニュアルにあるDBIドキュメント
(原文のまま)
DBI/DBD was developed by Tim Bunce, <Tim.Bunce@ig.co.uk> who also developed the DBD::Oracle that is the closest we have to a generic DBD implementation.
Henrik Tougaard, <ht@datani.dk> developed the DBD::Ingres extension.
DBi/DBDはTim Bunceによって開発されました、彼はDBD::Oracleも開発しており、それが一般的なDBD実装に最も近いものです。
Henrik TougaardがDBD::Ingress拡張を開発しました。
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。