`
javawebsoa
  • 浏览: 424289 次
社区版块
存档分类
最新评论

如何在Delphi中调用oracle的存储过程返回数据集

 
阅读更多

选自CSDN http://search.csdn.net/Expert/topic/2280/2280860.xml?temp=2.169436E-02论坛中JCC0128 网友的发言

【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种)
关键字: delphi ,oracle存储过程,游标,返回数据集,报表

注:delphi 6+ oracle 8.1.6

一.创建包与包体

1.附:建表aaclass为下面作测试用

create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );

INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;

2.建包:

CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS

type rc_class is ref cursor;


--求p1,p2的和与差,返回的多个值通过游标返回
procedure GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);

--查询满足条件的数据集,返回数据集通过游标返回
procedure GetClass2(a in number,ResultCursor out rc_class ) ;

--往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)
procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1;

3.建包体

CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
AS

procedure GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from dual;
END ;


procedure GetClass2(a in number,ResultCursor out rc_class )
is
begin

open ResultCursor for
select aaclass.* from aaclass where pnumber >a;

end ;

procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ;

二.在delphi中利用AdoDataSet调用上述第一个存储过程
1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),
**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=1

2.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:


procedure TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;

//***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ;

//***C 顺序有关,createparam必须放在commandtext赋值语句之后.

// 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4);

//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ;

//根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了

//此处的字段名根据包过程中的返回游标 对应的字段名来取
//定义的存储过程返回游标如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from dual;
//把对应的字段值取出来即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ;

//显示结果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;

end;


三.在delphi中利用AdoDataSet调用上述第二个存储过程


还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:

procedure TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;

//***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ;

//***C 顺序有关,createparam必须放在commandtext赋值语句之后.

// 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);


//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ;

while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end;

四 利用adoquery调用第三个过程,不返回数据集的

procedure TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;

AdoQuery1.SQL.Clear ;

AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ;

AdoQuery1.ExecSQL ;
end;


五 利用adoquery调用第一个过程,返回数据集的.


procedure TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;

AdoQuery1.SQL.Clear ;

AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ;

AdoQuery1.Open ;

Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;

六.关于三层体系的此类问题

两层的解决了,三层类似.
中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;
客户端用clientdataset ,大同小异,举例如下:

begin
//调用相应的过程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ;

ClientDataSet1.CommandText := '{call PackageName.ProcedureName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;

end ;


本人水平有限,如有不当与错误之处请指正!

分享到:
评论

相关推荐

    Delphi中调用oracle的存储过程返回数据集

    Delphi 中调用 Oracle 的存储过程返回数据集是指在 Delphi 应用程序中调用 Oracle 数据库中的存储过程,并将存储过程的返回结果集显示在 Delphi 应用程序中。这种方式可以将 Oracle 数据库中的数据实时同步到 Delphi...

    delphi调用Oracle的存储过程

    4. **编写事件处理程序**:双击`Button1`,在`Button1Click`事件处理程序中编写代码以调用Oracle存储过程。 #### Delphi中调用Oracle存储过程 以下是完整的Delphi代码示例,用于调用上述创建的Oracle存储过程: `...

    delphi中调用oracle的存储过程.doc

    在 Delphi 中,使用 AdoDataSet 组件来调用存储过程并处理返回的数据集。例如,要调用 `GetSubAndSum2` 过程,你可以在 Button1 的点击事件中编写以下代码: ```delphi procedure TForm1.Button1Click(Sender: T...

    delphi中调用oracle的存储过程.pdf

    本篇将详细介绍如何在 Delphi 中利用 ADODataSet 调用 Oracle 的存储过程,涉及分带返回游标和不返回值两种情况。 首先,我们需要在 Oracle 数据库中创建一个包(package)和包体(package body),以便定义存储...

    delphi中调用oracle的存储过程.docx

    本篇将详细介绍如何在 Delphi 中利用 ADODataSet 调用 Oracle 存储过程,尤其是涉及到带有返回游标的情况。 首先,我们需要在 Oracle 数据库中创建包和包体。包是 Oracle 中组织存储过程和函数的一种方式,它可以...

    如何调用oracle的函数、存储过程

    本教程将详细讲解如何在不同的环境中调用Oracle的函数和存储过程。 首先,Oracle的函数是可执行的SQL块,返回一个值。它们通常用于计算或处理数据,然后将结果返回给调用者。而存储过程则是不返回值的SQL或PL/SQL...

    delphi 调用 oracle

    综上所述,Delphi调用Oracle涉及了数据库连接、SQL操作、事务管理、PL/SQL调用等多个方面的知识。通过熟练掌握这些技术,开发者可以构建出高效、稳定且功能丰富的数据库应用程序。在实际项目中,还需要不断学习和...

    delphi7+ oracle

    3. 存储过程示例:展示了如何在Delphi中调用和编写Oracle存储过程。 4. 跟踪工具:可能是第三方工具,如SQL Profiler,用于记录和分析数据库的SQL执行情况,帮助优化性能。 综上所述,这个压缩包提供的内容涵盖了...

    java 调用存储过程

    在Java编程中,调用存储过程是连接数据库并执行预定义SQL代码的一种常见方式。存储过程是由数据库管理系统(如MySQL, Oracle, SQL Server等)编译并存储的一组操作,可以包含复杂的逻辑、条件判断、循环等,提高数据...

    delphi连接oracle(免装oracle客户端)测试

    本篇文章将详细介绍如何在Delphi中实现连接Oracle数据库,无需安装Oracle客户端。 首先,为了在Delphi中实现无客户端连接Oracle,我们需要依赖第三方组件或库。ODAC(Oracle Data Access Components)就是这样一个...

    delphi 如何操作数据库存储过程

    在 Delphi 中操作数据库存储过程是一项重要的技能,尤其对于初学者来说,理解并掌握这一技术可以极大地提升数据库交互效率和代码质量。存储过程是预先编译的 SQL 语句集合,能够提高性能、减少网络流量,并提供更好...

    delphioracle_oracle_delphi_连接ORACLE_

    模块可能包含连接验证函数,处理异常,以及提供接口供其他部分的代码调用SQL查询或存储过程。 总结来说,本主题涵盖了Delphi通过ODAC、BDE或ADO与Oracle的连接方法,以及如何构建一个通用的登录模块来管理这些连接...

    delphi ODAC oracle 连接控件

    TOracleProcedure和TOracleFunction组件使得调用Oracle数据库中的存储过程和函数变得简单。它们允许传递输入和输出参数,甚至可以处理PL/SQL记录类型和表类型。 6. **数据绑定**: ODAC组件可以直接与Delphi的VCL...

    delphi存储过程

    - 如果存储过程返回结果集,可以绑定到TADODataset组件,通过TDBGrid或其他控件展示数据。 - 输出参数:在执行后,可以通过TADOCommand的Parameters集合获取输出参数的值。 - 错误处理:通过TADOCommand的Errors...

    delphi使用oadc操作oracle数据库Listview

    在Delphi编程环境中,Oracle数据库的访问通常涉及各种组件和技术。本教程主要关注使用OADC(Oracle Access Driver Component)组件来实现对Oracle数据库的操作,并通过ListView控件展示数据。以下是详细的知识点讲解...

    delphi使用oadc操作oracle数据库

    OADC是Oracle公司为Delphi和C++Builder等开发环境提供的数据访问组件集,它允许开发者直接在代码中处理Oracle数据库的SQL语句,无需通过Oracle客户端中间层。 首先,我们需要在Delphi的工程中引入OADC组件。在工具...

    delphi-oracle课程设计

    在Delphi中,可以通过TOracleProcedure组件调用Oracle的存储过程,实现数据库端的计算和处理。 7. 用户使用手册: 一个完整的设计项目不仅要有高质量的代码,还需要详尽的用户使用手册。这包括系统功能介绍、操作...

    ODAC delphi 连接ORACLE控件

    这套组件库提供了多种控件和类,使得开发人员可以方便地在Delphi或C++ Builder应用程序中集成对Oracle数据库的操作。 ODAC的核心功能包括: 1. **高速数据访问**:ODAC组件提供了直接与Oracle数据库通信的低级接口...

Global site tag (gtag.js) - Google Analytics