如何在PB腳本當中獲取存儲過程的返回值(翻譯)

原文:PB幫助

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

本文擬以SYBASE ASE 10.X11.X數據庫爲例,說明如何在PB腳本當中獲取存儲過程的返回值。作爲一個存儲過程,其輸出的結果數據可能包括三類:SELECT結果集、RETURN結果、OUTPUT參數。儘管輸出方式衆多,但PB腳本僅僅藉助簡單的FETCH…INTO…語句即可全部獲取這些輸出數據,具體方式如下:

(一)在SYBASE ASE 10.X11.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

 

至此本文結束。
發佈了32 篇原創文章 · 獲贊 1 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章