2012-10-23 42 views
4

我的工作具有多個數據庫調用和Perl腳本我不斷收到以下錯誤:DBLIB錯誤快把我逼瘋了

DB-Library錯誤: 嘗試啓動與成果以待新的SQL Server操作。

在我的代碼,我有以下幾點:

到數據庫中的第一次調用執行多個INSERT語句從哈希內置:

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(); 

從那裏我稱之爲一個單獨的子程序來執行存儲的過程,它會產生三行輸出標誌着行號:

子程序調用

&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(); 
} 

我有工作正常的存儲過程之後,是第三個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 

任何幫助,這將不勝感激,因爲我已經嘗試了一切我能找到這樣一個互聯網搜索和閱讀文檔。

感謝

+0

我不確定,但也許你應該這樣做: $ dbh-> dbcmd(「exec $ sql1」); – fanlim

回答

0

發現的解決方案:

在run_sproc子例程中,檢查:

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

第二種情況$ dbh2-> dbresults是什麼導致了這個錯誤條件,一旦這個被刪除,錯誤不再出現。

+0

那個命令*在執行'dbsqlexec()'*之後從數據服務器檢索結果信息。我認爲你應該檢查'dbsqlexec()''$ status = $ dbh2-> dbsqlexec()'的返回值,看看'$ status'的值是多少 –

+0

感謝Tudor,刪除'$ dbh2-> dbresults '從上面的行我基本上是這樣做的: '$ dbh2_dbsqlexec()或者&fatalError(「$ sql中的數據庫錯誤」,「DB_ERROR」); ' 它只是使我無法專門編寫另一個關於狀態的測試 –

0

我覺得你的問題是,你的run_proc方法試圖執行此SQL:

my $sql1 = "upd_holiday_data"; 

我懷疑是一個有效的SQL命令

+0

這是一個有效的命令,您可以在示例日誌輸出中看到它正在生成結果,我已經使用了exec,並且執行得到了相同的結果 –

+0

其值得一提的是,無論查詢是在「$ sql1 「var我得到DB-Lib錯誤 –