2016-10-11 132 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