起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 172|回复: 7

[问题]存储过程返回值与commit的问题

[复制链接]
发表于 2007-9-12 12:25:34 | 显示全部楼层 |阅读模式
存储过程
create or replace procedure  TestReturnValue
(
   as_tjdw      varchar2,
  as_tjjd      out varchar2, --统计进度标志
  as_tjywcrq   out varchar2, --统计源修改或完成日期
  ai_return    out number,
  as_errmsg    out varchar2
)
is
begin
as_tjjd   := 'a';
as_tjywcrq      := 'b';
ai_return       :=  1;
as_errmsg       :='Return Nothing?';
end;

程序:
  with lConnection do
  try   ConnectionString := 'DATABASEURL=Biz:\ZHAJ_DS\DSEZHAJ_TJSJK.Database';
    Connected := True;
    with Transaction do
    begin
      h := Start(False);
      try
        with TStoredProc.Create(nil) do
        try

          Connection := lConnection;
          StoredProcName := TestReturnValue;
          Params.Clear;
          //统计单位
          Params.CreateParam(TFieldType.ftString, 'as_tjdw', TParamType.ptInput);
          //统计单位
          Params.CreateParam(TFieldType.ftString, 'as_tjjd', TParamType.ptOutput);

          Params.CreateParam(TFieldType.ftString, 'as_tjywcrq', TParamType.ptOutput);
          Params.CreateParam(TFieldType.ftInteger, 'ai_return', TParamType.ptOutput);
          Params.CreateParam(TFieldType.ftString, 'as_errmsg', TParamType.ptOutput);

          Params.ParamByName('as_tjdw').AsString := '350802000000';
           Execute;
          ai_return := Params.ParamByName('ai_return').AsInteger;
          as_errortext := Params.ParamByName('as_errmsg').AsString;
          ls_progress := Params.ParamByName('as_tjjd').AsString;
          jsDialogs.ShowMsg('Commit前:' + as_errortext, '提示');
          jsDialogs.ShowMsg('Commit前:' + ls_progress, '提示');
          jsDialogs.ShowMsg('Commit前:' + IntToStr(ai_return), '提示');
          jsDialogs.ShowMsg('Commit前:' + Params.ParamByName('as_tjywcrq').AsString, '提示');

        finally
          Free;
        end;
        commit(h);
      except
        RollBack(h);
        Raise;
      end;
    end
  finally
    Free;
  end;
为什么我在Execute后,那些返回值都是空的?
这手动创建TStoredProc与事务会不会有什么问题?
是不是只在commit的时候,存储过程才真正的Execute?

但是如果我用控件StoredProc1 处理的话
返回值又是正常的??


  with lConnection do
  try
    ConnectionString := 'DATABASEURL=Biz:\ZHAJ_DS\DSEZHAJ_TJSJK.Database';
    Connected := True;
    with Transaction do
    begin
      h := Start(False);
      try
        //with StoredProc1 do
        try

          StoredProcName := 'TestReturnValue';
          Params.ParamByName('as_tjdw').AsString := '350802000000';
           Execute;
          ai_return := Params.ParamByName('ai_return').AsInteger;
          as_errortext := Params.ParamByName('as_errmsg').AsString;
          ls_progress := Params.ParamByName('as_tjjd').AsString;
          jsDialogs.ShowMsg('Commit前:' + as_errortext, '提示');
          jsDialogs.ShowMsg('Commit前:' + ls_progress, '提示');
          jsDialogs.ShowMsg('Commit前:' + IntToStr(ai_return), '提示');
          jsDialogs.ShowMsg('Commit前:' + Params.ParamByName('as_tjywcrq').AsString, '提示');
        except
          Raise;
        end;
        commit(h);
      except
        RollBack(h);
        Raise;
      end;
    end
  finally
    Free;
  end;
回复

使用道具 举报

 楼主| 发表于 2007-9-12 14:24:36 | 显示全部楼层
啥没人帮我解答呢?
急呀!
回复 支持 反对

使用道具 举报

发表于 2007-9-12 14:46:42 | 显示全部楼层
你代码创建的东西少了,暂时还没看出少哪里了。 这个跟事务没关系。。。。

不放心的话,你把事务写到存储过程里就ok了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-12 14:54:50 | 显示全部楼层
什么东西少了?
他根本就不执行,
只有在commit后才会等到返回值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-12 15:09:55 | 显示全部楼层
您老能不能测试一下就知道?
回复 支持 反对

使用道具 举报

发表于 2007-9-12 15:12:46 | 显示全部楼层
我真没这样用过,一般都是在处理事务前就把控件准备好了(动态创建或者添加的控件)
。  既然能在commit后返回值,那应该没少东西。你把创建控件代码写在 h := Start(False);
前面试试
回复 支持 反对

使用道具 举报

发表于 2007-9-12 15:37:06 | 显示全部楼层
我自己也试试,如果知道为什么,我再回帖子
回复 支持 反对

使用道具 举报

发表于 2007-9-12 18:03:57 | 显示全部楼层
这个设成true
h := Start(true);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-15 23:41 , Processed in 0.037469 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表