• ベストアンサー

データベースが返すエラー文字列について

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を出力してみたところ、空でした エラーでない場合の実行結果は同じになります 原因がわからず困っています 同じようにエラー処理(エラーメッセージを表示させたい)のですが、どのようにしたらよいでしょうか? どなたかご教授ください 宜しく御願いします

  • woixu
  • お礼率68% (11/16)
  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

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

woixu
質問者

お礼

回答有難う御座います! そうなんです、バージョンUPした方では「die "Cannot prepare: " . $dbh->errstr();」が実行されているようです しかしバージョンが低い方では実行されていないようです この違いがどうして起こるのか不明です osamuyさんのアドバイスによりテストしてみたところ、確かにここでエラー出力できました 上記の問題が解決されていないので、もう少し検討してみたいと思います 有難う御座いました

その他の回答 (1)

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

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

woixu
質問者

お礼

すみません、まだ解決していないのですが、補足説明する場所がわからずここに記入させていただきます 上記補足のトレース結果の条件文が間違えていました where name like '%'%' or code like '%'%' ただしくはこちらになります 宜しく御願いします

woixu
質問者

補足

アドバイスありがとうございます 早速以下のようにトレースをオンにして確認してみました $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文の条件にアポストロフィ'が入っているからで、これはエラーになって正しいです 宜しく御願いします

関連するQ&A

  • perl >> DBI >> DBD >> oracle8でエラー

    perlからDBI経由でoracleに接続したいのですが、 なぜか DBI->connectのところで失敗して下記のようなエラーが出ます。 `CONNECT ERROR ORA-1034: ORACLE not available oas userでtelnetで入り、直接perl scriptを起動すると問題なく動作するの ですが、なぜかOAS経由でブラウザーからCGIとしてcallすると 失敗するのです。 もう2日も悩んでます。 どなたか原因がわかりましたらご教授ください。 ---- 環境 --- perl 5.005_03 OAS 4.0.8.1 DBI 1.30 DBD-Oracle 1.12 OS solaris2.6 接続先DBは別のsolarisマシンに入ってる。 ----------------ソース----------------------------- #!/usr/local/bin/perl use DBI; $dsn = 'DBI:Oracle:orcl'; $user = 'testuser'; $password = 'testuserpass'; $dbh = DBI->connect($dsn, $user, $password) or die "接続できません"; my $sth = $dbh->prepare("select * from munec"); $sth->execute; while(@row = $sth->fetchrow_array) { print "@row\n"; } ---------------

  • すでに接続してあるデータベースについて

    mysqlデータベースにperlで接続する際は、 use DBI; $dsn="DBI:mysql:database=test:host=localhost"; $dbh = DBI->connect($dsn,user,passwd); とし、データベースに接続して、 $sth = DBI->prepare("SELECT * From `table`); ・・・・・・ と続いていくと思いますが、 すでにデータベースに接続(コネクション)していた場合、どのように書けばいいのでしょうか? どなたかよろしくお願いします。

    • ベストアンサー
    • Perl
  • データベース接続エラー

    質問させて頂きます。 環境はWin98SE ACTIVEPERLです。 mysql4.0です。 次のコードなんですか、 DB接続の部分とSQL実行の部分のエラー処理を消すと正常に動作します。 Perlの場合、どのようにエラー処理を記入したらいいのでしょうか? [コード] #!c:\perl\bin\perl.exe # DBI利用宣言 use DBI; print "Content-type: text/html\n\n"; print "<html><body>\n"; # MySQLに接続 $db=DBI->connect('DBI:mysql:test:localhost','',''); if(!$db){  print "MySQL接続エラー\n";  exit; } # ステートメントハンドルの作成:SQL文の指定 $sth = $db->prepare("select * from test_t"); # SQL実行 if(!$sth->execute()){  print "SQL実行エラー\n";  exit; } # 検索結果を表示 while (@rec = $sth->fetchrow_array()) {  print "id=" . $rec[0] . "\n";  print "name=" . $rec[1] . "\n";  print "<BR>\n"; } # ステートメントハンドルクリア $sth->finish();

    • ベストアンサー
    • Perl
  • Oracleのデータベースに接続できない。

    OS : WindowsXP SP2 Perl : ActivePerl 5.8.8 DBD : DBD-Oracle1.17 DB : Oracle9i PerlでOracleのDBサーバに接続ができません。 ソースは以下の通りです。 ================================================================================ #!perl -w use DBI; $dbh = DBI->connect('dbi:Oracle:test', 'scott/tiger') or die "An error occured : $@"; $dbh->disconnect; exit 0; ================================================================================ 上記コードを実行すると、connectの行でdieします。 ================================================================================ D:\test>perl ttoracle.pl DBI connect('test','scott/tiger',...) failed: ORA-12705: Cannot access NLS data files or invalid environment specified (DBD ERROR: OCISessionBegin) at ttoracle.pl line 5 An error occured : at ttoracle.pl line 5. ================================================================================ Oracleのサーバーはローカルにあり、ポートもデフォルトの設定です。 試しに、 $dbh = DBI->connect('dbi:Oracle:test@localhost:1521', 'scott/tiger') or die "An error occured : $@"; としましたが、結果は同じでした。 また、エラーの内容的に環境変数かと思いORACLE_HOMEを環境変数にセットしてみましたが、これもまた、結果は同じでした。 DBの接続については、sqlplusコマンドからであれば問題なく接続できます。 (コマンド:sqlplus scott/tiger@test) やはり、環境変数まわりの設定が問題でしょうか? よろしくお願いします。

  • fetchrow_arrayとfetchrow_hashrefの使い方

    Jやまとです。 PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。 (1)fetchrow_array使用 (2)fetchrow_hashref使用 以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。 原因が全く分かりません。 分かる方いらしゃいましたら、ご教授願います。 OS:TurboLinux6.2 DB:Oracle8i Apache,PerlはTurboLinux6.2に入っているものをそのまま使用 以下、ソースを記載します。 --------------- (1)fetchrow_arrayを使用して行の値を取得(こっちは動く) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $sql = "SELECT SYSDATE FROM DUAL \n"; $sth = $dbh->prepare( $sql ); $sth->execute or die "Cannot execute. " . $sth->errstr(); $cnt1 =1; while (@row = $sth->fetchrow_array()) { @{$get_date[$cnt1]} = @row; $cnt1++; } --------------- (2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない) $dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr); $query = qq{ SELECT SYSDATE FROM DUAL }; $sth = dbh->prepare($query); $sth->execute(); # 実行 if($sth->rows() != 1){ # 該当する行数 # エラー処理 } $rhash = $sth->fetchrow_hashref(); %hash = {%{$rhash}}; $sth->finish(); $get_date = $hash{SYSDATE}; --------------- (2)実行時のerror_log Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30. Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi --------------- (本文長くてすみません)

    • ベストアンサー
    • Perl
  • 文字セットの変換

    perlCGIでperlDBIからPostgreSQLに接続してデータを文字セットをUTF-8に変換して表示するプログラムを作成していますが、この度、新サーバに移設したところ文字変換がうまくいかないようです。 これまでは、文字セット変換は、 $ENV{'PGCLIENTENCODING'} = 'UTF-8'; でうまく作動しておりましたが、新サーバではだめなようです。 そのため $dbh = DBI->connect("DBI:Pg:dbname=$dbname", "$dbusr", "$dbpas") || die &error(not_connect); $sth = $dbh->prepare( "SET client_encoding TO 'UTF-8' ") || die &error(not_prepare); $sth->execute() || die &error(not_execute); $sth->finish || die &error(not_finish); で変換を試してみましたがこれもだめでした。 なにが原因なのか分かりません。 ご回答をよろしくお願いします。 新サーバの環境は、 OS:Debian sarge PostgreSQL7.4.7 DBI 1-46 DBD 1-41 perl 5.8 です。

  • perlを使ってレコード件数を取り出してみると、すごい数が・・・。

    perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。 use DBI; $dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr; if(!$dbh){ print "エラーです。入力を確認してください。"; exit; }else{ #接続成功 # SELECT文発行 $sth=$dbh->prepare("SELECT sei, mei, mail FROM table"); #実行 $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows, 件\n"; # 開放 $sth->finish; # AUTO COMMITがOFFの場合はCOMMITが必要 $dbh->commit; # 切断 $dbh->disconnect; } 実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか? なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。 プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

    • ベストアンサー
    • MySQL
  • MySQLとの接続でfetchrow_arrayがwhile文で使えない

    こんばんは、皆さん。 MySQLをPerlから使いたいのですが、 以下のようにやっても、$flagに"OK"が入りませんでした。 つまり、whileは一度もループしないで抜けてしまっているようです。 ------------------------------------------------- use DBI; … sub dbtest{ $dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass"); $sql = "select hoge,fuge from t_name where key='value'"; $sth = $dbh->prepare($sql); $sth->execute; while( ($hoge, $fuge) = $sth->fetchrow_array ){     $flag = "OK"; } $sth->finish; $dbh->disconnect; } ------------------------------------------------- ※実際はユーザ名などは変数にしています。 バージョンは現在、 Perl:v5.8.5 MySQL:5.1.6-alpha となっているようです。 それとちょっと別件ですが、 use autouseの書式は以下でよいのでしょうか? 「use autouse DBI;」 しかし、これだけだとDBIが読み込めてないエラーになるようです。 ご教示よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでDBIを使いますが、結果セットをフィールド名でアクセスするには?

    OSはWindowsでAccess2002のデータベースをODBC経由でDBIを用いて、Perlからアクセスします。 以下のように、結果セットをフィールド名でアクセスしたいです。 可能でしょうか? #!/perl/bin/perl #!/usr/bin/perl -w use DBI; # create the DSN connection $dsn = "dbi:odbc:test"; $dbh = DBI->connect($dsn) or die "接続エラー"; $query = "select * from goods;"; # execute the query $sth = $dbh->prepare($query); $sth->execute(); print "no name price\n"; print "--------------------------------------\n"; while(@item = $sth-> fetchrow) { #print "@item[0] @item[1] @item[2]"; #----- 通常はこうだが、 print "$item{'goods_name'} $item{'goods_price'} $item{'auto_no'}"; #----こんな感じで利用したい。 print ("\n"); } # disconnect $sth->finish(); $dbh->disconnect(); exit; __END__

    • ベストアンサー
    • CGI
  • 外部ファイルのインクルードについて

    外部ファイルにデータベースアクセスの為のユーザ情報を書いておき、DB接続が発生するファイルにのみ、インクルードさせたいと考えております。下記のようなプログラムを記述したのですが、エラーが出てしまいました。自分でネットで調べたのですが、間違っていないように感じます。何か、間違っていますでしょうか? my $dbh = DBI->connect部(グローバル変数が読み込めない)でエラーが発生しております。 #!/usr/local/bin/perl use DBI; require 'db.conf'; $ENV{ORACLE_HOME}='/opt/app/oracle/product/9'; my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT * FROM NAME"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ~ 省略 ~ ---------db.confの中身(パーミッション755)--------- my $datasrc = "oracle9"; my $username = "test"; my $password = "password"; 1; #return true ----------エラーログ------------------ Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7. 宜しくお願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう