原文:PB幫助
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文擬以SYBASE ASE 10.X和11.X數據庫爲例,說明如何在PB腳本當中獲取存儲過程的返回值。作爲一個存儲過程,其輸出的結果數據可能包括三類:SELECT結果集、RETURN結果、OUTPUT參數。儘管輸出方式衆多,但PB腳本僅僅藉助簡單的FETCH…INTO…語句即可全部獲取這些輸出數據,具體方式如下:
(一)在SYBASE ASE 10.X和11.X數據庫當中創建一個存儲過程deptroster,其有一個輸入參數@deptno、兩個輸出參數@totsal 和 @avgsal、一個RETURN值@number_of_emps以及包含職員姓名和工資的SELECT結果集,可見除了輸入參數@deptno外,其他均爲輸出數據,我們需要在PB腳本中獲取,具體代碼如下:
CREATE PROCEDURE deptroster @deptno integer,
@totsal double precision output,
@avgsal double precision output
AS
DECLARE @number_of_emps integer
SELECT emp_fname, emp_lname, salary FROM employee
WHERE dept_id = @deptno
SELECT @totsal = sum(salary),
@avgsal = avg(salary),
@number_of_emps = COUNT(*) FROM employee
WHERE dept_id = @deptno
RETURN @number_of_emps;
(二)PB腳本當中我們需要捕獲SELECT結果集、RETURN值和兩個輸出參數,其輸出順序也是按照“SELECT結果集、RETURN值、輸出參數”順序輸出,具體代碼如下:
integer fetchcount = 0
long lDeptno, rc
string fname, lname
double dSalary, dTotSal, dAvgSal
lDeptno = 100
//此處聲明存儲過程名稱
DECLARE deptproc PROCEDURE FOR
@rc = dbo.deptroster
@deptno = :lDeptno,
@totsal = 0 output,
@avgsal = 0 output
USING SQLCA;
//此處開始執行存儲過程
EXECUTE deptproc;
//判斷執行結果
CHOOSE CASE SQLCA.sqlcode
CASE 0
//如果返回0則表示執行成功,至少存在一個SELECT結果集
//藉助LOOP循環開始捕獲這個SELECT結果集
DO
FETCH deptproc INTO :fname, :lname, :dSalary;
CHOOSE CASE SQLCA.sqlcode
CASE 0
fetchcount++
CASE 100
MessageBox ("End of Result Set", &
string (fetchcount) " rows fetched")
CASE -1
MessageBox ("Fetch Failed", &
string (SQLCA.sqldbcode) " = " &
SQLCA.sqlerrtext)
END CHOOSE
LOOP WHILE SQLCA.sqlcode = 0
// 再單獨執行一次FETCH語句以獲取RETURN值和OUTPUT參數
FETCH deptproc INTO :rc, :dTotSal, :dAvgSal;
CHOOSE CASE SQLCA.sqlcode
CASE 0
MessageBox ("Fetch Return Value and Output" &
"Parms SUCCESSFUL", "Return Value is: " &
string (rc) &
"~r~nTotal Salary: " string (dTotSal) &
"~r~nAverage Sal: " string (dAvgSal))
CASE 100
MessageBox ("Return Value and Output Parms" &
"NOT FOUND", "")
CASE ELSE
MessageBox ("Fetch Return Value and Output" &
"Parms FAILED", "SQLDBCode is " &
string (SQLCA.sqldbcode) " = " &
SQLCA.sqlerrtext)
END CHOOSE
//此處關閉存儲過程
CLOSE deptproc;
CASE 100
// 如果返回100,則表示沒有返回結果集.
// 此時不需要單獨執行CLOSE語句.
MessageBox ("Execute Successful", "No result set")
CASE ELSE
//其他情況則表示存儲過程執行失敗,提示用戶即可
MessageBox ("Execute Failed", &
string (SQLCA.sqldbcode) " = " &
SQLCA.sqlerrtext)
END CHOOSE
至此本文結束。