读书人

dbexpress获取存储过程的返回值解决

发布时间: 2013-11-29 13:49:33 作者: rapoo

dbexpress获取存储过程的返回值,急急急!
使用DBExpress连接DB2数据库
然后调用存储过程
存储过程如下:
CREATE PROCEDURE proc_NewSave_Sys (v_uniqueguid_2 VARCHAR(36),
v_uniqueid_3 VARCHAR(32),
v_agent_4 VARCHAR(16),
v_callid_5 VARCHAR(24)
)
LANGUAGE SQL

BEGIN

DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

DECLARE l_error CHAR(5) DEFAULT '00000';

DECLARE RETURN_VALUE INTEGER;

DECLARE v_ret INTEGER;

DECLARE l_rowcount INTEGER;

DECLARE temp_cursor CURSOR WITH HOLD WITH RETURN TO CLIENT
FOR SELECT lsh
FROM t_sys
WHERE uniqueguid = v_uniqueguid_2;

DECLARE CONTINUE HANDLER FOR NOT FOUND

SET l_error = '00000';

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING

BEGIN

SET l_error = SQLSTATE;

IF SUBSTR(l_error, 1, 1) >= '5'
AND SUBSTR(l_error, 1, 1) <= '9' THEN

RESIGNAL;

END IF;

END;
SET v_outvalue = -2;
OPEN temp_cursor;
SELECT COUNT(*)
INTO l_rowcount
FROM (SELECT lsh
FROM t_sys
WHERE uniqueguid = v_uniqueguid_2) temp_table;

IF l_rowcount > 0 THEN
SET l_error = '00000';
UPDATE t_sys SET
agent=v_agent_4,
callid=v_callid_5
WHERE
uniqueguid = v_uniqueguid_2;
COMMIT;

IF l_error != '00000' THEN
SET RETURN_VALUE = l_error;
RETURN RETURN_VALUE ;
ELSE
SET RETURN_VALUE = 1;
RETURN 1;
END IF;
ELSE
SET l_error = '00000';
INSERT INTO t_sys (uniqueguid,uniqueid,agent,callid)
VALUES (v_uniqueguid_2,v_uniqueid_3,v_agent_4,v_callid_5);
COMMIT;
IF l_error != '00000' THEN
SET RETURN_VALUE = l_error;
RETURN RETURN_VALUE ;
ELSE
SET RETURN_VALUE = 1;
RETURN 1;
END IF;


END IF;
END!

在用TSQLStoredProc调用,调用如下
FStoredProc.Close;
FStoredProc.Params.Clear;
FStoredProc.StoredProcName:= 'PROC_NEWSAVE_SYS';
//FStoredProc.Params.CreateParam(ftInteger,'v_return',ptResult).AsInteger:= -1;
FStoredProc.Params.CreateParam(ftString,'v_uniqueguid_2',ptInput).AsString:= 'DVS+';
FStoredProc.Params.CreateParam(ftString,'V_uniqueid_3',ptInput).AsString:= guid;
FStoredProc.Params.CreateParam(ftString,'V_agent_4',ptInput).AsString:= '3001';
FStoredProc.Params.CreateParam(ftString,'V_callid_5',ptInput).AsString:= '';
FStoredProc.ExecProc;
//V_RETURN:=FADOStoredProc.Params.ParamByName('V_RETURN').Value;

设置了ptResult参数后,会报错。
我记得用ADO的时候,可以这样用!怎么用DBExprss不行,是不是我的调用方式不对!
注意:不要叫我改存储过程,我知道用OUTPUT是参数,是可以做到一样的效果
数据库 delphi?DB2 delphi???db2
[解决办法]
同样使用过dbExpress控件 出这样的问题 建议改用ado控件
[解决办法]
参考一下这个。连接FB的存储过程。

with SQLStoredProc do
begin
try
SQLConnection := BuildConnection;
ParamCheck := True;
StoredProcName := 'BUILD_ADD';
if not BuildConnection.Connected then
BuildConnection.Open;
ParamByName('BUILD_NO').AsInteger := build_no;
ParamByName('FLOOR_COUNT').AsInteger := floor_count;
ParamByName('FLOOR_FAMILY').AsInteger := floor_family;
ParamByName('GATE_COUNT').AsInteger := gate_count;
Prepared := True;
ExecProc;
if ParamByName('IS_ERROR').AsString = 'Y' then
begin
Err_Msg := UTF8ToString(ParamByName('ERR_MSG').AsWideString);
Result := True;
end
else
begin
Result := False;
end;
except
raise Exception.Create('读取数据出现错误,请通知管理员!');
end;
end;

读书人网 >.NET

热点推荐