Perl DBI是否支持Oracle子查询因子?

时间:2016-10-11 19:40:44

标签: oracle perl dbi subquery-factoring

我在网上搜索了好几天,找不到答案。

Perl DBI是否支持Oracle子查询因子(即WITH子句)?

例如,下面的简单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;

简单的Perl DBI应用程序:

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更改为:

,那么相同的应用程序将起作用
{{1}}

最后,我确认直接在数据库可视化工具应用程序(例如DBVisualizer)中执行上述两个SQL都有效。

2 个答案:

答案 0 :(得分:1)

看来我的Perl版本(5.8.8),DBI(1.58)和/或DBD :: Oracle(1.19)不支持Oracle Subquery Factoring。

我能够通过更新的Perl(5.12.1),DBI(1.613)和DBD :: Oracle(1.24)版本成功执行相同的Perl应用程序。

不幸的是,即使在阅读了Perl,DBI和DBD :: Oracle的更改历史记录之后,我也不确切知道哪个组件引入了对Oracle Subquery Factoring的支持。我怀疑是DBI Oracle驱动程序(DBD :: Oracle)。

答案 1 :(得分:0)

Perl DBI正确处理了'WITH'子句。 我现在检查它并测试你的代码 根据错误,可能只有一个案例你忘了打电话

{{1}}

仔细检查,请它被调用,可能是评论或其他。 但是你的代码工作正常。