如何调用数据库中带返回值的存储过程?
需要为多条记录多次调用数据库中一存储过程nnn(输入参数arg1,2,3,4),
执行完成后需提取返回值
DECLARE myproc PROCEDURE FOR
@ret_st = nnn
@xls = :arg1,
@hcbz = :arg2,
@hcfg = :arg3,
@hcnu = :arg4,
@ret_st = 1 output,
@ret_text = "" output;
若ret_st = 0 COMMIT
否则ROLLBACK
但整个程序 SQLCA.AUTOCOMMIT = TRUE
同时定义myproc时,系统警告必须定义变量@ret_st
请问该如何在PB中使用该存储过程?同时如何解决COMMIT的问题
问题点数:50、回复次数:15Top
1 楼huangxinru(键盘手)回复于 2002-10-08 18:07:39 得分 5
EXECUTE 存储过程;
DO WHILE sqlca.sqlcode = 0
FETCH 存储过程 INTO :变量;
LOOP
Top
2 楼blueshu(学习Oracle9i)回复于 2002-10-08 18:11:43 得分 0
ret_st库里有没有定义啊Top
3 楼the_rabbit(兔霸王)回复于 2002-10-08 18:14:13 得分 0
ret_st是存储过程中的变量(是一个输出变量)
在PB中没有定义Top
4 楼flyerlxg(飞鸟)回复于 2002-10-08 18:29:39 得分 10
既然是SQLCA.AUTOCOMMIT = TRUE,那您又要来控制提交事物呢?大不了您是需要根据存储过程的执行情况来提交事物了,那最好把前面的那条属性设为false,然后在执行完存储过程后判断sqlca.sqlcode代码的情况,从而知道语句的执行情况,最后决定是提交还回滚。语句如 楼上的:
EXECUTE 存储过程;
DO WHILE sqlca.sqlcode = 0
FETCH 存储过程 INTO :变量;
LOOPTop
5 楼the_rabbit(兔霸王)回复于 2002-10-08 18:38:27 得分 0
这点我已经明白,但对于如何定义和使用该存储过程,不甚清楚
Top
6 楼the_rabbit(兔霸王)回复于 2002-10-08 21:07:33 得分 0
能详细说明一下吗??Top
7 楼xhwly(wly)回复于 2002-10-08 21:29:12 得分 0
DECLARE myproc PROCEDURE FOR nnn
@xls = :arg1,
@hcbz = :arg2,
@hcfg = :arg3,
@hcnu = :arg4,
@ret_st = :arg5 output,
@ret_text = :arg6 output;
execute myproc ;
if sqlca.sqlcode = -1 then
messagebox("","error!")
return
end if
fetch myproc into :arg4,:arg5;
if arg4 = 0 then
commit;
else
rallback;
end if
Top
8 楼xhwly(wly)回复于 2002-10-08 21:30:54 得分 15
DECLARE myproc PROCEDURE FOR nnn
@xls = :arg1,
@hcbz = :arg2,
@hcfg = :arg3,
@hcnu = :arg4,
@ret_st = :arg5 output,
@ret_text = :arg6 output;
execute myproc ;
if sqlca.sqlcode = -1 then
messagebox("","error!")
return
end if
fetch myproc into :arg5,:arg6;
if arg5= 0 then
commit;
else
rallback;
end if
Top
9 楼the_rabbit(兔霸王)回复于 2002-10-09 08:18:57 得分 0
不知道大家有没有注意到
@ret_st = nnn,对存储过程有没有什么影响?
同时按 xhwly(wly)的使用方法,系统仍然警告必须定义变量@ret_st
请问如何解决?Top
10 楼inalover(奇遇)回复于 2002-10-09 08:54:11 得分 5
这样试试
long ll_ret
DECLARE myproc PROCEDURE FOR nnn
@xls = :arg1,
@hcbz = :arg2,
@hcfg = :arg3,
@hcnu = :arg4,
@ret_st = :arg5 output,
@ret_text = :arg6 output;
execute ll_ret=myproc ;
if sqlca.sqlcode = -1 then
messagebox("","error!")
return
end if
fetch myproc into :arg5,:arg6;
if arg5= 0 then
commit;
else
rallback;
end if
Top
11 楼warchild(大成若缺)回复于 2002-10-09 08:58:46 得分 5
//emp_select is database proc
// The syntax of emp_select is:
// "SELECT emp_id
// FROM employee WHERE emp_state=@stateparm".
DECLARE my_proc DYNAMIC PROCEDURE FOR SQLSA ;
integer Emp_id_var
string Emp_state_var
PREPARE SQLSA FROM "emp_select @stateparm=?" ;
Emp_state_var = "MA"
EXECUTE DYNAMIC my_proc USING :Emp_state_var ;
FETCH my_proc INTO :Emp_id_var ;
CLOSE my_proc ;
也可用sqlda来做参数传递工作Top
12 楼gija(深蓝)回复于 2002-10-09 09:08:36 得分 0
从transcation继承一个对象,代替sqlca,在继承的对象里,local external functions定义存储过程,列入function long p_login(string login_no,string login_passwd,ref string user_name,ref string r) RPCFUNC ALIAS FOR "dbo.p_login"//用户登陆处理Top
13 楼my_yinger(竹林中)回复于 2002-10-09 09:32:26 得分 5
如何带参数执行SQL的系统存储过程?PB编程俱乐部 http://kjx.126.com
例:
-----------------------------------------------------------------
MS SQL Server存储过程 Sp_DropUser
CREATE PROCEDURE Sp_DropUser
( @in_db int, @in_ou int OUTPUT )
AS
.
.
.
-----------------------------------------------------------------
PB中执行
int ls_name //输入参数
int ls_ou //输出参数
DECLARE dropUser_proc PROCEDURE FOR Sp_DropUser
@in_db =:ls_name , @in_ou =:ls_ou OUTPUT;
SQLca.AutoCommit = TRUE
EXECUTE dropUser_proc ;
fetch user_jj into :ls_ou;
SQLca.AutoCommit = false
Top
14 楼my_yinger(竹林中)回复于 2002-10-09 09:36:53 得分 0
上面是以前我根据 PB编程俱乐部 http://kjx.126.com 中介绍,
然后在实际工作中具体修改而成的,今天才发现http://kjx.126.com/已经上不去了Top
15 楼ylp163net(ylp)回复于 2002-10-09 13:24:15 得分 5
declare pro_prjid procedure for sp_hkproject_ret @prjid =:prjid output;
execute pro_prjid ;
fetch pro_prjid into :prjid ;
close pro_prjid ;Top




