Поддерживает ли Perl DBI факторинг подзапросов Oracle?

#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 вы использовали для тестирования кода?