Ваш звонок правильный.Проблема в том, что $dirnm
существует только в цикле, но вы используете его вне цикла.Вам нужно переместить петлю между точкой, где соединение открыто, и точкой, где оно закрыто.
В то же время давайте немного очистим.Вы не хотите prepare
более одного раза;это расточительно.Этого можно избежать, используя заполнители.
Заполнители также избавляют вас от необходимости преобразовывать путь в литерал SQL, что вы плохо пытались сделать, добавляя кавычки.Это рецепт для инъекционной ошибки / атаки.
Таким образом, мы в итоге получаем следующее:
my $dbh_oracle = DBI->connect(...);
my $sth = $dbh_oracle->prepare(q{
INSERT INTO mydirs VALUES (280, ?, DEFAULT, 1700)
});
my $DirResults = $cmd->ls($chkdir);
for my $dirnm (@{ $DirResults->{directory} }) {
$sth->execute( $dirnm->{path} );
}
$sth->finish();
$dbh_oracle->disconnect();
(Обработка ошибок удалена, чтобы сделать вещи краткими и к сути для этого поста.оставьте его или используйте RaiseError=>1
.)
Не было никакого смысла иметь подчиненное устройство (кроме execute
), поэтому я не использовал его.Но так как вы специально задали вопрос о дополнительном вызове, ниже показано, как может выглядеть код с дополнительным вызовом:
sub results_in {
my ($sth, $path) = @_;
$sth->execute($path);
}
...
my $DirResults = $cmd->ls($chkdir);
for my $dirnm ( @{$DirResults->{directory}} ) {
results_in($sth, $dirnm->{path});
}
...