- PR -

PerlからDBへの接続確認

1
投稿者投稿内容
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-02-14 19:29
いつもお世話になっております。

件名について、Perlの問題なのでこちらで質問してよいか迷ったのですが、Linuxで動かしているため投稿させて頂きました。間違えていたら、ご指摘のほど宜しくお願い致します。

Perl5.8とperl-DBIとDBD::oracleでOracle10gに接続することが一応出来ました。
insert文は正常に動くのですが、select文でエラーMSGが出力されてしまいます。

ファイル名は、testsample.pl
コード:

use DBI;
#データベース名
$ds = "dbi:Oracle:TEST";
#ユーザ名
$user 'camekichi';
#パスワード
$passwd 'came@TEST';
#コネクション
$db = DBI->connect($ds, $passwd)
#準備@
$sth = $db->prepare(select * from came);
my @results;
while(@results = $sth->fetchrow){
print "@results\n";
}

#準備A
$sth = $db->prepare("insert into came values(1,'came1')");

#sql実行
$sth->execute;
#ステートメントの終了
$sth->finish;
#データベースハンドルオブジェクトの終了
$sth->disconnect;



#準備@とAは、片方をコメントにして実行してます。
#準備AのSQLは、正常に動作したことをTBLを見て確認しました。
#準備@は、while文でエラーが発生しました。

エラーMSG(1)
コード:

DBD::oracle::st fetchrow failed:ERROR no statement executing (perhaps you need to call ececute first) [for statement ''select * from came'' with params: ]) at testsample.pl line 13


エラーMSGを大雑把に翻訳してみたら、【DBD::oracle::st】をインポートしないといけないと思い、追加してみました。
コード:

use DBI;
use DBD::oracle::st;

以下、省略



実行してみたのですが、別のエラーMSGが表示されてしまいました。
エラーMSG(2)
コード:

Can't locate DBD/Oracle/st.pm @INC contains: /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.0/i386-linux-thread- /usr/lib/perl5/5.8.0 .) at testsample.pl line 2



質問内容
@select文を使用するのに、DBIのメソッドを使用しているのですが、【DBD::oracle::st】をインポートする必要があるのでしょうか?
サンプルソースはネットで見つけたのですが、インポートするようなことはしていませんでした。
A@で必要になった場合、st.pmファイルは必要なのでしょうか?
参考URL
http://www.geocities.co.jp/SiliconValley-Bay/1428/perl/perl_DBI.html


申し訳ありませんが、ご教授の程宜しくお願い致します。
内容に不備、不明な点が御座いましたら、ご指摘の程宜しくお願い致します。

顔文字を使用しないようにしました。

[ メッセージ編集済み 編集者: カメ吉SE 編集日時 2007-02-14 19:32 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-02-14 19:46
引用:

カメ吉SEさんの書き込み (2007-02-14 19:29) より:
コード:
no statement executing (perhaps you need to call ececute first) [for statement ''select * from came'' with params: ]) at testsample.pl line 13





ということなので、prepareしたあとでexecuteしないとfetchrow出来ないのでは?

(蛇足)
DBD/oracle/stのuseは不要ですね。fetchrowが呼び出せているわけですから。

[ メッセージ編集済み 編集者: shimix 編集日時 2007-02-14 19:50 ]
カメ吉SE
常連さん
会議室デビュー日: 2006/07/09
投稿数: 34
投稿日時: 2007-02-16 12:49
shimixさん
ご返答ありがとうございます。

ご教授して頂いた方法でコーディングし、
正常に動作したことを確認できました。

コード:

use DBI;
#データベース名
$ds = "dbi:Oracle:TEST";
#ユーザ名
$user 'camekichi';
#パスワード
$passwd 'came@TEST';
#コネクション
$db = DBI->connect($ds, $passwd)
#準備@
$sth = $db->prepare(select * from came);

#準備A
$sth = $db->prepare("insert into came values(1,'came1')");

#sql実行
$sth->execute;

#executeの後に記述
my @results;
while(@results = $sth->fetchrow){
print "@results\n";
}


#ステートメントの終了
$sth->finish;
#データベースハンドルオブジェクトの終了
$sth->disconnect;

【実行結果】
1 came1
2 came2
3 came3



※補足説明
カラムは、IDと備考の2カラム存在します。

ご指導、ご教授の程、ありがとうございました。

#一部記述間違いがありましたので、修正しました。

[ メッセージ編集済み 編集者: カメ吉SE 編集日時 2007-02-17 03:34 ]
1

スキルアップ/キャリアアップ(JOB@IT)