2011-11-02 40 views
1

我需要檢索我編寫的DB2 sproc返回的值。 sproc返回表中的行數,被調用進程用來決定是否更新其他數據。如何使用Perl DBI檢索DB2 SQL sproc的返回值?

我已經看了看SO幾個類似的問題,但它們指的是使用了參數,而不是使用存儲過程的返回值,例如:

Perl Dbi and stored procedures

我使用的是標準的DBI連接啓用了RaiseError和PrintError的數據庫。

 

    $sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; 
    $sth = $dbh->prepare($sql_stmt) 
     or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; 

    $rsp = 0; 
    $rsp = $sth->execute(); 
    unless($rsp) { 
     print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n"); 
    } 

    print(STDERR "$?\n"); 

我試着看$ h-> err語句句柄和db句柄。

我真的希望通過返回代碼而不是使用SQLSTATE機制來傳遞行數,如果可以的話。

編輯:

我已經完成了使用專用的輸出參數如下溝通更新行數:

 

    $sql_stmt = "call MY_TABLE_SPACE.MY_SPROC('2011-10-31')"; 
    $sth = $dbh->prepare($sql_stmt) 
     or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; 
    $sth = $dbh->bind_param_inout(1, $rows_updated, 128) 
     or die "Unable to prepare SQL '$sql_stmt': $rps_met_dbh->errstr"; 

    $rows_updated = 0; 
    $rsp = 0; 
    $rsp = $sth->execute(); 
    unless($rsp) { 
     print(STDERR "Unable to execute sproc: $rps_met_dbh->errstr\n"); 
    } 

    print(STDERR "$rows_updated\n"); 

編輯2:

現在思考關於這一點,我已經意識到我應該應用「告訴別問」的PragProg原則。也就是說,我不應該打電話給我。然後在決定是否撥打另一個存檔,即「詢問」之前讓它回覆一個數字。

我應該只打電話給第一個存檔。並決定是否應該調用另一個片斷,即「告訴」並讓它決定。

回答

1

在你的程序中使用輸出參數有什麼問題。我現在還沒有正在使用的DB2,或者我會提供一個示例,但是當我使用它時,我確定您可以在過程中定義輸出參數並使用bind_param_inout綁定它們。我不記得DB2過程是否可以返回一個值(如函數),但是如果它可以使用「?= call MY_TABLE_SPACE.MY_SPROC('2011-10-31')」將允許您綁定輸出返回值。如果這不起作用,您可以使用DB2函數,它肯定可以返回一個值。然而,在一天結束時,從一個過程/函數中獲取數據的方式是綁定輸出參數 - 這就是它的方式。

我不知道你的意思是「使用SQLSTATE」。我也不知道你的意思是通過查看$ h-> err,因爲只有在過程失敗或者你不能調用過程(SQL錯誤等)時才設置。

+0

感謝您的幫助。我將使用你的建議在SQL「?= call MY_TABLE_SPACE.MY_SPROC」中使用一個賦值以及bind_param_inout。 「使用SQLSTATE」意味着在sproc中設置一個明確的SQLSTATE值,在用戶定義的數字範圍內,然後使用$ sth-> state來檢索五個字符代碼。 –

+0

這不適用於DB2。所以我現在使用out參數而不是返回值。 –

+0

正如我所說的,我不確定DB2程序是否被允許返回任何東西 - 這通常使它們成爲一個函數而不是程序。 – bohica