【问题标题】:Does Perl DBI Support Oracle Subquery Factoring?Perl DBI 是否支持 Oracle 子查询分解?
【发布时间】:2016-10-11 19:40:44
【问题描述】:

我在网上搜索了几天,没有找到答案。

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)中执行时都能正常工作。

【问题讨论】:

  • PostgreSQL 称它为 common table expressions,据我所知,我使用它们的方式与您描述的方式相同,prepareexecutefetch*

标签: oracle perl dbi subquery-factoring


【解决方案1】:

看来我的 Perl (5.8.8)、DBI (1.58) 和/或 DBD::Oracle (1.19) 版本不支持 Oracle 子查询分解。

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

不幸的是,即使在阅读了 Perl、DBI 和 DBD::Oracle 的更改历史之后,我也不知道究竟是哪个组件引入了对 Oracle 子查询分解的支持。我怀疑是 DBI Oracle 驱动程序 (DBD::Oracle)。

【讨论】:

    【解决方案2】:

    Perl DBI 正确处理了“WITH”子句。 我刚刚检查并测试您的代码 根据错误可能只有一种情况你忘记打电话了

     $sth->execute();
    

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

    【讨论】:

    • 你用什么版本的 Perl 和 DBI 来测试代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多