|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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公司实质上就是一个数据库公司。 |
|