• 締切済み

postgresに内容を送ることが出来ません。宜しくお願いします

#!c:/perl/bin/perl -- こんにちわ。perl5.8,windowsXP,postgreSQL8.2を使って居ります。postgresにperlから内容を入力できず困っております。今回入力するテーブルには既にsqlに直接行を2行分のみ入力してあり、その部分、3行目からはperlでテストしています。postgresのpg_logというフォルダにログが入っていたので見たのですが特にエラーも書いてありませんし、コマンドプロンプトでもエラーにはなっていませんでした。アドバイスをお願いします。宜しくご指導下さい。 use DBD::Pg; use DBI; require'jcode.pl'; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=kensaku",'dd','ee'); my$b=(<<"EOL"); convert('PostgreSQL' using sjis_to_euc_jp); insert into kensaku(id,word1,word2,word3,head,img) values(?,?,?,?,?,?); EOL ; @bindvalues=('w','d','q','g','c','v'); &jcode'convert(*bindvalues,'euc_jp'); $sth=$dbh->prepare($b); foreach (@csvdata){ @bindvalues=split(/,/,$_); $v=$sth->execute(@bindvalues);} $d=$dbh->disconnect;

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

みんなの回答

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

全く反応がないというのはどのような状態でしょうか? 何も出力されないだけなのか、プログラム自体が固まってしまうのか。 データベースに接続できていないのかもしれません。 とりあえず、traceを取ることをお勧めします。 traceの取り方や注意点を含め、参考URLをご覧下さい。 > データベースへのアクセスをパールで初めて送った時はどのような勉強をされましたか? Webで検索し、既存のプログラムを片っ端から見よう見まねで覚えていきました。特に本は買っていません。

参考URL:
http://perldoc.jp/docs/modules/DBD-Pg-1.22/Pg.pod
windws
質問者

補足

bgbgさんご返事有難う御座います。全く反応がないというのはプロンプトでエラーが出ず、通ってしまうと言う事でした。データベースには接続できていると思います。テーブルやデータベースをプロンプトから作りましたので大丈夫だと思っています。トレースはもう少し理解するように時間を取ってみたいと思います。今週は着手が出来ず、また来週になってしまいますが、トライしてみたいと思います。bgbgさん、またご報告します。bgbgさんはwebで材料を収集して研究されたのですね、私も少しは見習いたいと思います。とりあえず今回はテーマに近いものだけ、頑張ってみます。有難う御座いました。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

my$b=(<<"EOL"); convert('PostgreSQL' using sjis_to_euc_jp); insert into kensaku(id,word1,word2,word3,head,img) values(?,?,?,?,?,?); EOL 通常、DBIで処理するSQL文は一度に2文以上同時に処理することはできないのではないかと思いますが。 convertは毎回insertする前に行う必要はないと思うので、foreachの中とは別に最初1度だけ実行するようにしたらどうでしょう。 なお、SQLのエラーメッセージは、executeしたあと print $sth->errstr; で取得できます。

windws
質問者

補足

bgbgさんご回答頂き有難うございます。SQL文中に2文以上入れることは出来ないと言うことを教えて頂き、助かりました。しかし、まだコンバートを削除してもダメです。(SQLのデータベース作成の時にコンバートの指定はしてありましたので、今回は削除してテストしてみました。)何が間違えた部分なのか勉強不足で不明です。print $sth->errstr;も教えて下さり有難う御座いました。この一文を足してコマンドプロンプトでチェックしたのですが、全く反応がありません。とりあえず一休みしています。SQLを一から勉強するのが先なのでしょうか、bgbgさんはデータベースへのアクセスをパールで初めて送った時はどのような勉強をされましたか?参考に良い方向があったら教えて下さい。良い本なども教えて下さい、宜しくお願い致します。

関連するQ&A

  • 未だpostgresにアクセス出来ません。教えて下さい。

    こんにちわ。windowsXP,postgres8.2,perl5を使用して居ります。 postgresにperlからアクセスし、既存のテーブルの行に値を入れたいのですが、 valuesに数字以外の文字を指定するとpostgresに文字列が認識されません。教えて頂きたいことは、 仮に数字を6行目の$に入れると認識されるのですが、文字だと出来ないのは、どうしてでしょうか。$id='○○'と 文字を入れてみるとpostgresには1の結果だけが入ってきました。どのようにしたら良いかと、 思いprint'○○',$idとしてみました。すると下記のプロンプトでのエラーがでました。 構文が間違えていると思うので、良い方法があったら教えて下さい。宜しくお願いします。 #!c:/perl/bin/perl use DBD::Pg; use DBI; require'jcode.pl'; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=kensaku",'windws','aaaa')||die $dbh->errstr; print'9',$id;print'山田',$word1;print'd',$word2;print'w',$word3;print'c',$head;print'a',$img; @bindvalues=($id,$word1,$word2,$word3,$head,$img); &jcode::convert(*bindvalues,'euc'); my$b=(<<"EOL"); insert into kensaku(id,word1,word2,word3,head,img) values($id,$word1,$word2,$word3,$head,$img) EOL ; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; $sth=$dbh->prepare($b)||die $dbh->errstr; $sth->execute()||die $sth->errstr; $dbh->disconnect; コマンドプロンプトのエラー DBD::Pg::st execute failed: ERROR: syntax error at or near "," at character 103 at test.pl line 19. ERROR: syntax error at or near "," at character 103 at test.pl line 19.

  • データベースにアクセス出来ません。宜しくお願いします。

    こんにちわ。先日postgre8.2をwinXPにダウンロードしました。デpostgresの画面ではデータベースの新規作成が出来るようになっているのですが、パールから作ろうとするとコマンドプロンプトにエラーが出てきます。以下にパールの文とエラーを書きますので、何かチェックする点や設定など確認や文自体の間違いなどお教え下さい。宜しくお願いします。 #!c:/perl/bin/perl use DBD::Pg; use DBI; $dbh=DBI->connect("dbi:Pg:host=localhost;dbname=postgres",'ddd','cc'); $sth=$dbh->prepare($a); my$a=(<<"EOL"); CREATE DATABASE kensaku with encoding='euc_jp' owner=ddd template=postgres tablespace=pg_default; grant all on database kensaku to public; EOL $v=$sth->execute(); $d=$dbh->disconnect; エラー:DBD::Pg::st execute warning: at test.pl line 21. 宜しくお願いします。

    • ベストアンサー
    • Perl
  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • 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(); 可能かどうかもわからないのですが、なにか良い方法はありますでしょうか?よろしくお願いします。

  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • Perl
  • eucデータをsjisに変換できない。

    require './jcode.pl'; &jcode::convert(*name,'euc'); レンタルサーバーのMySQLがeucでしかデータを受け取らない ので以上のような形にしてSQL文を投げました。 結果、htmlでsjisにして吐き出す際に取り出すデータもeucで表示されるため変換できないかと悩んでいます。 while( @row = $sth->fetchrow_array() ) { 1jcode::convert(\$row,'sjis'.'euc'); 2jcode::convert(\$row,'sjis'); 3jcode::convert($row,'sjis'.'euc'); と複数試しましたがダメでした。 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 です。

  • DBIを使用して物理的に分かれているPostgresに接続するには

    こんにちは。 WebサーバーとDBサーバー(postgres)があって、 WebのPerlプログラムからDBIを使用してのDB接続方法がわからなくて困ってます。 Webサーバーと同じPCにpostgreも入っている環境で動作してましたが、 DBサーバーを独立させることになったのですが connectの記述方法がわからないのです。 $dbh = DBI->connect("dbi:Pg:dbname=test", $user_name, $pass); 今まではこのような記述でOKでした。 しかし、今度は物理的に別れているので、 DBサーバーを指定するIPアドレスを記述する必要があるのかな、と思い (WebとDBサーバーはLANで直につながっています) $dbh = DBI->connect("dbi:Pg:dbname=test:host=XXX.XXX.XXX.XXX", $user_name, $pass); 等を試してみたのですがダメでした。 Webサーバー側のDBI・ドライバ設定は正しく動作しています。 (DBI->available_drivers;でドライバの列挙は正しく取得できているので) もちろんDBは正しく作成されています。 (DBサーバーで作ったユーザーは、DBログイン時にPassがいらない設定になってますが) 色々調べてみたのですが、IPアドレスを指定してのDB接続等の情報が どうしてもみつかりませんでした。 どなたかご存知の方、ぜひともご教授ください。

  • 文字化けしてしまって困っています

    postgresのデータベースから日本語の入った列の取得が上手くできずに困っています。 どうすればよいのでしょうか。。。 【DB】 postgres:9.1.1 perl: v5.10.1 databaseの文字コード:UTF-8 【クライアント】 postgres:8.4.0 perl:v5.8.8 文字コード:ECU-JP このような環境で、クライアントで 県名テーブルから県名を取得する以下のようなperlを実行した結果、 OUT.csvの県名列が文字化けしてしまったため (1)のように修正したのですがエラーとなってしまいます。 convertの記述の仕方が悪いのでしょうか? DBD::Pg::st execute failed: ERROR: function convert(character varying, unknown, unknown) does not exist at character 19 (Test.pl) #!/usr/local/bin/perl use DBI; $query = <<EOF; SELECT KEN_ID, KEN_NAME  ←修正前 convert(KEN_NAME,'UTF-8','EUC-JP')←(1) FROM KEN_MASTER EOF $dbi = DBI->connect("dbi:Pg:dbname=datbase;host=DATA_SV","hogeUser","hogePass"); $dsi = $dbi->prepare($query); $dsi->execute(); open(OUT, "> /OUT.csv"); while ($shr = $dsi->fetchrow_arrayref) { print OUT join(",", @$shr), "\n"; } close(OUT); $dsi->finish(); $dbi->disconnect(); exit();

  • 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

専門家に質問してみよう