pb 通过odbc连接db2数据库(sqlserver也一样),获取存储过程return值(不是out参数值)的问题.

dongfang_beback 2005-11-16 09:18:47
我用odbc连接db2数据库
1、我在数据库中定义的存储过程如下:
CREATE PROCEDURE DB2ADMIN.DB2TEST ( )
------------------------------------------------------------------------
-- SQL 存储过程
------------------------------------------------------------------------
P1: BEGIN
RETURN 999 ;
END P1

2、我在PB中如下调用

INTEGER I

DECLARE PROC_CDF PROCEDURE FOR DB2ADMIN.DB2TEST();

EXECUTE PROC_CDF;

FETCH PROC_CDF INTO :I;

CLOSE PROC_CDF;

每当执行到FETCH的时候就提示我cursor not open,并且没有获取到存储过程的return值,如果我

把存储过程改写成如下样子,就能获取到获取到值,但不是return值;

CREATE PROCEDURE DB2ADMIN.DB2Test ()
------------------------------------------------------------------------
-- SQL 存

------------------------------------------------------------------------
P1: BEGIN

DECLARE tempcursor CURSOR WITH RETURN TO CLIENT FOR SELECT ISSPLIT FROM TB_SPECIAL WHERE

SPECIALNO = '2005100804';

OPEN tempcursor;

END P1

道理是一样的,我可以把上面的游标换成我想要return出来的值,如:select -20098 from 表之

类,我同样能够获得要return出来的值,只不过存储过程中就要在我原来所有return语句前加

上这样一个游标,好烦琐.

我想能不能用数据库中的自定义函数调用存储过程,由数据库函数获取存储过程的return值,并返回

该值,或者通过更好的方法获取存储过程的return值,请各位大虾帮忙解决,谢谢!
...全文
461 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongfang_beback 2005-11-17
  • 打赏
  • 举报
回复
弄了半天,不知道如何结贴
dongfang_beback 2005-11-17
  • 打赏
  • 举报
回复
按照http://www.gssc.com.cn/wenda/33.htm中的说明,配置一下pbodb90.ini和dbparm就可以使用 RPC方法来使用存储过程
dongfang_beback 2005-11-17
  • 打赏
  • 举报
回复
感谢 lzheng2001(1加1) ,问题已经解决,请参考以下文挡

http://www.gssc.com.cn/wenda/33.htm
lzheng2001 2005-11-17
  • 打赏
  • 举报
回复
以前试过ODBC连接SQL SERVER用fetch取OUTPUT参数是会有错误的,用其它方式连则没问题.
你试试以下代码吧.
一般取out参数及return 值,我都用上面说的方法,而不用你的方法的.

INTEGER I

DECLARE PROC_CDF PROCEDURE FOR DB2ADMIN.DB2TEST2 @USERID = :i out;

EXECUTE PROC_CDF;

FETCH PROC_CDF INTO :I;

CLOSE PROC_CDF;
dongfang_beback 2005-11-17
  • 打赏
  • 举报
回复
lzheng2001(1加1):
你好!
说实话,到目前我还不知道如何在db2中调用带out参数的存储过程,我是按照如下步骤来测试的;
存储过程定义如下:
CREATE PROCEDURE DB2ADMIN.DB2TEST2 ( out @USERID INTEGER )
P1: BEGIN
SET @USERID = 889;
END P1

第一中调用方法:

INTEGER I

DECLARE PROC_CDF PROCEDURE FOR DB2ADMIN.DB2TEST2 I;

EXECUTE PROC_CDF;

FETCH PROC_CDF INTO :I;

CLOSE PROC_CDF;

报错:SQLSTATE = S0022
[IBM][CLI Driver][DB2/NT] SQL0206N "I" 在使用它的上下文中无效。STATE=42703

第二种调用方法:

INTEGER I

DECLARE PROC_CDF PROCEDURE FOR DB2ADMIN.DB2TEST2 @USERID = :I OUT;

EXECUTE PROC_CDF;

FETCH PROC_CDF INTO :I;

CLOSE PROC_CDF;

报错:SQLSTATE = 42601
[IBM][CLI Driver][DB2/NT] SQL0104N 在 "MIN.DB2TEST2(@USERID" 之后发现意外 的标记 "=0 OUT)"。期望的标记可能包括:"<space>"。 SQLSTATE=42601

第三种调用方法:

INTEGER I

DECLARE PROC_CDF PROCEDURE FOR DB2ADMIN.DB2TEST2 I out;

EXECUTE PROC_CDF;

FETCH PROC_CDF INTO :I;

CLOSE PROC_CDF;

报错:
SQLSTATE = 42601
[IBM][CLI Driver][DB2/NT] SQL0104N 在 "DB2ADMIN.DB2TEST2(I" 之后发现意外的标记 "out"。期望的标记可能包括:"<space>"。 SQLSTATE=42601
lzheng2001 2005-11-16
  • 打赏
  • 举报
回复
我记得是可以的,你试过了没有?

你先试一下吧
dongfang_beback 2005-11-16
  • 打赏
  • 举报
回复
各位能否在回复的时候给出一些具体的方法
dongfang_beback 2005-11-16
  • 打赏
  • 举报
回复
通过odbc连接数据库,好象不能使用local external function方法来调用存储过程
braversmmu 2005-11-16
  • 打赏
  • 举报
回复
可以用数据库中的自定义函数调用存储过程
lzheng2001 2005-11-16
  • 打赏
  • 举报
回复
要获取OUTPUT参数或者Return值 可把procedure作為transaction的外部函數引用(local external function). 新建->standare class-> transation -> local external function -> 右键 -> paste special->sql -> remote sp
引用时,要先给PB变量定义大小,string ls_out space(10) 与 sp中output定义的长度一致

打开application -> 属性页中占击->additional properties->variable types->sqlca 下面填上这个uo的名字->ok

调用 li_return = sqlca.sp_name(...)
lzheng2001 2005-11-16
  • 打赏
  • 举报
回复
查看一下sqlerrtext的信息是什么.
dongfang_beback 2005-11-16
  • 打赏
  • 举报
回复
试过了,用odbc连接sqlserver可以用local external function,但是db2就是不行

754

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧