连接到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; |