你的参数变换的种类多吗,我们做报表,每天晚上把所有的参数变换都做一次分析,然后保存在一个中间表中,前台WEB页面查询的实际上是中间表的结果!delphi+oracle报表解决方案(一)delphi中调用oracle的存储过程(分带返回游标,不返回值两种)
关键字: delphi ,oracle存储过程,游标,返回数据集,报表注:delphi 6+ oracle 816一创建包与包体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
ASprocedure 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=OraOLEDBOracle1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:
procedure TForm1Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1Close ;
ADODataSet1CommandType := cmdText ;
ADODataSet1ParametersClear ; //利用call方法调用oracle过程时,参数必须由来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数
ADODataSet1CommandText := '{call PKG_JCCTEST1GetSubAndSum2(,)}' ; //C 顺序有关,createparam必须放在commandtext赋值语句之后 // 创建第一个参数,对应call中的第一个,ftinteger为类型,10为长度,45为传入的实参值
ADODataSet1ParametersCreateParameter('p1',ftinteger,pdinput,10,45);
//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应
ADODataSet1ParametersCreateParameter('p2',ftinteger,pdinput,10,4); //下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1Open ; //根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了 //此处的字段名根据包过程中的返回游标 对应的字段名来取
//定义的存储过程返回游标如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from dual;
//把对应的字段值取出来即可
AResult := ADODataSet1FieldsFieldByName('sub')Value ;
BResult := ADODataSet1FieldsFieldByName('sum')Value ; //显示结果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;end;
三在delphi中利用AdoDataSet调用上述第二个存储过程
还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procedure TForm1Button2Click(Sender: TObject);
begin
ADODataSet1Close ;
ADODataSet1CommandType := cmdText ;
ADODataSet1ParametersClear ; //利用call方法调用oracle过程时,参数必须由来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数
ADODataSet1CommandText := '{call PKG_JCCTEST1GetClass2()}' ; //C 顺序有关,createparam必须放在commandtext赋值语句之后 // 创建第一个参数,对应call中的第一个,ftinteger为类型,10为长度,20为传入的实参值
ADODataSet1ParametersCreateParameter('p1',ftinteger,pdinput,10,20);
//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1Open ; while not ADODataSet1Eof do
begin
showmessage('CID : '+string(ADODataSet1FieldByName('CID')Value) +
'--CNAME :' + string(ADODataSet1FieldByName('CNAME')Value) +
'--PNUMBER :' + string(ADODataSet1FieldByName('PNUMBER')Value)
) ;
ADODataSet1Next ;
end ;
end; 四 利用adoquery调用第三个过程,不返回数据集的procedure TForm1Button3Click(Sender: TObject);
begin
AdoQuery1Close ;
AdoQuery1ParametersClear ; AdoQuery1SQLClear ; AdoQuery1SQLAdd('{call PKG_JCCTEST1GetSubAndSum2(,)}') ;
AdoQuery1ParametersCreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1ParametersCreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1ParametersCreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1ExecSQL ;
end;
五 利用adoquery调用第一个过程,返回数据集的
procedure TForm1Button4Click(Sender: TObject);
begin
AdoQuery1Close ;
AdoQuery1ParametersClear ; AdoQuery1SQLClear ; AdoQuery1SQLAdd('{call PKG_JCCTEST1GetSubAndSum2(,)}') ;
AdoQuery1ParametersCreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1ParametersCreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1Open ; Showmessage(string( AdoQuery1FieldByName('sub')Value)+'-'+
string( AdoQuery1FieldByName('sum')Value));
end;六关于三层体系的此类问题两层的解决了,三层类似
中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;
客户端用clientdataset ,大同小异,举例如下: begin
//调用相应的过程
ClientDataSet1Close ;
ClientDataSet1ParamsClear ; ClientDataSet1CommandText := '{call PackageNameProcedureName(,)}' ;
ClientDataSet1ParamsCreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1Open ;
end ;
本文来自CSDN博客,转载请标明出处: >1、在查询语句中调用自定义函数 F_GETXM(FID),该函数通过编号获取人员姓名,FID 为编号
SELECT F_GETXM(fID) FROM T_COURSE;
2、在存储过程中调用:其中uID为学号,uName保存获得的姓名
uName := F_GETXM(uID);
3、在 INSERT 语句中调用
INSERT INTO T_CLASSMATE (FID,FNAME,) VALUES (uID,F_GETXM(uID),);
4、在 UPDATE 语句中调用
UPDATE T_CLASSMATE SET FNAME = F_GETXM('1700511') WHERE FID = '1700511';
5、在 WHERE 语句中调用
SELECT FROM T_CLASSMATE WHERE FNAME = F_GETXM('1700511');
注:T_CLASSMATE 学生表;T_COURSE 课程表。oracle中调用函数是十分简单的,存储过车调用函数也是一样的。例子如下:
create procedure pro_name1
as
v_para varchar2(200):=‘Im Danny';
begin
--without parameters case
pro_name2;
--with parameters case
pro_name3(v_para);
end;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)