2016-10-11 3 views
2

Я искал в Интернете несколько дней и не могу найти ответ.Поддерживает ли Perl DBI Oracle Subquery Factoring?

Поддерживает ли Perl DBI Oracle Subquery Factoring (т. Е. WITH-clause)?

В качестве примера, простое приложение 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-файла работают w который выполняется непосредственно в приложении визуализатора базы данных (например, DbVisualizer).

+0

PostgreSQL называет это «распространенными табличными выражениями», и насколько я помню, я использую их только так, как вы его описываете, 'prepare',' execute' и 'fetch *'. – dgw

ответ

1

Похоже, что моя версия Perl (5.8.8), DBI (1.58) и/или DBD :: Oracle (1.19) не поддерживает Oracle Subquery Factoring.

Я смог успешно выполнить одно и то же приложение Perl с помощью обновленных версий Perl (5.12.1), DBI (1.613) и DBD :: Oracle (1.24).

К сожалению, даже после чтения истории изменений для Perl, DBI и DBD :: Oracle я точно не знаю, какой компонент представил поддержку Oracle Subquery Factoring. Мое подозрение - это драйвер DBI Oracle (DBD :: Oracle).

0

Perl DBI правильно обработал предложение «WITH». я только сейчас проверить его и проверить свой код В соответствии ошибки есть, может только один случай Вы забыли позвонить

$sth->execute(); 

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

+0

Какую версию Perl и DBI вы использовали для тестирования кода? – TuAmigoAlejandro

Смежные вопросы