仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 922|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL网页编程之怎样在Delphi中挪用oracle的存储历程返...

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:43:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
解决方案提供商开始推动DBaaS浪潮之前,他们应该深入了解究竟什么是DBaaS。oracle|存储历程|数据
选自CSDNhttp://search.csdn.net/Expert/topic/2280/2280860.xml?temp=2.169436E-02论坛中JCC0128网友的讲话

【delphi+oracle报表办理计划(一)】delphi中挪用oracle的存储历程(分带前往游标,不前往值两种)
关头字:delphi,oracle存储历程,游标,前往数据集,报表

注:delphi6+oracle8.1.6

一.创立包与包体

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

createtableaaclass(CIDVARCHAR2(50),CNAMEVARCHAR2(50),pnumberNUMBER(10,0));

INSERTINTOaaclassvalues(c1,cn1,10);
INSERTINTOaaclassvalues(c2,cn2,40);
INSERTINTOaaclassvalues(c1,cn3,30);
commit;

2.建包:

CREATEORREPLACEPACKAGEPKG_JCCTEST1
AS

typerc_classisrefcursor;


--求p1,p2的和与差,前往的多个值经由过程游标前往
procedureGetSubAndSum2(p1number,p2number,
ResultCursoroutrc_class);

--查询满意前提的数据集,前往数据集经由过程游标前往
procedureGetClass2(ainnumber,ResultCursoroutrc_class);

--往表中插一笔记录,不前往了局集时,自己用AdoQuery挪用(adodataset好象请求必需前往了局集)
procedureInsertClass(p_cidvarchar2,p_cnamevarchar2,
p_pnumbernumber);
endPKG_JCCTEST1;



3.建包体

CREATEORREPLACEPACKAGEBODYPKG_JCCTEST1
AS

procedureGetSubAndSum2(p1number,p2number,
ResultCursoroutrc_class)
IS
BEGIN
openResultCursorfor
selectp1-p2as"sum",p1+p2as"sub"fromdual;
END;


procedureGetClass2(ainnumber,ResultCursoroutrc_class)
is
begin

openResultCursorfor
selectaaclass.*fromaaclasswherepnumber>a;

end;

procedureInsertClass(p_cidvarchar2,p_cnamevarchar2,
p_pnumbernumber)
is
begin
insertintoaaclassvalues(p_cid,p_cname,p_pnumber);
--commit;
end;





二.在delphi中使用AdoDataSet挪用上述第一个存储历程
1.使用AdoConnection1毗连数据库(驱动为oracleProviderforOLEDB),
**并在毗连字符串中到场这一节:PLSQLRSet=1;以下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;PersistSecurityInfo=True;UserID=KXD;DataSource=TEST3;PLSQLRSet=1

2.在窗体上加AdoDataSet1指明毗连为上述AdoConnection1,上面能够放一个按钮,单击按钮就可以挪用第一步中创立的包历程,并前往数据集。代码以下所示:


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

//***使用call办法挪用oracle历程时,参数必需由?来传,即便你要传的参数为常理
//输入游标的参数不必要指定!!!!!!,原本此函数带三个参数,我们这里只必要传两个参数.
ADODataSet1.CommandText:={callPKG_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;

//依据存储历程,数据集只要一笔记录,以是不必要用whiledo来遍历数据集,间接取数据了

//此处的字段名依据包过程当中的前往游标对应的字段名来取
//界说的存储历程前往游标如:openResultCursorfor
//selectp1-p2as"sum",p1+p2as"sub"fromdual;
//把对应的字段值掏出来便可
AResult:=ADODataSet1.Fields.FieldByName(sub).Value;
BResult:=ADODataSet1.Fields.FieldByName(sum).Value;

//显现了局
showmessage(inttostr(AResult));
showmessage(inttostr(BResult));

end;




三.在delphi中使用AdoDataSet挪用上述第二个存储历程


仍是使用上述的AdoDataSet1来挪用第二个存储历程,无需任何修改,加第二个按钮,单击时期码以下:

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

//***使用call办法挪用oracle历程时,参数必需由?来传,即便你要传的参数为常理
//输入游标的参数不必要指定!!!!!!,原本此函数带两个参数,我们这里只必要传一个参数.
ADODataSet1.CommandText:={callPKG_JCCTEST1.GetClass2(?)};

//***C按次有关,createparam必需放在commandtext赋值语句以后.

//创立第一个参数,对应call中的第一个?,ftinteger为范例,10为长度,20为传进的实参值
ADODataSet1.Parameters.CreateParameter(p1,ftinteger,pdinput,10,20);


//上面挪用ADODataSet1的open办法,前往数据集(对应包历程的游标)
ADODataSet1.Open;

whilenotADODataSet1.Eofdo
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挪用第三个历程,不前往数据集的

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

AdoQuery1.SQL.Clear;

AdoQuery1.SQL.Add({callPKG_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挪用第一个历程,前往数据集的.


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

AdoQuery1.SQL.Clear;

AdoQuery1.SQL.Add({callPKG_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:={callPackageName.ProcedureName(?,?)};
ClientDataSet1.Params.CreateParam(ftInteger,ParamName1,ptInput);
ClientDataSet1.Open;

end;


自己程度无限,若有不妥与毛病的地方请斧正!

MySQL已经为支持所有最流行的Web2.0语言做好了准备,诸如Ruby、Ajax等,当然还有PHP。有的业界分析师说过,“每一个Web2.0公司实质上就是一个数据库公司。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-18 17:53:55 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
莫相离 该用户已被删除
板凳
发表于 2015-1-22 19:25:11 | 只看该作者
也可谈一下你是怎么优化存储过程的?
再现理想 该用户已被删除
地板
发表于 2015-1-31 08:37:58 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
老尸 该用户已被删除
5#
发表于 2015-2-6 18:51:21 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
因胸联盟 该用户已被删除
6#
发表于 2015-2-18 05:30:19 | 只看该作者
总感觉自己还是不会SQL
小女巫 该用户已被删除
7#
发表于 2015-3-6 00:43:21 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
爱飞 该用户已被删除
8#
发表于 2015-3-12 17:36:42 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 03:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表