如何在PB脚本当中获取存储过程的返回值(翻译)
2024-07-21 02:09:57
供稿:网友
原文:pb帮助
本文拟以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
至此本文结束。