动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.Oracle中通过命令行实现定时操作.
.如何用grub引导非第一个硬盘上的.
.Oracle Fast-Start Fault Recove.
.ExactPapers Oracle 1Z0-007 200.
.Oracle数据库技术(33).
.用Oracle9ias开发无线应用程序.
.清楚理解限制(limit)系列.
.在 Linux 下如何访问 Windows 分.
.支持Web的OLAP.
.如何将 Access 数据导出到 Oracl.
.实例讲解Oracle的快速删除和快速.
.ORACLE数据库对象与用户管理.
.Oracle中汉字的乱码问题.
.转载:Statspack的安装使用说明.
.如何彻底删除oracle.
.oracle8i回滚段表空间出现坏块的.
.Oracle不同数据库间的对比分析脚.
.研究生管理信息系统的开发流程三.
.安装 Oracle 9iR2 on RHEL AS 3 .
.Oracle入门基本知识一点通.

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

发表日期:2008-2-9 |



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


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

上一篇:oracle中获取表空间ddl语句 人气:589
下一篇:Oracle里的交叉SQL语句写法 人气:532
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-15 自由岭峰行业专用留言系统 v1.87
2008-10-15 Tikiwiki v1.9.11 多国语言版
2008-10-15 Roclog v3.1.6.28
2008-10-15 谷秋精品课程开发系统 v2.1
2008-10-15 pageadmin企业网站管理系统 v2.1
2008-10-15 晴天免费电影系统完整版(带迅雷采
2008-10-15 PHP-B2B v2.4.0 UTF8 Beta版
2008-10-15 云峰多用户网络进销存B/S v2.1
2008-10-15 Qspace v1.1.1 Access
2008-10-16 Microsoft Office 2003 Service
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成