2016-10-11 78 views
2

我在网上搜索了几天,找不到答案。Perl DBI是否支持Oracle Subquery保理?

Perl DBI是否支持Oracle子查询因子分析(即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保理。

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

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

0

Perl DBI正确处理'WITH'子句。 我刚才检查和测试代码 按照错误有可能只由一个情况下,你忘记调用

$sth->execute(); 

仔细检查,请在叫,可能是有人评论或别的东西。 但是你的代码工作正确。

+0

你用什么版本的Perl和DBI来测试代码? – TuAmigoAlejandro