トップページphp
323コメント112KB

Perl::DBI

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/12 23:35ID:xHkBB9i/
DBIでも語ろうぜ

DBI.org
http://DBI.perl.org
DBI-ML-J
http://member.nifty.ne.jp/hippo2000/dbi/dbi_japan.htm
DBI.pm 日本語訳
http://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm
0103nobodyさん03/11/20 16:44ID:???
FreeBSD の compat/linux 環境で Oracle 9i の DBD::Oracle を
build できた経験のある人っていませんか?
0104nobodyさん03/11/20 18:17ID:???
>>102
なんかあちこちで見かけるなw
selectall-xxx とかじゃだめかねえ
0105nobodyさん03/11/20 20:45ID:???
>>104
selectrowにしました。
ありがとうございました。
0106nobodyさん04/01/01 17:37ID:P0LnBj0e
$mydb = DBI->connect("dbi:Pg:dbname=$DB_name","$DB_user","$DB_pwd");
$word = "It's";
$word =~ tr/'/\\\'/;
$sth = $mydb->prepare("insert into $TABLE_name values ('$word');");
$sth->execute() ;
$sth->finish();
$mydb->disconnect();

ってやったとき"It's" の ' が消えて "Its"で登録されちゃうんですけど、どうすれば回避できますか?
$word =~ tr/'/''/; もやったけど、
DBD::Pg::st execute failed: ERROR: parser: parse error at or near "s" at character 86
ってでます。 quoteって関数使えば良いらしいけど、使い方が良くわかりません。
識者の方々殿。 よろしくお願いします。
0107nobodyさん04/01/01 17:59ID:???
>>106
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm

- $word =~ tr/'/\\\'/;
+ $word =~ s/'/\\'/g;
010810604/01/01 18:13ID:P0LnBj0e
>>107
出来たー! 有難う。 昨日からずーーっとこれでハマッってたっす。
ところで - と + ってどういう意味?
010910604/01/01 18:29ID:P0LnBj0e
あ、わかった。 trは1文字づつそれぞれ評価されて置換されるってことね。
AFOでスマソ
0110nobodyさん04/01/01 19:11ID:???
>>108
> ところで - と + ってどういう意味?
unified diff

ところで確認せずに言うけど
$sth = $mydb->prepare("insert into $TABLE_name values (?)");
$sth->execute($word);
ってやったら勝手にエスケープされんかい?
0111nobodyさん04/01/02 18:27ID:???
>>106
「perl dbi プレースホルダ」でググれ
011210604/01/03 12:41ID:2IxFJ5oW
>>110
出来ました。勉強になりました。
ありがとうございます。
0113nobodyさん04/01/15 19:42ID:AedXtgQu
while (@row = $sth->fetchrow_array) {
push @array,$row[0];
}
print join(" ",@array);

これでレコードは全て数値で返ってくるとして、レコードが無い場合には
0を挟むようにしたいのですが、たとえば5個レコードがあると仮定して
3番目がNULLの場合には

3 4 0 52 1

でも実際には

3 4 52 1

と出力されてしまいます。
どうやったらレコードがNULLなのかどうか判断できるのでしょうか。
0114nobodyさん04/01/15 22:17ID:???
push @array,$row[0] ? $row[0] : 0;
011511304/01/15 23:06ID:AedXtgQu
>>114
なるほど。ありがとうございます。

3番目がNULLの場合ではなく、3番以降が全てNULLだとすると

3 4 0 0 0

と期待したいところ、4回目で既にレコードがないためにwhileの
ブロック内が実行されずに

3 4 0

となってしまいました。これを期待通りに出力するにはどうしたら
いいのでしょうか。
0116nobodyさん04/01/15 23:58ID:???
>>115
print join " ", map $_ + 0, @array[0..4];

以降 Perl の基本的な質問はこちらへ。
http://pc2.2ch.net/test/read.cgi/php/1072896288/
011711304/01/16 20:36ID:???
while (@row = $sth->fetchrow_array) {
push @array,$row[0]?$row[0]:0;
}
print join(" ",map $_ + 0,@array[0..4]);
としてみたのですが、レコードが無いと、whileブロック内が実行されないため
3 4 0 52 1
ではなく
3 4 52 1 0
になってしまいました。結局
$sth->fetchrow_arrayが必ずレコードを返すようにselect文を修正しました。
ありがとうございました。
0118nobodyさん04/01/30 01:13ID:???
Apache::DBI 環境下での DBI::Proxy ってどのくらいの枯れぐあいですか?

曖昧な質問しても応えづらいとは思うのですが、
運用されてる方の「幸せになった話」や「なんでやねん話」を
お聞かせ願いたい。
0119nobodyさん04/01/30 09:32ID:???
そもそも mod_perl 自体が枯れてないし。
0120nobodyさん04/01/30 21:29ID:DOZLZjLQ
ageてみるー
0121nobodyさん04/02/01 12:13ID:nycEgmtE
プレースホルダにNULL値をバインドさせたいときはどうやるのでしょうか?
name:text(文字型)
regist:date(日付型)
のとき
$sth = $dbh->prepare("INSERT INTO staff (name, regist) VALUES (?, ?)");
$name= "hoge";
$regist = NULL;
$sth->execute($name, $regist);
だと上手くいかないのです
0122nobodyさん04/02/01 12:57ID:V0LjMB45
Apache::DBI入れてみました。
個々のCGIがDBに接続するときのユーザやパスワードって皆さんどこに書き込んでいますか?
CGIにそれぞれ書き込んじゃってもいいのですが、分散するし危険な気もするので
人目にさらされない場所で一カ所で管理したいと思っています。
みなさんどうやってます?
0123nobodyさん04/02/01 13:16ID:???
>>121
つか多分それ strict 通んないだそ
>>1 にリンクされてる「DBI.pm 日本語訳」ページから 'NULL' を探せ

>>122
接続用のクラスを作ってそこに書き (/usr/local/lib/perl とかどっかその辺に)
DB 使う CGI は全部それを use してる
0124nobodyさん04/02/01 15:55ID:nycEgmtE
>>123
的確な指摘ありがとうございます
バッチリ上手くいきました
0125nobodyさん04/02/05 15:37ID:yM4BLX2X
use DBI;

$DB = "hogedb";
$User = "hogeuser";
$Passwd = "hogepass";

$dbh = DBI->connect("DBI:mysql:$DB:localhost", $User, $Passwd);
$login_id = $dbh->quote($login_id);
$sql = "select Cust_kanji from bb_k where login_id = " . $login_id ;
$sth->prepare($sql);
$sth->execute;

@get_data = $sth->fetchrow_array;
$Cust_kanji = $get_data[0];
$sth->finish;
$dbh->disconnect;

とやってるだけなのに、

Can't call method "prepare" on an undefined value at /u/web/bblabc/cgi-local/friends/intro_popuppreview.cgi line 56.
と怒られてしまいます。

原因として何が考えられるのでしょうか?
いろいろ調べたもののわかりませんでした。

それと不思議なのが、
同じサーバの別のスクリプトで、
DBIでMysqlにつなげて成功している場合があるということです。

どなたか教えていただければ幸いです。
0126nobodyさん04/02/05 17:01ID:???
>>125

$sth って何が入ってるの?
012712504/02/05 17:27ID:???
>>126
$sth->prepare($sql);
じゃなくて、
$sth = $dbh->prepare($sql);
の間違いでした。。。すみません。
まだ、DBI歴2日なもので。。。
ありがとうございます。
0128nobodyさん04/02/07 02:17ID:7x+8FZeN
DBIで掛かった時間て取得できないのでしょうか?
コマンドラインで実行したサイの
「ex:6 rows in set (0.05 sec)」
〜secみたいなやつ
0129nobodyさん04/02/07 18:29ID:???
>>128
かなり昔に使っただけだし若干狙いが違うかもしれないが、DBI配布キットにプロファイラがある。
perldoc DBI::Profile
見てみれ
0130nobodyさん04/02/07 20:40ID:???
>>129
どうもうです。みてみます。
013111804/02/09 22:00ID:r2jpV3Tk
ちまちまApache::DBIを触ってみてるんですが、
これって同じリモートDBマシン上の複数のDBへの接続を
キャッシュできないんですか?

マニュアルには「接続を定義するパラメータは接続属性も含めて
まったく同じでなければなりません」とあり、実際に

 DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge1
 DBI:Proxy:hostname=192.168.0.1;port=1234;dsn=dbi:Pg:dbname=hoge2

という二つの接続属性による接続を作成しても、二つ目はDBIが
panic: DBI active kids..... てな感じでエラーを吐くようなんですが。

すごくそんな訳無いやん、って気もするんですが、
そういうものなんでしょうか?
0132131=11804/02/09 22:14ID:r2jpV3Tk
あ、いや、違いますね。
問題なのはDBI::ProxyかDBDみたい。。。
0133Hippo200004/02/23 00:49ID:IskmOTa+
>>131
テストする直接DBD::Pgを利用するように変えてみては?
DBD::Proxy-DBI::ProxyServerをApache::DBIで利用するのは、ちょっと酷な気がします。
(そっちのほうがボトルネックになるでしょう)
0134Hippo200004/02/23 01:01ID:IskmOTa+
>>96
DBD::ODBCはUnixでも使えますけど?
MDBToolsのプロジェクトがODBCドライバを出したという話は聞いてますし、
先日、Timさんがこんなメール書いてましたけど反応なかったみたいです。

Accessing Access .mdb databases from unix (was: MS Access)
 http://www.mail-archive.com/dbi-dev@perl.org/msg02755.html

MDBToolsのソースを解析しようと思ってたけどODBCドライバがあるなら
もういいかなと。
013513104/02/23 23:50ID:wtoD45ZJ
>>133

DBD::Proxyを使ってみようと思ったのはDBに接続するアプリケーションサーバが
増えたときに、コネクションの制御が(漠然と)しやすいかなと思ったのと、
接続の取得クラスをSingletonパターンで実装するとコネクションプーリングが
実現できるかもしれないかなと思ったためです。
# Apache::DBIをよく理解してなかったことも有りますが...

結局あまり詳しく追求しませんでしたが、動作が不安定なので
とりあえずは直接接続以外の方法は検討しない事にしました。
0136nobodyさん04/03/06 11:22ID:7pY4exk3
すません。質問っす。
たとえばゲームのレビューを書くようなホームページを作ろうとして、
それをhtmlのページのフォームから必要な情報(ゲーム名、ゲーム会社とかレビュー内容とか)を書き込んで
それをサーバー側にデータとして蓄積していきます。
そして閲覧者が見る時に、そのゲーム名やゲーム会社名で検索できるようにするには
どのような技術を使えばよいのでしょうか。
ちなみにperlもいまいちですし、データベースの知識はミジンコくらいです><
環境は…パソコンはXPで、サーバーは有料のレンタルです。そこはperl、phpが使えるようです。
なにとぞm(__)m
0137nobodyさん04/03/06 12:41ID:???
perlかphpを使えばいいじゃん。
0138nobodyさん04/03/06 14:19ID:???
パンが無いのならお菓子を食べればいいのに
0139nobodyさん04/03/06 17:22ID:???
なぜこのスレで聞こうと思ったのかそこに興味がある
0140nobodyさん04/03/06 18:06ID:???
データベースだろうと、勝手に脳内変換して、DBIスレに書き込んじゃったとか。
0141nobodyさん04/03/06 23:21ID:???
あ、ここ場違いだった??><
別で聞きます…すません。
0142nobodyさん04/03/07 01:25ID:???
別で聞いてもオマイの質問じゃ碌な答えはかえらねぇよ
0143nobodyさん04/03/07 02:51ID:FpUwyDyc
DBIじゃなくて、Pgモジュール使ってるんですが、
Perlで扱うスレで誘導されてるんで、こっちで質問させてください。

Perlから、use PgでPostgre SQLにinsertするのを書いているんですが、
なぜか登録できません。(接続はできています。)

登録するカラムが26もあるのが原因なのかと悩んでいるんですが、
何か原因考えられませんか?

ちなみに、カラムを3,4個に減らすと登録できるんです。

使ってるデータ型は、text,smallint,bool,dateだけです。
0144nobodyさん04/03/07 12:49ID:???
登録できない場合にエラーが出てないかをまず確認すること
014514304/03/07 16:36ID:???
if ($result->resultStatus !
014614304/03/07 16:41ID:5iK4kpNa
切れてしまったので、再度

if ($result->resultStatus != PGRES_COMMAND_OK) {

print "$result->resultStatus";

}

を実行したら7と表示されました。(=は半角)

これは、PGRES_NONFATAL_ERRORということでいいのでしょうか?
0147nobodyさん04/03/07 18:28ID:???
>>146
ということでよさげだが、PGRES_NONFATAL_ERROR だけでは何が起きてるのかわからんな…
たぶん詳細なメッセージが stderr なりエラーログなりに出てると思うのだが、確認できん?

なんとなくSQL文の長さ制限に引っかかってるんじゃないかという気がするのだが自信は無い
014814604/03/07 21:16ID:5iK4kpNa
早速のレスありがとうございます。

SQLのstderrはどうしたら見られるのでしょうか…?

トクトクプロフェッショナルでやってるので、telnetは使えるのですが、エラーログとかはルートじゃ無くてもOKなのでしょうか?

SQL文の流さ制限は8KB以下でいいですか?これだと8192文字には行ってないはずです。

モジュールに渡せる制限とかもあるのでしょうか?

色々書いてしまいましたが、御教授お願いします。
0149nobodyさん04/03/07 21:22ID:???
$conn->errorMessage

じゃなかった?

最近はDBI&DBD−Pgばかりだから忘れた
015014804/03/08 04:02ID:???
なんか、深夜にやったら動きました。

自分でもなんでって感じなんですが、サーバーの負荷と関係あるんでしょうか?

ちなみに$conn->errorMessageは使えませんでした。

ともかくプログラム自体は合っているようなので、暫く様子見ることにします。ありがとうございました。
0151nobodyさん04/03/08 06:53ID:???
>トクトクプロフェッショナルでやってるので、
この辺が理由の気がする。
015215004/03/09 05:20ID:???
tok2 proが原因ですか…?

確かについ最近まで設定ミスでRDB使えない設定になってましたし、ずさんなとこが多いのは事実のような。

でも、トラフィックはめちゃめちゃな訳では無いし、安めで色々使えるので気に入ってるのですが、他にオススメのトコありますか?

自鯖立てろは無しで…。
0153nobodyさん04/03/10 10:25ID:???
errstrは?
0154nobodyさん04/03/15 22:17ID:5hxMa2mE
>>152
XREAとかな。
これ以上はレンタル鯖板に行って探すか、
自鯖板行って勉強するかだな。
0155131=13504/03/16 01:14ID:4QG7B2dV
database connection pooling は dbi の世界ではある種宗教的な問題でも
あるようで、この辺↓とか読みつつなるほどと思ったり。
ttp://mathforum.org/epigone/modperl/breetalwox/38B4DB3F.612476CE@acm.org

でも、プールしたいという想いを偽る事ができない方も多いかと思ったので参考まで。

ResourcePool by Markus Winand
ttp://search.cpan.org/~mws/
ttp://www.perldesignpatterns.com/?ResourcePool (ref

Apache-Sybase-ConPool by Michael Peppler
ttp://search.cpan.org/~mewp/

SQL-Relay
ttp://sqlrelay.sourceforge.net/


決してプロセス単位の接続永続化との比較ベンチをとる神光臨を待ってる訳じゃないですw
0156nobodyさん04/03/31 23:28ID:???
mod_auth_dbiのApache2用って無いのかな?
0157nobodyさん04/05/02 03:28ID:???
DBD::Pg使ってますが、executeのあとにfinishしないと
まずかったりしますか?
今書いてるソース、すべてつけていないもので、、、
0158nobodyさん04/05/11 22:42ID:???
某所でスレ違いと言われこちらに誘導されこちらにも書かせてもらいますが、

MySQLをPerlから操作しようとしました。
そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
0159nobodyさん04/05/11 23:50ID:???
DBI落としてきて、make install
0160nobodyさん04/05/12 07:05ID:???
>>159
root権限を持っていないのでその方法では出来ません。
0161nobodyさん04/05/12 09:20ID:???
自分のフォルダへインストールしませう
0162nobodyさん04/05/12 09:20ID:???
s/フォルダ/ディレクトリ/
0163nobodyさん04/05/12 12:09ID:???
perl Makefile.PL したあと、できた Makefile を手で書き換える
0164nobodyさん04/05/12 12:56ID:???
http://member.nifty.ne.jp/hippo2000/perltips/module_install.htm
0165nobodyさん04/05/12 17:30ID:???
DBI mysqlを利用しています。
名前「no」というカラムをauto_incrementで作成してinsertすると
「no」は自動的にインクリメントされていきますがinsertと同時に
今insertしたレコードの「no」を取得する方法はありますでしょうか?
現在は
1,insertする
2,一番最後のレコードの「no」取得する
という方法をしていますがもし1と2の間にinsertされると別の「no」を
取得してしまうことになります。1〜2の間でロックを行えば解決しますが
1回のSQL発行でinsertと「no」の値を取得できるようなことは出来るのでしょうか?
0166nobodyさん04/05/12 17:49ID:???
すみません自己解決しました。
http://dev.mysql.com/doc/mysql/ja/ODBC_and_last_insert_id.html

INSERT INTO GIRLS_DATA (no, name) VALUES(NULL, 'nobodyさん');
SELECT LAST_INSERT_ID();
016715804/05/12 20:10ID:???
>>159-164
無事、使う事ができるようになりました。有難うございました。



ところで、インストールしたファイルにNullP.pmと言うファイルが有りましたが
ガッしておいたほうが良いですか?
0168nobodyさん04/08/05 13:25ID:???
日付の加減算などを行う関数はMySQLとPostgreSQLで異なるようですが
DBIを経由すれば問題なく動くのでしょうか?
0169nobodyさん04/08/06 00:05ID:???
DBI は、プログラマが用意したSQL文をDBMSに投げる部分を共通化しているだけなので、
DBMSの方言に合わせたSQL文を書くのはプログラマの責任

DBIx系だとSQL方言の違いまである程度吸収してくれるモジュールがあるが
日付関数のはさすがに無いかもしれないなあ
017016804/08/09 13:45ID:???
>>169
AUTO_INCREMENTで自動付加された値を取り出す場合、
MySQLの場合「LAST_INSERT_ID()」を使いますが、PostgreSQLの場合は
「curval('targetname')」のように行うようです。
いまはプログラムでDBに合わせてsql文を変えています。(Win環境なのでPostgresSQLは使えません・・・)
このあたりも、DBIが吸収してくれますか?
0171nobodyさん04/08/09 14:59ID:???
SELECT文の実行結果CSV形式のファイルに保存したいのですが
コマンドは用意されていますか?
自分で作るのもそう手間ではないのですが・・・。
0172nobodyさん04/08/19 13:37ID:???
root権限の無い環境で、DBI/DBDを使いたいのですが、
他の環境でコンパイル済みのものをコピーして
パスを通してやれば問題なく動くのでしょうか?
0173nobodyさん04/08/20 00:00ID:???
(´-`).。oO(なぜ試さないのだろう・・・)
0174nobodyさん04/09/23 13:51:31ID:8pWVerC9
age
0175nobodyさん04/11/24 21:43:11ID:???
webProgじゃあないけど、ここが一番perl DBIの話にふさわしそうなので。
DBI:ODBC バグってるっぽい、ってのは気のせいでつか・・・?!
ActivePerl5.8/MySQL4.1.7の組み合わせで使ってて判明
確信持てないのでわかる香具師教えてくらはいな。
my $dataSource = "DBI:ODBC:test";
$dbh=DBI->connect($dataSource, $userName, $pass) || die "connect die:$!";
$sth = $dbh->prepare($query);
$sth ->execute($param) || die $dbh->errstr;
while (@row = $sth->fetchrow_array){
foreach $temp(@row){
print $temp . "\t";
}
}
ってやった結果が変なのでデバッガで見てみたら、@rowの中身が壊れてた。
テーブルの中身はほかのODBCクライアントで確認、異常なし。
壊れてたのは$queryで指定している3番目のカラムで、DB上ではvarchar(20)。
壊れてたデータは、8桁の数字の後に文字列が付いているというもので、数字だけになってた。
foreach部をdumpだっけ、書き換えてDBD側のエラーが出てきたような記憶がある。
それともActivePerl ppmパッケージのみのバグなんでしょうか・・・?
0176nobodyさん04/11/25 03:03:01ID:???
mysql使うならdbimysql使えばいんでないの?
017717504/11/25 09:38:47ID:???
>176
ああごめんなさい、それで動いてからのカキコです。
けど、同じODBC接続でもCSEはちゃんとデータとって来れてるし、あれっ?と思って。
017817504/11/29 23:58:45ID:SyWDmi2S
教えて君上げ
0179nobodyさん04/12/13 09:37:18ID:LQJcn1sJ
DBD::CSVって最新版ではトランザクションは使えるんだっけ?
0180nobodyさん04/12/14 18:00:43ID:gx135s3/
mysqlのバージョンが4.0.22なのですが
TIMEDIFF(expr,expr2)みたいなことをしたい場合どうしたらいいでしょうか。
そうしたい場合はperlで得るepoctimeの値を保存するべき?
0181nobodyさん2005/08/17(水) 02:05:25ID:???
質問したいのですが、テーブルの中の番号フィールドと名前フィールドをSELECTしてきて、
に番号フィールドのデータ全てを配列@aに格納、名前フィールドのデータを@bに格納するには
どう書いたらよいですか??
0182nobodyさん2005/08/17(水) 02:11:32ID:5eFyQrDL
age
0183nobodyさん2005/08/17(水) 03:32:05ID:???
>>181
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+sql
0184nobodyさん2005/08/17(水) 04:51:15ID:E/ZVNZ3K
DBIで、posgreにつなぐ法

よろ
0185nobodyさん2005/08/17(水) 04:52:55ID:???
DBIで、myにつなぐ法
0186nobodyさん2005/08/17(水) 07:12:49ID:???
>>184
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-32,GGLG:ja&q=perl+dbi+postgresql
0187nobodyさん2005/08/20(土) 13:04:16ID:???
DBI::pg:
0188nobodyさん2005/12/02(金) 09:27:57ID:D04WUjX+
DBD::SQLiteがアップデートされたのはいいが、またアトリビュート名がガイドラインにそってないよ。
>$dbh->{unicode} = 1; # fetchしたテキストフィールドのutf8flagがオン
命名のガイドラインに従うなら"sqlite_unicode"だろ。

0189nobodyさん2006/02/24(金) 16:36:16ID:???
DBI::connect でポスグレに繋いだときに、
わざとホスト名を間違えてエラーを出したのに、
undef が帰って来なくて die されてしまうんですがなぜでしょうか?

#!/usr/bin/perl
use strict;
use DBI;
my $dbh = DBI->connect( "dbi:Pg:host=aaaaa;port=5432;dbname=hoge", 'user', 'password' );
my $status = ( $dbh eq undef ) ? $DBI::errstr : 'ok';
print qq(content-type:text/html\n\n);
print $status;
exit;

この実行結果が 500 エラー。
connectできなかったら undef がくるのではないのか…
0190nobodyさん2006/02/24(金) 17:03:13ID:j8E2zsnz
>>189
500エラーだけじゃ情報が少なすぎるので、http鯖の
エラーログを見るか、

use CGI::Carp qw(fatalsToBrowser);

を使うか、自前でconnectをevalの中で実行して$@を
表示してみるなどして、どういうエラーが出てるかを
きちんと調べることをお勧めする。
01911902006/02/24(金) 18:17:21ID:???
connectでエラーが起きたときに undef が帰ってくることを利用して
エラー処理を行おうと思っているのですが、undef が帰ってこなくて悩んでいます。
ですので、エラーの内容は特に何でもいい感じです。

ちなみにエラーの内容は、ホスト名をわざと間違えて実行しているので、
エラーログにももちろん
DBI connect(...) failed: could not translate host name "aaaaa" to address: Name or service not known
が出ます。
(エラーの内容はユーザ名間違いでもなんでもいいです)

参考にしているサイトやオライリーのPerlDBI本では、
undefを見てエラーチェックする例が書かれていたので…



01921912006/02/24(金) 18:25:23ID:???
すいません、190に追記です。

eval , $@ を使えば正しくエラー処理できてますが、
my $dbh = DBI::connect() or mySubRoutine();
のようなことがやりたい感じですが、エラー時でも or以降に行ってくれずdieされてる感じです。
01931912006/02/24(金) 18:26:49ID:???
>>192 は、
×190に追記です。
○191に追記です。

間違いでした。
スレ汚しすいません…
0194nobodyさん2006/02/24(金) 19:02:59ID:???
>>189
option
01951912006/02/24(金) 19:28:07ID:???
>>194

どういう意味でしょうか??
DBI::connect には option 属性がなかったので。
0196nobodyさん2006/02/24(金) 20:46:26ID:???
DBIC のスレきぼん。
0197nobodyさん2006/02/24(金) 22:51:21ID:???
少なくとも手元の環境ではconnect失敗でundefが戻ってきて処理は続くので、
環境やバージョンに依存した何かかね? PrintErrorを0にしないと、warningは
でるけど。あるいは書いてないけどどこかでRaiseErrorを有効にしてるとか?

% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass",); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
DBI connect('host=aaa','user',...) failed: could not translate host name "aaa" to address: Name or service not known
at -e line 1
死んでない
dbh is undef

% perl -e 'use DBI; $dbh = DBI->connect("dbi:Pg:host=aaa", "user", "pass", {PrintError=>0}); print "死んでない\n"; print "dbh ", defined $dbh? "= $dbh": "is undef", "\n";'
死んでない
dbh is undef
0198nobodyさん2006/02/24(金) 23:27:04ID:???
mysql つかっとけ。
01991892006/02/25(土) 21:19:30ID:???
>>197

ご指摘ありがとうございます!

RaiseErrorが有効になっていたので、
無効にしてみたらちゃんとキャッチできました…

なにかものすごい勘違いをしていたようです。

RaiseErrorを無効にしないとdieされるから
キャッチできないってオチですね。

大変失礼しました。
0200nobodyさん2006/03/31(金) 09:14:29ID:3Vb6MUys
Class::DBIをつかってOracle9iにつないでいます。
ORA-01000が出るんですが、原因がわかりません。
常に出るわけではなく、なにをきっかけにしているのか
ずーっと悩んでいます。

Class::DBIを使った場合、カーソルが開く(もしくは閉じる)タイミングというのは
いつになるんでしょうか?

なにかヒントのようなものでもよいので
お願いします。
0201nobodyさん2006/04/12(水) 16:46:12ID:Fg0UYczL
windowsでperlからdbi使ってpostgreSQLに接続しようとすると
perl command line iteratorが落ちてしまいます。
そしてMicrosoftへ連絡させられる・・・。
どのあたりに原因がありそうですか?
postgreにアクセスしないperlプログラムはちゃんと動くし、
pgAdminからならちゃんとpostgreSQLは機能します。
CPAN使ってDBIとDBD-Pgをインストールしました。

windowsでこの環境構築できた人居ますか?
02022012006/04/12(水) 17:35:44ID:Fg0UYczL
×Iterator
○Interpreter
■ このスレッドは過去ログ倉庫に格納されています