【发布时间】: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,据我所知,我使用它们的方式与您描述的方式相同,prepare、execute和fetch*。
标签: oracle perl dbi subquery-factoring