![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?5a7ff87)
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
---------------
(本文長くてすみません)
No.2ベストアンサー
- 回答日時:
rowsメソッドと同じく、executeが正しく処理レコード数を返すのは、非select文を実行した場合のみです。
select文の場合、rowsもexecuteも0行と認識するDBDが多いです。
で、これはselect文に限らずですが、処理レコード数が0の場合は、0自体ではなく「0E0」を返します。
これは、0を返すと、実行エラー時の戻り値undefと同様、
if ($sth->execute) {} で失敗したのと同じことになってしまうためです。
select文の行数は、fetchしながら行数をカウントするか、取り込んだ、配列、ハッシュの数をカウントするのが一般的な方法ですね。fetchする前に取得する方法はわかりません。
なるほど・・・こう言う事だったのですね。
とても分かり易い説明でした。
fetchしながらカウントするしかないようですね。
ありがとうございました。
No.1
- 回答日時:
いくつも気になる点がありますが...
間違いは、
$sth = dbh->prepare($query);
のdbhは$dbhと書きましょう。
あとは参考までに。
if($sth->rows() != 1) {}
そもそもrowsメソッドはselect分のクエリでは使わないことが強く推奨されています。
ただしい行数を返すDBDはほとんどありません。
エラーチェックは、execute実行時と、$DBI::errで確認するのが基本です。
次に、sql文の最後には;を入れた方がいいでしょう。
$query = qq{ SELECT SYSDATE FROM DUAL; }; のように。
一応、DBIでは実行するようですが、SQL文としては不正確です。
%hash = {%{$rhash}};
ハッシュに入れなおすなら、hashrefを使う意味が無いのでは?
リファレンスのままデータにアクセスするからこそ、スピード的にも、メモリリソース的にも優れたプログラムになるのです。
$rhash->{SYSDATE}と書けばアクセスできます。
この程度の処理であれば、アトミックに
selectall_hashrefメソッドが可読性もよくなり、楽ですよ。prepare、execute、finishと手順を踏む必要が無いので。
この回答への補足
できました。有難うございました。(お恥ずかしい・・・)
で、もう一つお聞きしたいのですが、executeした後、fetchをする前に、
取得したデータ件数を取りたいのですが。
調べた所、$rv = $sth->execute(); と書くと、$rvに処理した件数が格納
されると書いてありました。実際に試した所、$rvには「0E0」と訳分からない
値が返って来ました。(実際は46件のデータが返ってくるSQLを実行しました)
書き方がおかしいのでしょうか?
度々すみませんが、ご教授願えませんでしょうか?
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
perlでmysqlのfetchrowとfetchrow_arrayの違いは何でしょうか
Perl
-
perl 矢印演算子 -> の使い方
CGI
-
perlを使ってレコード件数を取り出してみると、すごい数が・・・。
MySQL
-
-
4
”:”がいっぱいの文について。
Perl
-
5
Can't use string (0") as an ARRAY ref の原因について"
Perl
-
6
JavaScriptでPerlのサブルーチンを呼び出すには?
JavaScript
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cgiでサーバーにファイルを追加...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
[perl] perlで書き込み中に、PC...
-
アルファベットに付いて質問し...
-
AI sisterとは、偽物の人ですか?
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
英数文字列のうちの数値を4桁に...
-
c言語で、チャットシステムに、...
-
テキストファイルで提出とは?
-
Perlでの文字列置換
-
P.Cのシングルチューナーとダブ...
-
同一の検索値が複数存在する場...
-
perl qw 中でコメントアウトす...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fetchrow_arrayとfetchrow_hash...
-
perlからmysqlに接続できない
-
Oracleのデータベースに接続で...
-
逆引きできないホストやIPの制...
-
テキストデータをpostgreSQLの...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
VBでグローバル変数を宣言するには
-
Excel VBA 『Call』で呼び出す...
-
Excel VBA 定義されたプロージ...
-
VBA This Workbookモジュール...
-
ユーザー定義関数に#NAME?が返...
-
VBSがコンパイルエラーになりま...
-
Excel VBAで、ユーザーフォーム...
-
ArduinoのジャイロモジュールMP...
-
LCD ディスプレイを Raspberry ...
-
グラフのX,Y座標を取得したい
おすすめ情報