#oracle #perl #dbi #subquery-factoring
#Oracle #perl #dbi #подзапрос-факторинг
Вопрос:
Я искал в Интернете несколько дней и не могу найти ответ.
Поддерживает ли Perl DBI факторинг подзапросов Oracle (т.е. С-предложением)?
В качестве примера приведенное ниже простое приложение 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 "@rown";
}
$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
Наконец, я подтвердил, что оба SQLL, упомянутых выше, работают при выполнении непосредственно в приложении визуализации базы данных (например, DbVisualizer).
Комментарии:
1. PostgreSQL вызывает это
common table expressions
, и, насколько я помню, я использую их именно так, как вы это описываете,prepare
,execute
иfetch*
.
Ответ №1:
Похоже, что моя версия 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. Я подозреваю, что драйвер DBI Oracle (DBD:: Oracle).
Ответ №2:
Perl DBI правильно обработал предложение ‘WITH’. Я только сейчас проверяю это и тестирую ваш код в соответствии с ошибкой, возможно, только в одном случае, когда вы забыли позвонить
$sth->execute();
Пожалуйста, дважды проверьте, вызван ли он, может быть, он был прокомментирован или что-то еще.
Но ваш код работает правильно.
Комментарии:
1. Какие версии Perl и DBI вы использовали для тестирования кода?