关键字: 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博客,转载请标明出处: >
//创建存储过程
CREATE PROCEDURE userData(
IN id INT
)
BEGIN
SELECT from userdata WHERE userflag = id;
END;
其中IN是传进去的变量;
drop procedure userData;//销毁这个存储过程。
call userData(2) //调用存储过程。
扩展资料:
sql中的存储过程及相关介绍:
CREATE PROCEDURE [拥有者]存储过程名[;程序编号]
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
(SQL Server 70以上版本),参数的使用方法如下:
@参数名数据类型[VARYING] [=内定值] [OUTPUT]。
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
[内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数。
同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。
参考资料来源:百度百科-储存过程
多数存储过程的功能比本例复杂多了,但这里主要说明存储过程的一些基本要点。如前面所述,不同DBMS定义存储过程的语法是不同的。例如,有些DBMS使用begin end或其他关键字指明存储过程定义的开始和结束。在有些DBMS中,下面的SQL语句可创建一个存储过程:create procedure SHOW_SUPPLIERS
as
select SUPPLIERSSUP_NAME, COFFEESCOF_NAME
from SUPPLIERS, COFFEES
where SUPPLIERSSUP_ID = COFFEESSUP_ID
order by SUP_NAME
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)