fetch中にDBアクセス

このQ&Aのポイント
  • PERLでのfetch時に再度DB検索を行いたい場合、注意が必要です。
  • 既存のプログラムに要件を追加し、fetch中にDB検索を行いたい場合には、注意が必要です。
  • $rc = $DBr->fetchrow_hashrefの後にさらにDB検索を行いたい場合、注意が必要です。
回答を見る
  • ベストアンサー

fetch中にDBアクセス

お世話になります。 PERLでなくても、どの言語でもそうだと思うのですが、 通常、Selectで取得したデータを元に再度DB検索に行き、 違うデータを取得したい場合、fetchの中でさらにDB検索を行うかと思います。 (あまり処理としてはよくないとは思うのですが) 今回既存のプログラムに要件を追加するのですが、その際 上記のような処理を行いたいと考えています。 しかし既存のプログラムを見ているとそういう例がひとつもありません。 それがたまたまなのか、意図的なのかはわかりませんが、 意図的だとするとなにか理由があるのでは?と思い、投稿しました。 while ($rc = $DBr->fetchrow_hashref) {  while ($rc2 = $DBr->fetchrow_hashref){    } } というようにしたいのですが、1つ目の$DBr->finish が行われる前には PERLではできないよ、ということがあれば教えてください。 よろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

>1つ目の$DBr->finish が行われる前には >PERLではできないよ、ということがあれば教えてください。 通常の手順通りに呼び出すのであれば、多重ループの複数箇所で fetchしても動作はします。 ただ、その例だと、一つ目のwhileは1度評価されたあとは、 残りを2つ目のwhileが処理するので、実質的に、多重ループに なっていないように見受けます。

cshoaucmoa
質問者

お礼

返答ありがとうございます。 すみません。2回とも$DBrに対してfetchをかけている ので、結果として同じことになってしまっているってことですよね。 私の行いたかった処理は my(%REC); my(%SQLPARAM); my(@LIST); ---ここで★DB読み込み処理(prepare , execute等) while ($rc = $DBr->fetchrow_hashref) {  $REC{HOGE} = $rc->{'hoge'};  #読み込んだレコードを次のSQLパラメーターとしてセット  $SQLPARAM{HOGE} = $REC{HOGE};  ---ここで★2個目のDB読み込み処理(prepare , execute等)  while ($rc2 = $DBr2->fetchrow_hashref){   pushi(@LIST,$rc2);  } } といった処理を行いたかったのです。でもどうもできそうですね。 ありがとうございました。

関連するQ&A

  • スカラーをハッシュのように扱えるのでしょうか

    お世話になります。既存のプログラムを読んでいて下記のような 個所を見つけました。 ---------------------------------------------  ★この前にDBアクセス処理(prepare execute等)  undef @JCOL;  while ($rc = $DBr->fetchrow_hashref) {   my($REC);   $REC->{YEAR} = $rc->{'年度'};   $REC->{BUNYA} = $rc->{'分野名称'};   push(@JCOL, $REC);  }  $DBr->finish;  return (1, \@JCOL); } --------------------------------------------- 私がこの3ヶ月独自で勉強してきた中で上記のような場合は   my($REC); ではなく   my(%REC); で、$REC{YEAR}という中に代入していたのですが、 上記のような形は初めてで戸惑っています。 動いてるプログラムなので、これでもよいのかもしれませんが、 スカラー変数にキーを持たせることができるのでしょうか? また、  $REC{YEAR}= $rc->{'年度'}; とするのとはどのように違うのですか? よろしくお願いいたします。

  • PEAR DBでの行取得について

    PEAR::DBにてテーブルの内容は現在下記のようにしておりますが 明示的に例えば2行目のデータを取得したい場合はどのようにすれば良いでしょうか。 $res =& $db->query('select * from shouhin'); while ($row =& $res->fetchRow()) { }

    • ベストアンサー
    • PHP
  • 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
  • ハッシュのキー追加について

    とある既存プログラムに機能追加したいのですが上手くいきません。 ハッシュだとは思うのですが、%だったり$だったりしてよくわからなくなってしまいました。 どこがおかしいか教えていただけないでしょうか。 <概要> もともとあった(1)と(3)の処理の間に、(2)を行う <ソース> (1)DBから1レコードを取得する $sql = "select * from tenpo where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); $shop = $sth->fetchrow_hashref(); (2)別TABLEから値を取得し、(1)に追加する $sql = "select todoufuken from area where id=5;"; $sth = $dbh->prepare($sql); $sth->execute(); @todoufuken= $sth->fetchrow_array; $shop{place} = $todoufuken[0]; (3)$shopの情報をサブルーチンに渡す ソース略

    • ベストアンサー
    • Perl
  • PerlとWin32::ODBCを使ってDBにアクセスするときに出るエラー

    こんばんわ。最近、Perlを使い始めたばかりの初心者です。解決方法がわからないので、教えて下さい。 PerlとWin32::ODBCを使ってDBにアクセスするプログラムを組んでいるます。DB接続まではうまくいくのですが、それ以降に以下のようなエラーがでます。モジュールが足りないようなのですが、どのようにして解決すればよいかわかりません。以下にエラーとコードを記入します。 コード: #!/usr/local/bin/perl $DSN = "DSN=DB1;UID=kaki388"; use Win32::ODBC; if (!($0 = new Win32::ODBC($DSN))){ print Win32::ODBC::Error(); print "失敗"; exit(); } print "成功"; $sql = "SELECT * FROM tbl1"; $0->run("$sql"); $0->sql("$sql"); @fn = $0->FieldNames(); while($0->FetchRow()){ undef %Data; %Data = $0->DataHash(); print "$Data{$fn[$i]}<BR>\n"; } $0->Close; エラーコード: 2004/08/26(11:49:14) W-SV 127.0.0.1 [80] E200042 "Can't locate object method "run" via package "Win32::ODBC=HASH(0x275020)" (perhaps you forgot to load "Win32::ODBC=HASH(0x275020)"?) at odbc.cgi line 11. " よろしくお願い致します。

    • ベストアンサー
    • Perl
  • DB検索の結果について

    PerlでDB検索をし、結果を画面に表示させるというプログラムを作成しているのですが、なぜか検索結果が1件の時は結果の表示がされないという現象が起こっています。複数件の時は、表示されるのですが。 プログラムは下記のようなものです。 ●入力画面から検索する文字列($name)を取得します。 #my $sql = "SELECT AAA FROM PRODUCT WHERE XXX '%$name%'"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ●一致したデータを書き出します。 print "検索製品は、$name<P>"; while(@results = $sth->fetchrow) { @results = $sth->fetchrow; print @results, "\n<P>"; print $count, " 件完了<P>"; $count++; } print "合計 $count 件、見つかりました!"; <一件の結果> 検索製品は、12345で 1 件見つかりました! <複数件の結果> 検索製品は、12345で 12345製品A 件完了 12345製品B 2件完了 12345製品C 3件完了 12345製品D 4 件見つかりました! 上記のような結果です。検索結果1件の時はデータが表示されず、2件以上の時も表示件数、合計件数は合っていますが、$countの動作がおかしいです。("件完了"になってしまう) コードの記述の仕方に問題があるのでしょうか?おわかりの方がいらっしゃいましたら、ご教授頂けると幸いです。宜しくお願い致します。

  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • ループ処理の中におけるDB接続について(java)

    ループ処理の中におけるDB接続について、接続→切断を繰り返すと処理速度が落ちますよね。 これを回避するにはSQLでできる限り取得するのが良いと思われますが、その他にプログラムで 回避することはできますかね? whileの中でさらにSQLを使用する必要があります。 どなたかご教授願います。

  • 一回の処理で、2回以上データベースに対してアクセスできない??(perlDBIを使用)

    質問があるのですが、よろしくお願いします。 use DBI; $dbuser = 'root'; $passwd = 'abc'; $db = DBI->connect('DBI:mysql:DB:localhost',$dbuser, $passwd); $prepare = "select MAIL from user where USER_ID = $userid"; $sth->prepare("$prepare"); $sth->execute; @user = $sth->fetchrow_array; $sth->finish; while( ($key, $value) = each %in ){ $sth = $db->prepare("UPDATE user SET $key = '$value' where USER_ID = $in{userid}"); $sth->execute; $sth->finish; } $db->disconnect; という処理を行わせたいのですが、どうもUPDATE文の辺りで、処理が止まってしまっているようなのです。select文はしっかり実行されている形跡があるのですが、1回の処理で2回以上データベースに対してアクセスすることは出来ないのでしょうか? どなたか分かる方いらっしゃいましたらご教授のほどよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで別テーブルの参照

    こんにちは。 PostgreSQL+Perl+DBIでCGIを書いています。 テーブルからデータを取得する場合なのですが、table1にはIDのみが登録されていて、table2には、そのIDに対する文字列が登録されているとします。 このような場合に、tableからIDを取得して、そのIDに対するtable2の文字列を一気に取得することは可能でしょうか? つまり、 $dbh=DBI->connect(~); $sth=$dbi->prerare("SELECT id FROM table1 WHERE ~;"); $sth->excecute(); $id=$sth->fetchrow; $sth->finish(); $sth=$dbi->prerare("SELECT str FROM table2 WHERE id=$id;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); といった処理をこんな感じに一度に行いたいのです。 $dbh=DBI->connect(~); $sth=$dbi->prerare("~~~~~;"); $sth->excecute(); $str=$sth->fetchrow; $sth->finish(); $dbh->disconnect(); 可能かどうかもわからないのですが、なにか良い方法はありますでしょうか?よろしくお願いします。

専門家に質問してみよう