Perl DBI 是否支持 Oracle 子查询分解?
Does Perl DBI Support Oracle Subquery Factoring?
我在网上找了好几天都没有找到答案。
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)中直接执行时都能正常工作。
Perl DBI 正确处理了 'WITH' 子句。
我刚刚检查它并测试你的代码
根据错误,可能只有一种情况你忘记打电话
$sth->execute();
请仔细检查它是否被调用,可能是评论或其他内容。
但是你的代码工作正常。
看来我的 Perl (5.8.8)、DBI (1.58)、and/or DBD::Oracle (1.19) 版本不支持 Oracle Subquery Factoring。
我能够通过更新的 Perl (5.12.1)、DBI (1.613) 和 DBD::Oracle (1.24) 版本成功执行相同的 Perl 应用程序。
不幸的是,即使在阅读了 Perl、DBI 和 DBD::Oracle 的更改历史之后,我也不知道是哪个组件引入了对 Oracle 子查询分解的支持。我怀疑是 DBI Oracle 驱动程序 (DBD::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)中直接执行时都能正常工作。
Perl DBI 正确处理了 'WITH' 子句。 我刚刚检查它并测试你的代码 根据错误,可能只有一种情况你忘记打电话
$sth->execute();
请仔细检查它是否被调用,可能是评论或其他内容。 但是你的代码工作正常。
看来我的 Perl (5.8.8)、DBI (1.58)、and/or DBD::Oracle (1.19) 版本不支持 Oracle Subquery Factoring。
我能够通过更新的 Perl (5.12.1)、DBI (1.613) 和 DBD::Oracle (1.24) 版本成功执行相同的 Perl 应用程序。
不幸的是,即使在阅读了 Perl、DBI 和 DBD::Oracle 的更改历史之后,我也不知道是哪个组件引入了对 Oracle 子查询分解的支持。我怀疑是 DBI Oracle 驱动程序 (DBD::Oracle)。