2009-05-07 10 views
1

は私のスクリプトです:なぜPerlのDBIが「オープンしようとしたカーソルをフェッチしようとしましたか?ここ

$db_handle=DBI->connect("$dbstr", "", "", 
{RaiseError => 0, AutoCommit => 0, PrintError => 1}) 
|| die "Connect error: $DBI::errstr" ; 
$result=$db_handle->selectrow_array("set isolation to dirty read"); 

注:$dbstr有効なデータベース名です。

私はデータベースプログラマーではありません。

DBD::Informix::db selectrow_array failed: SQL: -400: Fetch attempted on unopen cursor.

私はデータベース$dbstrに接続し、テーブルの内容を表示する簡単なスクリプトを記述する場合、それは正常に動作しますが、上記のコードは動作しません:私は、Perlスクリプトが言って失敗する原因となっている間違って何をやっています。

+0

が、これはその一つではありません(DBD :: Informixのサポートを追求する場所が文書化されていることに注意してください、しかし、DBD ::のInformixの最後のリリースだったとき、それは存在しませんでした作成した)。さらに重要なのは、Perl、DBI、DBD :: Informix、ESQL/C(またはCSDK)、IDS(のバージョンを含む、より複雑な質問に答えるために必要なバージョン情報が* LOT *または他のInformix DBMS)、プラットフォーム、および場合によってはコンパイラも含みます。これらの要件は、ソースのドキュメントに記載されています。 InformixTechSupportのほとんどを集めるためのスクリプトも用意されています。 –

答えて

1

DBD::Informixのドキュメント、特に「CONNECTING_TO_A_DATABASE」セクションをお読みください。 Informixデータベースに接続するために最低限必要なコードがあると思われる:

$dbh = DBI->connect("dbi:Informix:$database"); 

したがって、データベースの名前だけ以上のものを提供する必要があります。

+0

問題は、接続が機能していると言いました。そのため、データベース名だけではありません。しかし、DBD :: Informixのドキュメントへのx-refはまだ役に立ちます。 –

3

selectrow_arrayメソッドは、結果セットを返すステートメントでの使用を意図しています。 SET ISOLATIONステートメントはそのようなステートメントではなく、失敗します。

エラー-400が最も良いエラーであるかどうかは、少し議論の余地があります。一度見て、何かできるかどうかを見ていきます。しかし、IIRCのselectrow_arrayメソッドは、DBD :: InformixではなくDBIによって提供されるため、DBIは低レベルのプリミティブから構築します。その結果、それらのプリミティブは、高レベル機能が別々に動作する必要があるために提供できる妥当性検査を提供できません。

そのコードを書くための正しい方法は次のとおりです。

$db_handle->do("set isolation mode to dirty read"); 
3

あなたが実行しているの文からフェッチするには結果がありません:

set isolation to dirty read 

のでselectrow_array()はコールする間違った方法であり、 。代わりに$dbh->do(...)を使用してください:ここでは

$db_handle->do('set isolation to dirty read'); 

は、-400エラーの長い説明です:

-400 Fetch attempted on unopen cursor.

This FETCH statement names a cursor that has never been opened or has been closed. Review the program logic, and check that it will open the cursor before this point and not accidentally close it. Unless a cursor is declared WITH HOLD, it is automatically closed by a COMMIT WORK or ROLLBACK WORK statement.

ジョナサンが指摘するように、これは明確なエラーではないかもしれないが、あなたが理解すれば、それはいくつかの意味を作るんどうしたの。

1

set isolation to dirty readはクエリではありません。クエリのみがselectrow_arrayになります。あなたはdo必要があります。

#!usr/bin/perl 

use strict; 
use warnings; 

use DBI; 

my $dbi = "dbi:Informix:dbname"; 

my $dbh = DBI->connect(
    $dbi, 
    "", 
    "", 
    { 
     RaiseError => 1, 
     AutoCommit => 0, 
     PrintError => 1, 
     ChopBlanks => 1, 
    } 
) or die "Connect error: $DBI::errstr"; 

my $result = $dbh->do("set isolation to dirty read"); 

$dbh->disconnect; 
関連する問題