陶占红
用Delphi开发C/S结构的Oracle数据库软件时,为提高效率,通常将大批量的数据处理交给后台存储过程来完成。由于Delphi需通过BDE才能操作和处理各种数据库文件,这样不仅效率低,而且存在一定局限性,所以考虑采用第三方工具DOA来提高交互效率,方便前后台信息的传递。
DOA(即Direct Oracle Access的缩写)是荷兰Allround Automations公司开发的访问O
racle的工具,运用DOA构件可以在Delphi或C++Builder开发环境下跳过BDE,而直接通过SQLNet访问Oracle。初次接触DOA,一些编程人员对怎样运用DOA调用存储过程感到困惑,笔者将结合电信综合管理系统中数据加工审核这一具体实例,详细阐述其具体的方法和步骤。
实现方法
1.用TOraclePackage的CallProcedure / CallXXXFunction
用TOraclePackage的CallProcedure方法,我们就可简单地调用Oracle存储过程,该方法中参数以数组的形式传递。当TOraclePackage的ParameterMode属性为pmNamed时要按照名称传递参数,每个参数前面必须有指定名称的字符串,其格式为:
CallProcedure(ProcedureName, [ParameterName1, Parameter1, ParameterName2, Parameter2…]);
当TOraclePackage的ParameterMode属性为pmPositional时,要按照位置传递参数:
CallProcedure(ProcedureName,[Parameter1, Parameter2,…]);
输出参数通过传递parString、parInteger、parFloat、parDate或parBoolean常数来定义,输出参数值在过程调用后用GetParameter方法获得,格式为:
PackageName.CallProcedure(''ProcedureName'',[parString]);
GetParameter(ParameterId);
如果没有参数,则用parNone获得:
PackageName.CallProcedure(''ProcedureName'', parNone);
与上面类似,我们用TOraclePackage的CallFunction方法也可简单地调用Oracle函数,只是根据返回值的不同,调用相应的方法CallBooleanFunction、CallDateFunction、CallFloatFunction、CallIntegerFunction或CallStringFunction。
2.用TOracleQuery或TOracleDataSet的Execute
用TOracleQuery或TOracleDataSet执行存储过程的步骤为:
(1)设置SQL属性
将TOracleQuery或TOracleDataSet的SQL属性设为:
begin
ProcedureName (:Parameter1, : Parameter2,…);
end;
(2)定义参数
定义参数的方式有两种,一是在对象查看器Properties选项卡的Variables属性中,单击省略号按钮,打开变量属性编辑器;二是用DeclareVariable方法。DOA支持PL/SQL表,它可以作为输入/输出参数传递给后台存储过程和函数,通过一次调用即可传递大量信息,使得在C/S结构中,网络通信量显著减少。在TOracleQuery或TOracleDataSet中定义PL/SQL表既可使用变量属性编辑器(选中PL/SQL Table复选框,然后定义表的大小,如果是字符串型的,还需定义字符串大小),也可在运行时定义PL/SQL表(先调用DeclareVariable方法定义变量,再调用DimPLSQLTable方法定义表大小)。
(3)参数赋值
给输入参数赋值用SetVariable方法,给PL/SQL表赋值首先要创建数组变量,分别赋值数组的各元素,再通过该数组用SetVariable方法给PL/SQL表赋值。
ArrayName := VarArrayCreate([LowBounds, UpBounds], VarType);
Table[LowBounds] := value1;
…
Table[UpBounds] := valuen;
OracleQueryName.SetVariable('':TableName'', ArrayName);
(4)执行存储过程
调用Execute方法执行存储过程,代码如下:
OracleQueryName. Execute;
(5)获得输出参数
用GetVariable方法获得输出参数值,输入/输出参数为PL/SQL表时,返回的数组变量下限与输入相同;输出参数为PL/SQL表时,返回的数组