📄 oracle实例-6.htm
字号:
<body bgcolor="#000000">
<p><FONT color="#009900"
class=title>用DOA运行存储过程</FONT><font color="#FFFFFF"><BR>
</font><font color="#FFFFFF"><FONT class=content> </FONT></font></p>
<font color="#FFFFFF"><FONT class=content>
用Delphi开发C/S结构的Oracle</A>数据库软件时,为提高效率,通常将大批量的数据处理交给后台存储过程来完成。由于Delphi需通过BDE才能操作和处理各种数据库文件,这样不仅效率低,而且存在一定局限性,所以考虑采用第三方工具DOA来提高交互效率,方便前后台信息的传递。
<BR>
<BR>
DOA(即Direct Oracle</A> Access的缩写)是荷兰Allround Automations公司开发的访问Oracle</A>的工具,运用DOA构件可以在Delphi或C++Builder开发环境下跳过BDE,而直接通过SQL
Net访问Oracle</A>。初次接触DOA,一些编程人员对怎样运用DOA调用存储过程感到困惑,笔者将结合电信综合管理系统中数据加工审核这一具体实例,详细阐述其具体的方法和步骤。
<BR>
<BR>
<STRONG>实现方法</STRONG> <BR>
</FONT></font><FONT class=content>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT color=#000000>1.用TOracle</A>Package的CallProcedure/CallXXXFunction</FONT></TD>
</TR>
</TBODY>
</TABLE>
<BR>
<font color="#FFFFFF">用TOracle</A>Package的CallProcedure方法,我们就可简单地调用Oracle</A>存储过程,该方法中参数以数组的形式传递。当TOracle</A>Package的ParameterMode属性为pmNamed时要按照名称传递参数,每个参数前面必须有指定名称的字符串,其格式为:
<BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>CallProcedure(ProcedureName, [ParameterName1,
Parameter1, ParameterName2, Parameter2…]);</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
当TOracle</A>Package的ParameterMode属性为pmPositional时,要按照位置传递参数:
<BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code
bgColor=#CCCCCC>CallProcedure(ProcedureName,[Parameter1, Parameter2,…]);</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
输出参数通过传递parString、parInteger、parFloat、parDate或parBoolean常数来定义,输出参数值在过程调用后用GetParameter方法获得,格式为:
<BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code
bgColor=#CCCCCC>PackageName.CallProcedure('ProcedureName',[parString]);<BR>
GetParameter(ParameterId);</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
如果没有参数,则用parNone获得: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code
bgColor=#CCCCCC>PackageName.CallProcedure('ProcedureName', parNone);</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
与上面类似,我们用TOracle</A>Package的Call...Function
方法也可简单地调用Oracle</A>函数,只是根据返回值的不同,调用相应的方法CallBooleanFunction、CallDateFunction、CallFloatFunction、CallIntegerFunction或CallStringFunction。
<BR>
<BR>
</font>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT color=#000000>2.用TOracle Query或TOracle</A>DataSet的Execute</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
用TOracle</A>Query或TOracle</A>DataSet执行存储过程的步骤为:
<BR>
<BR>
(1)设置SQL属性 <BR>
<BR>
将TOracle</A>Query或TOracle</A>DataSet的SQL属性设为:
<BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>begin<BR>
ProcedureName (:Parameter1, : Parameter2, …);<BR>
end;</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
(2)定义参数 <BR>
<BR>
定义参数的方式有两种,一是在对象查看器Properties选项卡的Variables属性中,单击省略号按钮,打开变量属性编辑器;二是用DeclareVariable方法。DOA支持PL/SQL
表,它可以作为输入/输出参数传递给后台存储过程和函数,通过一次调用即可传递大量信息,使得在C/S结构中,网络通信量显著减少。在TOracle</A>Query
或TOracle</A>DataSet中定义PL/SQL
表既可使用变量属性编辑器(选中PL/SQL Table复选框,然后定义表的大小,如果是字符串型的,还需定义字符串大小),也可在运行时定义PL/SQL 表(先调用DeclareVariable方法定义变量,再调用DimPLSQLTable方法定义表大小)。
<BR>
<BR>
(3)参数赋值 <BR>
<BR>
给输入参数赋值用SetVariable方法,给PL/SQL表赋值首先要创建数组变量,分别赋值数组的各元素,再通过该数组用SetVariable方法给PL/SQL表赋值。
<BR>
</font> <BR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>ArrayName := VarArrayCreate([LowBounds, UpBounds],
VarType);<BR>
Table[LowBounds] := value1;<BR>
…<BR>
Table[UpBounds] := valuen;<BR>
Oracle</A>QueryName.SetVariable(':TableName',
ArrayName);</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
(4)执行存储过程 <BR>
<BR>
调用Execute方法执行存储过程,代码如下: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>Oracle</A>QueryName.
Execute;</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
(5)获得输出参数 <BR>
<BR>
用GetVariable方法获得输出参数值, 输入/输出参数为PL/SQL表时,返回的数组变量下限与输入相同;输出参数为PL/SQL表时,返回的数组变量下限从零开始。
<BR>
<BR>
<STRONG>应用实例</STRONG> <BR>
以下是笔者运用上述第二种方法在电信综合统计管理系统中调用加工审核存储过程的一段源代码: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>create or replace package pk_sh is<BR>
type t_object is table of varchar2(15) index by binary_integer;<BR>
type t_formula is table of number index by binary_integer;<BR>
procedure sp_audit(sh_time in varchar2,sh_dx in t_object,sh_gs in t_formula);<BR>
end pk_sh;</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
我们首先在服务器端创建包pk_sh,包中定义了两种PL/SQL表,其中t_object存储审核对象,t_formula存储审核公式ID,存储过程sp_audit根据传递的参数(时间、对象、公式)对后台数据进行加工审核。
<BR>
<BR>
客户端用Delphi编写,即通过DOA访问sp_audit,具体源代码如下: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=580
borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC>Var<BR>
Oracle</A>Session1:
TOracle</A>Session;<BR>
Oracle</A>Query1:
TOracle</A>Query;<BR>
Begin<BR>
//连接数据库<BR>
Oracle</A>Session1:=
TOracle</A>Session.Create(nil);<BR>
Oracle</A>Session1.LogonDatabase
:= 'chicago';<BR>
Oracle</A>Session1.LogonUsername
:= 'scott';<BR>
Oracle</A>Session1.LogonPassword
:= 'tiger';<BR>
Oracle</A>Session1.Connected:=
True;<BR>
Oracle</A>Query
:= TOracle</A>Query.Create(nil);<BR>
Oracle</A>Query1.Session
:= Oracle</A>Session1;<BR>
//创建数组并赋值<BR>
sh_dx:=VarArrayCreate([0, LV_object.Items.Count -1], varVariant);<BR>
for i:=0 to LV_object.Items.Count -1 do<BR>
begin<BR>
sh_dx[i] :=LV_object.Items[i].caption;<BR>
end;<BR>
sh_gs:=VarArrayCreate([0, LV_formula.Items.Count -1], varVariant);<BR>
for i:=0 to LV_formula.Items.Count -1 do<BR>
begin<BR>
sh_gs[i] :=strtoint(LV_formula.Items[i].caption);<BR>
end;<BR>
sql_str :='pk_sh.sp_audit(:sh_time,:sh_dx,:sh_gs);';<BR>
with Oracle</A>Query1
do<BR>
begin<BR>
//设置SQL属性<BR>
Clear;<BR>
SQL.Add('begin');<BR>
SQL.Add(' ' + sql_str );<BR>
SQL.Add('end;');<BR>
//定义参数<BR>
DeleteVariables;<BR>
DeclareVariable('sh_time', otString);<BR>
DeclareVariable('sh_dx', otString);<BR>
DeclareVariable('sh_gs', otInteger);<BR>
DimPLSQLTable('sh_dx', 2000, 15);<BR>
DimPLSQLTable('sh_gs', 500, 0);<BR>
//参数赋值<BR>
SetVariable(': sh_time ', sh_time);<BR>
SetVariable(':sh_dx', sh_dx);<BR>
SetVariable(':sh_gs', sh_gs);<BR>
//执行存储过程<BR>
Execute;<BR>
Free;<BR>
end;<BR>
Oracle</A>Session1.Connected:=
False;<BR>
Oracle</A>Session1.Free;<BR>
End;</TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
以上源代码采用Delphi 5、Oracle</A>
8开发,在Windows 98/Windows2000系统平台下调试通过。 <BR>
<BR>
通过以上分析可知,利用BDE访问Oracle</A>,由于它不支持PL/SQL表,参数只能分行传递,需反复多次调用存储过程,而用DOA
则使问题圆满解决。此外,将TOracle</A>Query的Threaded属性设置为True,就可简单地编写多线程应用程序,而将Debug属性设置为True,可在运行时显示SQL语句和变量值,以方便调试。
<BR>
</font> </FONT>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -