起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: lixy

存储过程在X3中的使用方法!【欢迎跟帖讨论一下】

[复制链接]
发表于 2007-6-27 09:55:55 | 显示全部楼层
我的参数里有三种类型,verchar2,number,date,number的在平台中会生成ftFMTBcd类型,然后就会出6楼的错误,把所有的ftFMTBcd全部改成ftfloat类型后就不会出错了。其他verchar2和date类型的参数没有改过。
回复 支持 反对

使用道具 举报

发表于 2007-6-27 10:02:44 | 显示全部楼层
过程参数定义如下:
prm_PersonNo      IN   VARCHAR2,
prm_ExcuteDate    IN   DATE,
prm_Salary        IN   NUMBER,
prm_SIInfo        IN   VARCHAR2,
prm_PensionBase   OUT  NUMBER,
prm_MedicBase     OUT  NUMBER,
prm_UnemployBase  OUT  NUMBER,
prm_AccidentBase  OUT  NUMBER,
prm_BearingBase   OUT  NUMBER,
prm_AppCode       OUT  NUMBER,
prm_ErrorMsg      OUT  VARCHAR2

---------------------------------------------------------------------------
程序调用代码(aac001是个人编号字段,verchar2类型;aac040是工资字段,number类型)
StoredProc1.Params.ParamByName('prm_PersonNo').AsString:= datasetbroker1.DataSet.FieldByName('aac001').AsString;     
StoredProc1.Params.ParamByName('prm_ExcuteDate').AsDateTime:= SysSrv.SysService.Time;
StoredProc1.Params.ParamByName('prm_Salary').AsFloat:= datasetbroker1.DataSet.FieldByName('aac040').AsFloat;
StoredProc1.Params.ParamByName('prm_SIInfo').AsString:= '00100';:
StoredProc1.Execute;

jfjs := StoredProc1.Params.ParamByName('prm_MedicBase').AsFloat;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-27 11:42:46 | 显示全部楼层
存储过程:
create or replace procedure testproc
(
prm1      IN   VARCHAR2,
prm2    IN   DATE,
prm3        IN   NUMBER,

prm11   OUT  VARCHAR2,
prm12     OUT  DATE,
prm13      OUT NUMBER
)

is
begin
  prm11:=prm1||'-test';
  prm12:=prm2+1;
  prm13:=prm3+1;
end testproc;
代码:
procedure TCT1.Button1Click(Sender: TObject);
begin
  with  StoredProc1 do
  begin
       Params.ParamByName('prm1').AsString:='x3';
       Params.ParamByName('prm2').AsDateTime:=SysSrv.SysService.Time;
       Params.ParamByName('prm3').Asfloat:=125.5;
       StoredProc1.Execute;
       Memo1.Lines.Add(Params.ParamByName('prm11').AsString);
       Memo1.Lines.Add(Params.ParamByName('prm12').AsString);
       Memo1.Lines.Add(Params.ParamByName('prm13').AsString);

  end;
end;

Snap1.png

9.93 KB, 下载次数: 971

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-27 11:43:11 | 显示全部楼层
楼上的错误是日期类型产生的,日期传回的是零值。跟float那个无关。暂时先别用oracle的date类型了,传字符串,内部转换处理吧。
结果

Snap2.png

7.18 KB, 下载次数: 962

回复 支持 反对

使用道具 举报

发表于 2007-7-3 17:42:08 | 显示全部楼层

手工代码创建TStoredProc问题

手工代码创建TStoredProc后,参数是不是不能自动取得?我对Params[0].Value一赋值,就会跳出越界的错误。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-4 10:05:51 | 显示全部楼层
稍等,我写下测试代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-4 10:32:10 | 显示全部楼层
代码方式:


存储过程:
create or replace procedure TestProc_20070704

(prmin in varchar2
, prmout1 out  number
,prmout2 out  varchar2) is
begin
  prmout1:=1234;
  prmout2:=prmin||'-justep';
end TestProc_20070704;


方法1:
procedure TMainForm.Button2Click(Sender: TObject);
var storedproc :TStoredProc;
begin

  storedproc := TStoredProc.Create(Self);
  try
    storedproc.ConnectionString :='DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
    storedproc.StoredProcName :='TESTPROC_20070704';

    storedproc.Params.Clear;

    storedproc.Params.CreateParam(TFieldType.ftString,'prmin',TParamType.ptInput).AsString :='LX';
    storedproc.Params.CreateParam(TFieldType.ftFMTBcd,'prmout1',TParamType.ptOutput);
    storedproc.Params.CreateParam(TFieldType.ftString,'prmout2',TParamType.ptOutput);
    storedproc.Execute;

    memo1.Lines.Add(storedproc.params[1].AsString);
    memo1.Lines.Add(storedproc.params[2].AsString);


  finally
    storedproc.Free;
  end;
end;

方法2(推荐使用)
procedure TMainForm.Button1Click(Sender: TObject);
var storedproc :TStoredProc;
begin

  storedproc := TStoredProc.Create(Self);
  try
    storedproc.ConnectionString :='DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
    storedproc.StoredProcName :='TESTPROC_20070704';
    storedproc.Params.ParamByName('prmin').AsString :='LX';

    storedproc.Execute;

    memo1.Lines.Add(storedproc.params[1].AsString);
    memo1.Lines.Add(storedproc.params[2].AsString);


  finally
    storedproc.Free;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-21 16:07:26 | 显示全部楼层
动态创建存储过程数据集例子:
存储过程:
create proc ljtest
@kind varchar(20),
@space varchar(40)
as
  select *
    from tfilesystem
   where FKIND=@kind
     and FSpace like @space
GO
代码:
  TMainForm = class(TForm)
   。。。。。
  public
    {public declarations}
     DataSetProc: TStoredProcDataSet;
  end;
。。。。。
procedure TMainForm.Button3Click(Sender: TObject);
begin
  DataSetProc:=TStoredProcDataSet.Create(self);
  DataSetProc.ConnectionString :='DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
  DataSetProc.StoredProcName:='ljtest';
  DataSetProc.Params.ParamByName('@kind').AsString:='.PDB';
  DataSetProc.Params.ParamByName('@space').AsString:='\SYSTEM\';
  DataSetProc.Open;
  DataSource2.DataSet:=DataSetProc;
  datagrid1.DataSource:=DataSource2;
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin

  DataSetProc.Free;
  DataSetProc:=nil;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 00:41 , Processed in 0.040528 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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