2016-10-11 13 views
2

私は数日間オンラインで検索しましたが、答えを見つけることができません。Perl DBIは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を変更した場合、この同じアプリケーションが動作しますto:

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)。

+0

PostgreSQLはこの 'common table expressions'を呼び出します。私が覚えている限り、あなたはそれを' prepare'、 'execute'、' fetch * 'のように使います。 – dgw

答えて

1

私のバージョンのPerl(5.8.8)、DBI(1.58)、および/またはDBD :: Oracle(1.19)はOracle Subquery Factoringをサポートしていません。

私は、Perl(5.12.1)、DBI(1.613)、およびDBD :: Oracle(1.24)の最新バージョンで同じPerlアプリケーションを正常に実行することができました。

残念ながら、Perl、DBI、およびDBD :: Oracleの変更履歴を読み込んだ後でも、どのコンポーネントがOracle Subquery Factoringのサポートを導入したのかはわかりません。私の疑惑はDBI Oracleドライバ(DBD :: Oracle)です。

0

Perl DBIが 'WITH'句を正しく処理しました。それは呼ばれてい 私はちょうど今、唯一のケースであなたがダブルチェック

$sth->execute(); 

を呼び出すことを忘れてください、それをチェックして、そこにある誤差に応じて、あなたのコード をテストするには、コメントや他の何かたことがあります。 しかしあなたのコードは正しく動作します。

+0

コードをテストするためにどのバージョンのPerlとDBIを使用しましたか? – TuAmigoAlejandro

関連する問題