Выполнить SQL-запрос Oracle в цикле PERL - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь выполнить SQL-запрос Oracle в цикле while сценария PERL следующим образом -

    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"
  }

}

в приведенном выше коде я выбираю имена таблиц из таблицы и затем зацикливаю их, чтобы получитьимена столбцов каждой таблицы, которая присутствует в этой таблице.

Код был выполнен за одну итерацию внутреннего цикла while, но выдает ошибку для следующей итерации, как показано ниже -

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') 

Яне разбираюсь в PERL и только начал использовать это и не уверен, как мне решить эту проблему.

Пожалуйста, дайте мне знать, если требуется дополнительная информация.

1 Ответ

0 голосов
/ 26 февраля 2019

В цикле строка $sth_sql = $dbh->prepare($col_sql); перезаписывает содержимое переменной $sth_sql.Во второй раз, когда цикл запускается, содержимое $sth_sql не совпадает, и оператор, который перезаписал его, уже исчерпан (попытка извлечь его снова вызывает ошибку).

ИсправитьВ этом случае вам следует либо использовать другое имя для второй переменной $sth_sql, либо просто объявить вторую переменную $sth_sql с помощью my, чтобы она оставалась внутри цикла (см. perldoc -f my).

Примечание. Это решение было определено JGNI в комментарии к вопросу.Моя роль заключается только в том, чтобы обобщить проблему, чтобы дать правильный ответ на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...