在循环时在PERL脚本中执行oracle sql查询
我尝试在PERL脚本的while循环中执行oracle sql查询,如下所示-- 我不精通PERL,只是开始使用它,不知道如何克服这个问题在循环时在PERL脚本中执行oracle sql查询,oracle,perl,Oracle,Perl,我尝试在PERL脚本的while循环中执行oracle sql查询,如下所示-- 我不精通PERL,只是开始使用它,不知道如何克服这个问题 如果需要更多信息,请告诉我。在循环中,行$sth\u sql=$dbh->prepare($col\u sql)覆盖$sth\u sql变量的内容。第二次运行循环时,$sth\u sql的内容不相同,并且重写它的语句已经用尽(再次尝试从中提取是导致错误的原因) 要纠正此问题,您应该为第二个$sth\u sql变量使用不同的名称,或者只需使用my声明第二个$s
如果需要更多信息,请告诉我。在循环中,行
$sth\u sql=$dbh->prepare($col\u sql)
覆盖$sth\u sql
变量的内容。第二次运行循环时,$sth\u sql
的内容不相同,并且重写它的语句已经用尽(再次尝试从中提取是导致错误的原因)
要纠正此问题,您应该为第二个$sth\u sql
变量使用不同的名称,或者只需使用my
声明第二个$sth\u sql
变量,将其保留在循环中(请参见perldoc-f my
)
注:JGNI已在问题评论中确定了该解决方案。我的职责只是总结问题,为这个问题提供一个恰当的答案 如果在内部SQL查询中使用不同的$db对象,会发生什么情况?当您将其称为不同的$db对象时,我没有得到确切的答案。您的意思是说oracle对象或PERL对象。我是PERL新手,因此可能不理解这里使用的术语。我将尝试为内部循环打开另一个DB连接$DBH1,然后查看发生了什么。您的问题是,您正在循环中为
$sth\u sql
赋值,这将覆盖您的循环变量。重命名其中一个变量或将内部变量设置为my
变量。请参见我的车型的perldoc-f。PS语言是Perl,称之为Perl会让人恼火。谢谢你的评论,我将尝试在这里使用不同的变量。正如建议的那样,Perl从现在开始:)@JGNI-我尝试将新的varibale作为$sth_sql1用于内部循环,现在运行良好,但没有使用“my”关键字。谢谢你的帮助。没错,我现在在循环中使用了一个不同的变量名,JGNI已经指出了这一点,我感谢他和你理解了Perl脚本的一些内容,比如“my”关键字的用法/范围。
my $dbh = DBI->connect( 'dbi:Oracle:'.$dbname,
$dbusername,
$pass,
{ PrintError => 0,
RaiseError => 1
}
) || die "Erreur lors de la connexion: $DBI::errstr";
print ("Connexion à la base de données $dbname avec $dbusername OK \n");
$requete = "select distinct to_char(date_appli,'yyyymmdd') from DATE_APPLI ".
"where frequence = 'Q' and actif = 1";
$sth_sql = $dbh->prepare($requete);
$sth_sql->execute();
@row=$sth_sql->fetchrow_array;
$datesitu=@row[0];
$sth_sql->finish;
print "La date de situation est $datesitu \n";
# SQL to get validation script and table names
$requete = "select SCRIPT_NAME, table_name from fdf_scripts";
$sth_sql = $dbh->prepare($requete);
$sth_sql->execute();
$sth_sql->bind_columns(undef, \$script_name, \$table_name);
while ($sth_sql->fetch()) {
$script_sql="$sql_path\\"."FDF_Test_scripts\\".$script_name.".sql"; #validation script path
$script_log="$log_path\\".$script_name.".log"; #log files path
$rep_file_name="$sql_path\\"."FDF_Test_scripts\\".$table_name.".sql"; #reports SQL path
$csv_file="$sql_path\\"."FDF_Test_scripts\\".$table_name.".csv"; #report CSV path
#Load data into validation tables using validation scripts
$CmdText="sqlplus -s $connect \@$script_sql $script_log";
print "Inserting data into table : $table_name \n";
#system ("$CmdText");
$col_sql = "select COLUMN_NAME from all_tab_cols where TABLE_NAME = upper(\'$table_name\')\n";
print "$col_sql\n";
$sth_sql = $dbh->prepare($col_sql);
$sth_sql->execute();
$sth_sql->bind_columns(undef, \$COLUMN_NAME);
while ($sth_sql->fetch()) {
print "$COLUMN_NAME\n";
}
if (open (my $fh, '<:encoding(UTF-8)', $script_log)){
while (my $line = <$fh>){
if ($line=~m/\bERROR\b/){
print "Error While Loading $table_name table Please Check log file for errors at: $script_log \n";
}
}
}
else {
warn "Could open file: $script_log \n"
}
}
DBD::Oracle::st fetch failed: ERROR no statement executing (perhaps you need to call execute first) [for Statement "select COLUMN_N\
AME from all_tab_cols where TABLE_NAME = upper('FDF_Bond_validation_results')