4

複数のデータベース呼び出しがあるperlスクリプトで作業していますが、次のエラーが継続的に発生します。

DB-Libraryエラー:結果が保留の状態で新しいSQLServer操作を開始しようとしました。

私のコードには次のものがあります:

データベースへの最初の呼び出しは、ハッシュから構築されたいくつかの挿入ステートメントを実行します。

while (my ($key, $value) = each(%holidays)) {

    system("log4k", "DEBUG", "$0", "Staging holiday info data for: $cal_name: $key");

    $sql = "INSERT INTO stg_holiday_data (hol_mnemonic, hol_date, hol_comment, dml_type)    VALUES (\"$cal_name\", $key, \"$value\", \"N\")";
    system("log4k", "TRACE", "$0", "SQL being executed: $sql");

    if ($test == 0) {

        $dbh->dbcmd($sql);

        ($dbh->dbsqlexec() && $dbh->dbresults)
            or &fatalError("Database error in $sql", "DB_ERROR");

        while($dbh->dbresults != NO_MORE_RESULTS) {

            while(my @dat = $dbh->dbnextrow){}
        }
    }
}

それが終了した直後に、接続を閉じ、それをキャンセルして、以下を発行して処理する結果が残っていないことを確認します。

$dbh->dbcancel();
$dbh->dbclose();

そこから、別のサブルーチンを呼び出して、行番号を示す3行の出力を生成するストアドプロシージャを実行します。

サブルーチン呼び出し

&run_sproc() if ($test == 0);

サブルーチン:

sub run_sproc() {

    system("log4k", "DEBUG", "$0", "Loading staged holiday data");

    my $sql1 = "upd_holiday_data";
    system("log4k", "TRACE", "$0", "SQL being executed: $sql1");

    my($dbh2) = new Sybase::DBlib $ENV{DATABASE_USER}, $ENV{DATABASE_PASSWORD}, $ENV{DATABASE_SERVER}, "GME_calendar_sync";
    &fatalError("Failed to login imagine database", "DB_LOGIN_ERROR") unless ($dbh2);

    $dbh2->dbcmd($sql1);
    ($dbh2->dbsqlexec() && $dbh2->dbresults ) 
        or &fatalError ("Database error in $sql", "DB_ERROR");

    while ($dbh2->dbresults != NO_MORE_RESULTS) {

        while (my @d = $dbh2->dbnextrow) {

            system("log4k", "TRACE", "$0", "Next row being inserted @d");
        }
    }
    $dbh2->dbclose();
}

このサブルーチンの有無にかかわらず正常に動作するストアドプロシージャの後に来る3番目のSQLブロックがあります。

何が起こっているのかというと、ストアドプロシージャの印刷結果の直前に上記のエラーが発生します。すべての結果が処理されていることを確認するために、想像できるすべてのことを試しました。ログ出力のサンプルを以下に示します。

[Tuesday, 23 October 2012 13:30:02 BST] [DEBUG] gme_process_calendars.pl: Staging holiday info data for: CA: 20251226
[Tuesday, 23 October 2012 13:30:03 BST] [TRACE] gme_process_calendars.pl: SQL being executed: INSERT INTO stg_holiday_data (hol_mnemonic, hol_date, hol_comment, dml_type)    VALUES ("CA", 20251226, "upload", "N")
[Tuesday, 23 October 2012 13:30:03 BST] [DEBUG] gme_process_calendars.pl: Staging holiday info data for: CA: 20220103
[Tuesday, 23 October 2012 13:30:03 BST] [TRACE] gme_process_calendars.pl: SQL being executed: INSERT INTO stg_holiday_data (hol_mnemonic, hol_date, hol_comment, dml_type) VALUES ("CA", 20220103, "upload", "N")
[Tuesday, 23 October 2012 13:30:03 BST] [DEBUG] gme_process_calendars.pl: Loading staged holiday data
[Tuesday, 23 October 2012 13:30:03 BST] [TRACE] gme_process_calendars.pl: SQL being executed: upd_holiday_data
DB-Library error:
    Attempt to initiate a new SQL Server operation with results pending.
[Tuesday, 23 October 2012 13:30:03 BST] [TRACE] gme_process_calendars.pl: Next row being inserted 310107230

インターネット検索を行ったり、ドキュメントを読んだりして、見つけたすべてのことをすでに試したので、これに関する助けをいただければ幸いです。

ありがとう

4

2 に答える 2

0

見つかった解決策:

run_sproc サブルーチンでは、チェック:

 ($dbh2->dbsqlexec() && $dbh2->dbresults ) 
        or &fatalError ("Database error in $sql", "DB_ERROR");

2 番目の状態 $dbh2->dbresults がこのエラー状態の原因です。これを削除すると、エラーは発生しなくなりました。

于 2012-10-23T18:00:51.477 に答える
0

あなたの問題は、あなたのrun_procメソッドがこのSQLを実行しようとすることだと思います:

my $sql1 = "upd_holiday_data";

これは有効なSQLコマンドだとは思えません

于 2012-10-23T14:51:41.277 に答える