1

PostgreSQL データベースのテーブルに自動入力しようとしています。残念ながら、挿入ステートメントが機能しません。

最初の行は整数の ID で、2 番目の列は数値データ型です。これを実現するために Perl スクリプトを使用しています。

rand0 から 1 の間の乱数を作成する関数を使用しています。最初の引数は変数$idです。2 番目の引数は変数です$count

カウントに基づいて、テーブルに ID とそれに続く乱数が入力されます。

PostgreSQL 9.2.4 を使用しています。

-ID | Random_Number
-1 |  0.01
-1 |  0.03
-2 |  0.0566

#!/usr/bin/perl

use DBI;

my $id = <>;
my $count = <>;

my $db_host = 'localhost';
my $db_user = 'postgres';
my $db_pass = '12345';
my $db_name = 'postgres';

my $db = "dbi:Pg:dbname=${db_name};host=${db_host}";

$dbh = DBI->connect($db, $db_user, $db_pass, { RaiseError => 1, AutoCommit => 0 })
        || die "Error connecting to the database: $DBI::errstr\n";

for (my $loop = 0; $loop < $count; $loop++) {
    my $random_number = rand();
    my $loop++;
    my $query = "insert into random_table values($loop,$random_number)";
}
4

2 に答える 2

2

これは不必要に複雑です。ただ:

CREATE TABLE random_table(id integer, random_value float);

それから:

my $dbh = DBI->connect($db, $db_user, $db_pass,{ RaiseError => 1, AutoCommit => 0 })
my $sth $dbh->prepare("INSERT INTO random_table(id,random_value) SELECT x, random() FROM generate_series(?,?);")
my $result = $sth->execute(0, $count);

(テストされていませんが、それが正しいと確信しています)。

ところで、あなたは本当に必要です:

use strict;
use warnings;
use 5.10.1; // or whatever the oldest Perl you support is

あなたのスクリプトで。

于 2013-04-12T00:56:18.263 に答える
1

まず、$loop 変数を再宣言しているため、以前の宣言がマスクされます。未定義値に対する ++ = 1 なので、$query の $loop は毎回 1 です。

for(my $loop=0; $loop < $count;$loop++)
{
  my $random_number = rand();
  my $loop++; # Shouldn't be here
  my $query = "insert into random_table values($loop,$random_number)";
}

perl で警告をオンにしていた場合、これについて警告が表示されます。

次に、$query で何もしていません。ただの文字列です。$dbh->do($query) のように実行する必要があります。

于 2013-04-12T01:13:55.890 に答える