2012-07-16 98 views
3

我一直在使用DBI模塊連接到我的數據庫時遇到了一些麻煩。我有一個屬性文件,並在其中指定我是否想通過簡單的database=oracledatabase=postgres連接到我的oracle或postgres DB。我的屬性文件設置使用配置::微型模塊,和我的變量被設置爲這樣:有條件地連接到數據庫

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. 

我可以連接到數據庫就好了,當他們不是一部分如果條件,任何想法,爲什麼它會導致錯誤呢?

+0

爲什麼不乾脆把整個「甲骨文:主機= ABC123服務器; SID = XE;端口= 1521」在您的配置文件中的字符串?這樣,您可以在不更改代碼的情況下使用任何數據庫。爲了便於切換,請將Oracle和Postgres行都放在配置文件中,並註釋掉不使用的行。 – cjm 2012-07-16 17:58:33

+0

@cjm - 對於這個問題,有一個oracle或sybase文件,並通過讀取不同的配置文件名切換 – DVK 2012-07-16 18:35:04

回答

4

您的$ dbh變量未在正確的範圍內聲明。你應該在你的「如果」的聲明,而不是將它聲明:

my $dbh; 

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

他們是你的代碼是結構化的,$dbh變量被宣佈爲my裏面的「如果」塊(與獨立,裏面的「其他」塊),和因此你的代碼的其餘部分沒有看到這些變量

對於進一步閱讀:

+0

不能相信我沒有意識到..謝謝! – MrTunaDeluxe 2012-07-16 17:13:20

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}, 
); 
+0

+1 - 不想用代碼風格在我的答案中混淆水域,但像這樣分解是一個好主意。 – DVK 2012-07-16 17:43:19