变量下限从零开始。
应用实例
以下是笔者运用上述第二种方法在电信综合统计管理系统中调用加工审核存储过程的一段源代码:
create or replace package pk_sh is
type t_object is table of varchar2(15) index by binary_integer;
type t_formula is table of number index by binary_integer;
procedure sp_audit(sh_time in varchar2,sh_dx in t_object,sh_gs in t_formula);
end pk_sh;
我们首先在服务器端创建包pk_sh,包中定义了两种PL/SQL表,其中t_object存储审核对象,t_formula存储审核公式ID,存储过程sp_audit根据传递的参数(时间、对象、公式)对后台数据进行加工审核。
客户端用Delphi编写,即通过DOA访问sp_audit,具体源代码如下:
Var
OracleSession1: TOracleSession;
OracleQuery1: TOracleQuery;
Begin
//连接数据库
OracleSession1:= TOracleSession.Create(nil);
OracleSession1.LogonDatabase := ''chicago'';
OracleSession1.LogonUsername := ''scott'';
OracleSession1.LogonPassword := ''tiger'';
OracleSession1.Connected:= True;
OracleQuery := TOracleQuery.Create(nil);
OracleQuery1.Session := OracleSession1;
//创建数组并赋值
sh_dx:=VarArrayCreate([0, LV_object.Items.Count -1], varVariant);
for i:=0 to LV_object.Items.Count -1 do
begin
sh_dx[i] :=LV_object.Items[i].caption;
end;
sh_gs:=VarArrayCreate([0, LV_formula.Items.Count -1], varVariant);
for i:=0 to LV_formula.Items.Count -1 do
begin
sh_gs[i] :=strtoint(LV_formula.Items[i].caption);
end;
sql_str :=''pk_sh.sp_audit(:sh_time,:sh_dx,:sh_gs);'';
with OracleQuery1 do
begin
//设置SQL属性
Clear;
SQL.Add(''begin'');
SQL.Add('' '' + sql_str );
SQL.Add(''end;'');
//定义参数
DeleteVariables;
DeclareVariable(''sh_time'', otString);
DeclareVariable(''sh_dx'', otString);
DeclareVariable(''sh_gs'', otInteger);
DimPLSQLTable(''sh_dx'', 2000, 15);
DimPLSQLTable(''sh_gs'', 500, 0);
//参数赋值
SetVariable('': sh_time '', sh_time);
SetVariable('':sh_dx'', sh_dx);
SetVariable('':sh_gs'', sh_gs);
//执行存储过程
Execute;
Free;
end;
OracleSession1.Connected:= False;
OracleSession1.Free;
End;
以上源代码采用Delphi 5、Oracle 8开发,在Windows 98/Windows2000系统平台下调试通过。
通过以上分析可知,利用BDE访问Oracle,由于它不支持PL/SQL表,参数只能分行传递,需反复多次调用存储过程,而用DOA则使
问题圆满解决。此外,将TOracleQuery的Threaded属性设置为True,就可简单地编写多线程应用
程序,而将Debug属性设置为True,可在运行时显示SQL语句和变量值,以方便调试。