如何在PB脚本当中获取存储过程的返回值(翻译) - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 如何在PB脚本当中获取存储过程的返回值(翻译) (http://www.webasp.net/article/21/20891.htm) |
| -- 作者:未知 -- 发布日期: 2005-04-29 |
本文拟以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 至此本文结束。 |
| webasp.net |