起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 2822|回复: 17

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

[复制链接]
发表于 2007-6-18 13:45:23 | 显示全部楼层 |阅读模式
x3系统调用sqlserver  oracle存储过程的特殊性



1、在oracle中返回游标,不能将存储过程写入包中,应该写在外部。将游标类型声明写
在包中,外部存储过程用“包名.自定义游标类型”方式访问自定义类型。

2、系统不支持包里面的调用,注意外部的存储过程不要和包内的存储过程重名。


3、如果需要返回数据集或者游标时,应该用        TStoredProcDataSet.
        在返回数据集时,其他设置的output参数不能返回值,只会返回一个空值。
       
        在以下例子中,包含的x3都支持,不包含的不支持。比如:2个返回数据集。

4、如果执行报参数设置错误类的,尝试着手工修改下参数的数据类型。

5、orcale存储过程date类型暂时不要用,平台有缺陷。
回复

使用道具 举报

 楼主| 发表于 2007-6-18 13:46:12 | 显示全部楼层
sqlserver例子
普通参数N个输入N个输出
                存储过程:
                                ALTER   PROCEDURE [dbo].[test_proc]
                                                @inprm      varchar(255) ,
                                                @inprm1      varchar(255) ,
                                                @inprm2      varchar(255) ,
                                                @outprm      varchar(255) output,
                                                @outprm1      varchar(255) output,
                                                @outprm2      varchar(255) output
                                        AS
                                                select @outprm=@inprm+@inprm1+@inprm2
                                                select @outprm1=@inprm1+@inprm2+@inprm
                                                select @outprm2=@inprm2+@inprm1+@inprm
       


                X3:
                        组件:
                                StoredProc1: TStoredProc;           
                        代码:       
                           StoredProc1.Params.ParamByName('@inprm').AsString:='1';
                           StoredProc1.Params.ParamByName('@inprm1').AsString:='2';
                           StoredProc1.Params.ParamByName('@inprm2').AsString:='3';
                           StoredProc1.Execute;
                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('@outprm').AsString);
                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('@OUTPRM1').AsString);
                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('@OUTPRM2').AsString);
                       
n个输入1个数据集输出
                存储过程:
                                ALTER   PROCEDURE [dbo].[test_proc]
                                        @inprm     int ,
                                        @inprm1     int
       
                                AS
                                        select * from table1 where id=@inprm+@inprm1

                X3:
                        组件:
                                DataSetCCGCSJJ1: TStoredProcDataSet;      
                        代码:       
                                DataSetCCGCSJJ1.Params.ParamByName('@inprm').AsInteger:=1;
                                        DataSetCCGCSJJ1.Params.ParamByName('@inprm1').AsInteger:=2;
                                        DataSetCCGCSJJ1.Active:=true;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-18 13:46:42 | 显示全部楼层
oracle例子
普通参数N个输入N个输出
                存储过程:
                        create or replace procedure test_proc
                                (inprm in varchar2,
                                inprm1 in varchar2,
                                inprm2 in varchar2
                                , outprm out varchar2
                                , outprm1 out varchar2
                                , outprm2 out varchar2
                                ) is
                                begin
                                  outprm:=inprm||'-test'||inprm1||inprm2;
                                  outprm1:=inprm||'-2test'||inprm1;
                                  outprm2:=inprm||'-3test'||inprm1;
                                end test_proc;

                X3:
                        组件:
                                StoredProc1: TStoredProc;           
                        代码:       
                           StoredProc1.Params.ParamByName('inprm').AsString:='111';
                           StoredProc1.Params.ParamByName('inprm1').AsString:='22222';
                           StoredProc1.Params.ParamByName('inprm2').AsString:='测试';
                           StoredProc1.Execute;
                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('outprm').AsString);

                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('OUTPRM1').AsString);
                           Memo1.Lines.Add(StoredProc1.Params.ParamByName('OUTPRM2').AsString);
                       
n个输入1个数据集输出               
                        包:
                                create or replace package lxy_pak
                                -- Public type declarations
is                               
  type cur_emp is ref CURSOR;
                                end;
               
                        存储过程:       
                                create or replace procedure test_proc
                                        (inprm in varchar2
                                        , inprm1 in varchar2
                                        , inprm2 in varchar2
                                        ,emps out lxy_pak.cur_emp
                                        ) is
                                        begin
                                        open emps for select * from table1 where id>=(inprm+inprm1+inprm2);

                                end test_proc;

                X3:
                        组件:
                                DataSetCCGCSJJ1: TStoredProcDataSet;      
                        代码:       
                                 DataSetCCGCSJJ1.Params.ParamByName('inprm').AsString:='1';
                                     DataSetCCGCSJJ1.Params.ParamByName('inprm1').AsString:='0';
                                     DataSetCCGCSJJ1.Params.ParamByName('inprm2').AsString:='1';                                    
                                        DataSetCCGCSJJ1.Active:=true;
                        注意,参数属性内存在EMPS游标参数要修改datatype属性为ftCURSOR
回复 支持 反对

使用道具 举报

发表于 2007-6-20 13:48:50 | 显示全部楼层
不支持的存储过程也说明一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-21 10:08:31 | 显示全部楼层
不支持的我列一下,但可能不太全,我以后会慢慢补全。

不支持的存储过程:
          *有2个或者2个以上的返回数据集,或者游标。
          *不支持有数据集(游标)返回,并返回普通参数
          *不支持oracle包内的存储过程调用
回复 支持 反对

使用道具 举报

发表于 2007-6-26 10:32:49 | 显示全部楼层
用平台得StoredProc控件调用oracle过程,参数自动取得,用代码对输入参数赋值,代码如下
    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';

其中参数'prm_PersonNo'、'prm_SIInfo'库中为verchar2类型,'prm_ExcuteDate'为date类型,'prm_Salary'为number类型,可是运行程序后会提示如图错误,存储过程在oracle中运行正常,请问是什么问题谢谢。

3.jpg

22.55 KB, 下载次数: 1093

回复 支持 反对

使用道具 举报

发表于 2007-6-26 14:19:38 | 显示全部楼层
实验证明,由平台自动取出的存储过程的参数,如果oracle中是number类型的,会生成ftFMTBcd(?不懂是什么意思,请解释下),将其改成ftFloat类型后不会再出现这个问题。在以前的帖子中看到平台技术支持人员说最好参数由平台自动获取,不要修改,所以没有注意到这个问题。现在出现这种问题,能否解释一下?关于这个问题能否给个明确的说法,是否以后都要将平台自动获取的ftFMTBcd参数类型改为ftFloat?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-26 16:20:52 | 显示全部楼层
把NUMBER类型取错了,成了ftFMTBcd(某种bcd类型)
经确认是产品缺陷,已经提交,谢谢pure1437!
平台把字段类型取错了!
回复 支持 反对

使用道具 举报

发表于 2007-6-26 17:14:40 | 显示全部楼层
不客气,你们也辛苦了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-26 18:11:26 | 显示全部楼层
错了,你上面的错应该是其他的字符串转换float出错。
不用修改ftFMTBcd,只要用asfloat访问参数就行了
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-4-30 04:58 , Processed in 0.043138 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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