存储过程的返回值问题,为什么在查询分析器里执行正确,可以在PB里就不对那?

freebirdwjy 2004-12-09 03:25:36
我在SQLSERVER里写了一个存储过程如下:

--目的:解决托运单自动编号问题
--说明:当当天的编号没有时,取出编号为1,更新wl_tbconsignforms_sequence的编号为2
-- 否则,取出当前编号,并把wl_tbconsignforms_sequence的编号加1
use iwwlms

if exists (select name from sysobjects where name = 'wl_tbconsignforms_squence'
and type='p')
drop procedure wl_tbconsignforms_squence

go

create procedure wl_tbconsignforms_squence
@create_date Varchar(7),
@consign_form_no int OUTPUT
as
if (select max(right("Consign_Form_No",4)) from wl_tbconsignforms
where left(Consign_Form_No,7) =@create_date ) is null
BEGIN
select @consign_form_no=1 from wl_tbconsignforms_sequence
update wl_tbconsignforms_sequence set consignform_seq=2
END
if @@Error <> 0
begin
Rollback
RaisError('....',16,1)
return
end

else
BEGIN
select @consign_form_no=consignform_seq from wl_tbconsignforms_sequence
update wl_tbconsignforms_sequence set consignform_seq=consignform_seq+1
END
if @@Error <> 0
begin
Rollback
RaisError('....',16,1)
return
end
go

在查询分析器里执行正常,执行语句如下:

-- Declare the variable to receive the output value of the procedure.
DECLARE @no Varchar(20)

-- Execute the procedure with a title_id value
-- and save the output value in a variable.

EXECUTE wl_tbconsignforms_squence
"T041204", @consign_form_no = @no OUTPUT

-- Display the value returned by the procedure.
PRINT @no
GO

但是在PB里执行为什么没有返回值?执行语句如下:

long ll_consign_no
DECLARE wl_tbconsignforms_squence PROCEDURE FOR wl_tbconsignforms_squence @create_date='T041201';

execute wl_tbconsignforms_squence;
fetch wl_tbconsignforms_squence into :ll_consign_no;
close wl_tbconsignforms_squence;
commit;

messagebox('ll_consign_no',ll_consign_no)
message的值总是0
...全文
198 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mittee 2004-12-16
  • 打赏
  • 举报
回复
andyzq(小强) ( ) 的方法就可以。
lzheng2001 2004-12-15
  • 打赏
  • 举报
回复
上面的2,中好象不用加if sqlca.sqlcode = 100 直接fetch 2次看行不?
lzheng2001 2004-12-15
  • 打赏
  • 举报
回复
1. 同意 laoduan_78(游戏) 的看法

2. 可以试试执行两次fetch
fetch ...
if sqlca.sqlcode = 100 then
fetch ...
endf if

3. 如果不想声明为外部函数则,加上一句 select @consign_form_no 来返回结果,来取代output参数的作用
mnsiii 2004-12-15
  • 打赏
  • 举报
回复
你建立一个基于transtion的自定义对象,在其中实例外部函数中声明这个存储过程,然后把它作为默认的连接对象,
调用是sqlca.声明的存储过程名(),注意设置sqlca.autocommit = true,调用完毕然后是设置回来
laoduan_78 2004-12-15
  • 打赏
  • 举报
回复
我遇到过,建议是另外一种方法:
声明外部函数:
function long wl_tbconsignforms_squence (string create_date,
ref long consign_form_no ) RPCFUNC ALIAS FOR "dbo.wl_tbconsignforms_squence"
然后在PB里调用,sqlca.wl_tbconsignforms_squence ('xxxxx',ref ll_output )
messagebox("",string(ll_output)),即可!
andyzq 2004-12-15
  • 打赏
  • 举报
回复
string ls_date
long ll_output

ls_data = 'xxxxx'

declare up_temp procedure for wl_tbconsignforms_squence
@create_date = :ls_date,
@consign_form_no = :ll_output output;
execute up_temp;
fetch up_temp into :ll_output; //得到输出参数值
close up_temp ;
jeff_107 2004-12-15
  • 打赏
  • 举报
回复
你在取值后检查一下sqlca.sqlcode的值,看是否正确执行了。
jeff_107 2004-12-15
  • 打赏
  • 举报
回复
晕,刚没看见,,呵呵,,,看看!
jeff_107 2004-12-15
  • 打赏
  • 举报
回复
把过程贴出来呀
renwanly 2004-12-15
  • 打赏
  • 举报
回复
关注,正在找答案
freebirdwjy 2004-12-15
  • 打赏
  • 举报
回复
帖子发了一个星期了, 谢谢终于有人关注
freebirdwjy 2004-12-15
  • 打赏
  • 举报
回复
andyzq(小强) 、lzheng2001(1加1=0) 的方法我试过了,得到的结果都是0,

laoduan_78(游戏):你的方法在pb里调用提示错误,unknown function name:wl_tbconsignforms_squence,请问为什么?如果不用sqlca的话,编译可以通过,但是运行时提示:transaction not connected
zhangdatou 2004-12-15
  • 打赏
  • 举报
回复
看起来挺麻烦的
hygougou 2004-12-15
  • 打赏
  • 举报
回复
先建个数据窗口试一下!

1,108

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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