- ベストアンサー
データベースが返すエラー文字列について
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を出力してみたところ、空でした エラーでない場合の実行結果は同じになります 原因がわからず困っています 同じようにエラー処理(エラーメッセージを表示させたい)のですが、どのようにしたらよいでしょうか? どなたかご教授ください 宜しく御願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> -> errstr in DBD::_::common と出力されているから、 die "Cannot prepare: " . $dbh->errstr(); が実行されてますね。 こちら側でもエラーメッセージを出力すれば良いのでは。 # でも die print はあんまりだと思う。
その他の回答 (1)
- guci-ok
- ベストアンサー率33% (49/146)
DBIのトレースをオンにして、何が起きているか確認してみて下さい。
お礼
すみません、まだ解決していないのですが、補足説明する場所がわからずここに記入させていただきます 上記補足のトレース結果の条件文が間違えていました where name like '%'%' or code like '%'%' ただしくはこちらになります 宜しく御願いします
補足
アドバイスありがとうございます 早速以下のようにトレースをオンにして確認してみました $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文の条件にアポストロフィ'が入っているからで、これはエラーになって正しいです 宜しく御願いします
お礼
回答有難う御座います! そうなんです、バージョンUPした方では「die "Cannot prepare: " . $dbh->errstr();」が実行されているようです しかしバージョンが低い方では実行されていないようです この違いがどうして起こるのか不明です osamuyさんのアドバイスによりテストしてみたところ、確かにここでエラー出力できました 上記の問題が解決されていないので、もう少し検討してみたいと思います 有難う御座いました