数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
如何在PB脚本当中获取存储过程的返回值(翻译)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站


 

本文拟以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

 

至此本文结束。




相关文章

相关软件