起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1048|回复: 1

关于存储过程

[复制链接]
发表于 2005-1-12 14:31:56 | 显示全部楼层 |阅读模式
连接到ORACLE时,推荐使用DBExpress连接到数据库。
但由于DBExpress对存储过程支持的BUG,用存储过程数据集调用ORACLE中返回游标的函数时,只能使用BDE连接到数据库。

但为了调用ORACLE中的返回游标的函数,可以在空间下新建一个使用BDE连接的数据库。
注意:这个数据库只为了给存储过程数据集提供数据库连接使用。其下不需要建立任何表定义。

只要指定存储过程的数据库为BDE连接的数据库后,就可以正常使用了。


更多信息:
目前“存储过程数据集”有以下约束:
  1、在ORACLE中必须是一个返回游标的函数,在SQLServer中必须是一个返回游标的过程。
  2、对于返回游标的函数(或过程),目前只支持输入参数,而不支持输出参数。

使用“存储过程数据集”调用ORACLE中的函数,其必须是一个返回游标的函数。
在ORACLE中写这样的函数可以使用下面的方法:

  1、在程序包中定义游标类型。

    CREATE OR REPLACE  PACKAGE "JUSTEPTEST"."USER_TYPE"  IS
      TYPE RETURN_CURSOR IS REF CURSOR;  
    END;

  2、定义不带参数的返回游标的函数。(下面代码中SJJ_WZKCB为“物资库存表”数据表)

    CREATE OR REPLACE  FUNCTION "JUSTEPTEST"."USER_SELECT"     
    RETURN USER_TYPE.RETURN_CURSOR IS
      Result USER_TYPE.RETURN_CURSOR;
    BEGIN
      OPEN Result FOR SELECT * FROM SJJ_WZKCB;
      RETURN Result;  
    END;

  3、定义带输入参数的返回游标的函数。(下面代码中KF为“物资库存表.库房编号”字段)

    CREATE OR REPLACE  FUNCTION "JUSTEPTEST"."USER_SELECT_P"
    (v_kf in varchar2)
    RETURN USER_TYPE.RETURN_CURSOR IS
      Result USER_TYPE.RETURN_CURSOR;
    BEGIN
      OPEN Result FOR SELECT * FROM SJJ_WZKCB WHERE KF = v_kf;
      RETURN Result;  
    END;
  
  4、对函数的测试可以使用下面的命令。

    SELECT JUSTEPTEST.USER_SELECT FROM dual;

有了返回游标的存储过程后,就可以使用存储过程数据集来表现它返回的结果集了,例如:

  //使用的命名空间:Business.System, Business.Forms, Business.Model, Business.Data, Borland.Delphi.DB;

  //主窗体中测试按钮(Button1)的Click事件
  procedure TMainForm.Button1Click(Sender: TObject);
  var
    lStoredProcDataSet: TStoredProcDataSet;
    lParam: TDataParam;
  begin
    //获取存储过程数据集
    lStoredProcDataSet := TStoredProcDataSet(DataSetBroker1.DataSet);
    //关闭数据集
    lStoredProcDataSet.Close;
    //清除所有已定义的参数
    lStoredProcDataSet.Params.Clear;
    //创建参数 Result 和 v_kf
    lStoredProcDataSet.Params.CreateParam(TFieldType.ftCursor, 'Result', TParamType.ptResult);
    lStoredProcDataSet.Params.CreateParam(TFieldType.ftString, 'v_kf', TParamType.ptInput);
    //获取输入参数 v_kf
    lParam := lStoredProcDataSet.Params.FindParam('v_kf');
    if (lParam <> nil) and (cbxKF.ItemIndex >= 0) then
    begin
      //如果参数获取成功、并且 cbxKF.Text 中指定了“库房编号”,则设置输入参数,并打开数据集
      lParam.AsString := cbxKF.Text;
      //存储过程数据集只能使用Open打开数据集,而不能使用Execute去执行。
      lStoredProcDataSet.Open;
    end
    else
      Business.Forms.Dialogs.ShowMessage('参数 v_kf 不存在,或未指定“库房编号”。');
  end;
回复

使用道具 举报

发表于 2005-6-3 10:31:51 | 显示全部楼层

补充说明

如何调用Oracle中的存储过程?

同样,先在包中新建游标类型
create or replace package p_test Is
  TYPE T_CURSOR IS REF CURSOR;
end p_test;
再建立存储过程
create or replace procedure protest
(AID Varchar2,
AResult Out p_test.T_CURSOR
) Is
begin
  Open AResult For
    Select * From TDept Where FGUID=AID;
end protest;

前台调用
procedure test(sID: String);
begin
with DataSetCCGCSJJ1 do
  begin
    Close;
    Params.ParamByName('AID').AsString := sID;
    Params.ParamByName('AResult').DataType := TFieldType.ftCursor;  //返回参数的类型必须设置,否则出错
    OPen;
end;
end.
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-5-3 05:42 , Processed in 0.048353 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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