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

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

2013-11-29 
dbexpress获取存储过程的返回值,急急急!使用DBExpress连接DB2数据库然后调用存储过程存储过程如下:CREATE

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;

热点排行