Поддерживает ли 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();

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

Другие вопросы по тегам