分享
 
 
 

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

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

选自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 ;

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有