電子書籍の厳選無料作品が豊富!

OSのバージョンUPに伴いoracle、perl、DBI等のバージョンもあげました

perl 5.8.7 DBI-1.52 oracle9i
perl 5.005_03 DBI-1.13 oracle8.0.5

その関係かはよくわからないのですが、エラー処理の実行結果が異なってしましました

$sth = $dbh->prepare("$sql") or die "Cannot prepare: " . $dbh->errstr();
$sth->execute() or die print "データベースエラー";

このSQL文の実行結果はエラーの際、「データベースエラー」というdieメッセージとなります
しかしバージョンをあげた方では、メッセージが表示されません
$sthを出力してみたところ、空でした

エラーでない場合の実行結果は同じになります

原因がわからず困っています
同じようにエラー処理(エラーメッセージを表示させたい)のですが、どのようにしたらよいでしょうか?
どなたかご教授ください
宜しく御願いします

A 回答 (2件)

> -> errstr in DBD::_::common


と出力されているから、
die "Cannot prepare: " . $dbh->errstr();
が実行されてますね。
こちら側でもエラーメッセージを出力すれば良いのでは。

# でも die print はあんまりだと思う。
    • good
    • 0
この回答へのお礼

回答有難う御座います!

そうなんです、バージョンUPした方では「die "Cannot prepare: " . $dbh->errstr();」が実行されているようです
しかしバージョンが低い方では実行されていないようです
この違いがどうして起こるのか不明です

osamuyさんのアドバイスによりテストしてみたところ、確かにここでエラー出力できました
上記の問題が解決されていないので、もう少し検討してみたいと思います
有難う御座いました

お礼日時:2007/01/08 13:57

DBIのトレースをオンにして、何が起きているか確認してみて下さい。

この回答への補足

アドバイスありがとうございます
早速以下のようにトレースをオンにして確認してみました

$dbh->trace(2, 'DBI.trace');
$sth = $dbh->prepare("$sql") or die "Cannot prepare: " . $dbh->errstr();
$sth->execute() or die print "データベースエラー";

結果は以下です

DBI::db=HASH(0x41c0d0) trace level set to 0x0/2 (DBI @ 0x0/0) in DBI 1.52-nothread (pid 12817)
Note: perl is running without the recommended perl -w option
-> prepare for DBD::Oracle::db (DBI::db=HASH(0x3d660c)~0x41c0d0 ' select * from denshi where name <*>like '%'%'')
-> DESTROY for DBD::Oracle::st (DBI::st=HASH(0x41c5bc)~INNER)
ERROR: '911' 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' (err#1)
<- DESTROY= undef at test.pl line 197
!! ERROR: '911' 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' (err#0)
<- prepare= undef at test.pl line 197
1 -> FETCH for DBD::Oracle::db (DBI::db=HASH(0x41c0d0)~INNER 'ParamValues')
ERROR: '911' 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' (err#0)
1 <- FETCH= undef at test.pl line 197
-> errstr in DBD::_::common for DBD::Oracle::db (DBI::db=HASH(0x3d660c)~0x41c0d0)
ERROR: '911' 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' (err#0)
<- errstr= 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' at test.pl line 197
! -> DESTROY for DBD::Oracle::db (DBI::db=HASH(0x41c0d0)~INNER)
ERROR: '911' 'ORA-00911: 文字が無効です。 (DBD ERROR: error possibly near <*> indicator at char 127 in ' select * from denshi where name <*>like '%'%'' (err#0)
! <- DESTROY= undef during global destruction

select文は長文のため短くしてあります
トレースをオンにしてみましたが、扱うのがはじめてなもので、あまり理解できませんでした、すみません
この結果から何かわかりますでしょうか?

oracleでは双方共に「ORA-00911」エラーを返しているのは、SQL文の条件にアポストロフィ'が入っているからで、これはエラーになって正しいです

宜しく御願いします

補足日時:2007/01/05 16:03
    • good
    • 0
この回答へのお礼

すみません、まだ解決していないのですが、補足説明する場所がわからずここに記入させていただきます

上記補足のトレース結果の条件文が間違えていました

where name like '%'%' or code like '%'%'

ただしくはこちらになります

宜しく御願いします

お礼日時:2007/01/05 19:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!