首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

高手急救!解决办法

2012-02-28 
高手急救!!!如何判断pb调用存储过程执行是否成功!![解决办法]存储过程里有几句更新数据库的语句啊?你在存

高手急救!!!
如何判断pb调用存储过程执行是否成功!!

[解决办法]
存储过程里有几句更新数据库的语句啊?你在存储过程里每一句之后都加入@@error的判断,如果<> 0就goto error,然后再执行看看;执行完之后,你直接获取sqlca.sqlerrtext,如果这个信息长度大于0,就是有错误了。
[解决办法]
本文拟以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
 
至此本文结束。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
------解决方案--------------------


探讨
存储过程没有问题!在查询器里面执行失败!提示'主关键字重复',在pb里面就执行存储过程后,sqlca.sqlcode 照样为0,直接获取sqlca.sqlerrtext为空!


[解决办法]
一、数据库交互时如果有错误的话,对应transaction的sqlcode就为-1,sqldbcode就为对应数据库的错误编码;
二、你的transaction为sqlcasw,为什么又提到sqlca了呢?数据库交互只与你具体使用的事务对象有关;
三、写一个简单的存储过程,直接抛出错误试试,看SQL是否得到错误了;
四、如果还捕捉不到错误,换台机器试试,或检查一下本机的oracle客户端是否OK,换机测试效果更好~~
[解决办法]
调用存储过程之前commit Using sqlcasw;或RollBack using sqlcasw;一次,~~
[解决办法]
问题解决没得呢?
可以加我QQ :370801979 
远程给看看.

热点排行