我需要檢索我編寫的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原則。也就是說,我不應該打電話給我。然後在決定是否撥打另一個存檔,即「詢問」之前讓它回覆一個數字。
我應該只打電話給第一個存檔。並決定是否應該調用另一個片斷,即「告訴」並讓它決定。
感謝您的幫助。我將使用你的建議在SQL「?= call MY_TABLE_SPACE.MY_SPROC」中使用一個賦值以及bind_param_inout。 「使用SQLSTATE」意味着在sproc中設置一個明確的SQLSTATE值,在用戶定義的數字範圍內,然後使用$ sth-> state來檢索五個字符代碼。 –
這不適用於DB2。所以我現在使用out參數而不是返回值。 –
正如我所說的,我不確定DB2程序是否被允許返回任何東西 - 這通常使它們成爲一個函數而不是程序。 – bohica