Поддерживает ли Perl DBI факторинг подзапросов Oracle?
Я искал в Интернете в течение нескольких дней и не могу найти ответ.
Поддерживает ли Perl DBI факторинг подзапросов Oracle (т. Е. Предложение WITH)?
Например, простое приложение Perl DBI, приведенное ниже, завершается с ошибкой:
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first)
Простое приложение Perl DBI:
#!/bin/perl
use DBI;
my $sql = <<END_SQL;
WITH w AS
(
SELECT wafer_seq
FROM wafer
WHERE load_time > sysdate - 1
)
SELECT v.*
FROM vwafer v, w
WHERE v.wafer_seq = w.wafer_seq
ORDER BY v.wafer_seq
END_SQL
my $dbh = DBI->connect('DBI:Oracle:<schema_id>', '<username>', '<password>');
my $sth = $dbh->prepare($sql) || die "ERROR PREP";
$sth->execute() || die "ERROR EXEC";
while (my @row = $sth->fetchrow_array())
{
print "@row\n";
}
$sth->finish();
$dbh->disconnect();
exit 0;
Это же приложение будет работать, если я просто изменю SQL на:
SELECT v.*
FROM vwafer v,
(
SELECT wafer_seq
FROM wafer
WHERE load_time > sysdate - 1
) w
WHERE v.wafer_seq = w.wafer_seq
ORDER BY v.wafer_seq
Наконец, я подтвердил, что оба упомянутых выше SQL работают, когда выполняются непосредственно в приложении визуализации базы данных (например, DBVisualizer).
2 ответа
Похоже, что моя версия Perl (5.8.8), DBI (1.58) и / или DBD::Oracle (1.19) не поддерживает факторинг подзапросов Oracle.
Мне удалось успешно выполнить то же приложение Perl через обновленные версии Perl (5.12.1), DBI (1.613) и DBD::Oracle (1.24).
К сожалению, даже после прочтения истории изменений для Perl, DBI и DBD:: Oracle, я не знаю точно, какой компонент представил поддержку Oracle Subquery Factoring. Мое подозрение - это драйвер DBI Oracle (DBD:: Oracle).
Perl DBI правильно обработал предложение WITH. Я только сейчас проверил его и протестировал ваш код. По ошибке там может быть только в одном случае забыли позвонить
$sth->execute();
Перепроверьте, пожалуйста, как это называется, может быть, это было прокомментировано или что-то еще. Но ваш код работает правильно.