3

DBIモジュールを使用してデータベースに接続するのに問題があります。database=oracleプロパティファイルがあり、その中に、単純なまたはを介してoracleまたはpostgresDBに接続するかどうかを指定しますdatabase=postgres。プロパティファイルはConfig::Tinyモジュールを使用して設定され、変数は次のように設定されます。

my $database = $config->{myDB}->{database};
                       ...

私が理解していないのは、これはすべての変数で機能しますが、このようなものを試して、プロパティファイルで指定されているデータベースに接続しようとすると...

if($database eq "oracle"){
    my $dbh = DBI->connect("dbi:Oracle:host=abc123-server;sid=XE;port=1521","User","Pass");
}
elsif($database eq "postgres"){
    my $dbh = DBI->connect("dbi:Pg:dbname=pepperoni;host=789xyz-server;port=5444;","Foo","Bar");
}else{
    print "Could not connect to a database";
}

...私はこれらのエラーで終わります:

Global symbol "$dbh" requires explicit package name at supportvuloop.pl line 70.
Global symbol "$dbh" requires explicit package name at reportloop.pl line 80.
Global symbol "$dbh" requires explicit package name at reportloop.pl line 81.
Global symbol "$dbh" requires explicit package name at reportloop.pl line 82.
Global symbol "$dbh" requires explicit package name at reportloop.pl line 88.

if条件の一部でない場合はどちらのDBにも問題なく接続できますが、なぜ今エラーが発生するのか考えてみてください。

4

2 に答える 2

4

$dbh変数が正しいスコープで宣言されていません。代わりに、「if」ステートメントの前に宣言する必要があります。

my $dbh;

if ($x) {
    $dbh=xxx1;
} elsif ($y) {
    $dbh=xxx2;
} else { # error
}
...

それらはあなたのコードが構造化されていて、変数が「if」ブロック内(そして独立して「else」ブロック内)$dbhとして宣言されていたため、コードの残りの部分はそれらの変数を見ませんでしたmy

さらに読むために:

于 2012-07-16T17:09:41.373 に答える
3

DVKはすでにあなたの質問に答えていますが、私はヒントを与えたいと思いました。構成をデータベース接続から分離するため、次のようにコードを記述します。

my %connect_info = (
   "oracle" => {
      dsn      => "dbi:Oracle:host=abc123-server;sid=XE;port=1521",
      user     => "User",
      password => "Pass",
   },
   "postgres" => {
      dsn      => "dbi:Pg:dbname=pepperoni;host=789xyz-server;port=5444;",
      user     => "Foo",
      password => "Bar",
   },
);

my $connect_info = $connect_info{$database}
   or die("Unknown database $database\n");

my $dbh = DBI->connect(
   $connect_info{dsn},
   $connect_info{user},
   $connect_info{password},
);
于 2012-07-16T17:34:59.197 に答える