or
replace
procedure
test(in
in_where
varchar(100))
--创建一个
存储过程
test,并可以传入字符串作为参数
declare
v_sql
varchar(512);
set
v_sql
=
'
delete
from
table1
where
field1
in
('
concat
in_where
concat
')
'
;
--
这里是把传进来的where语句拼起来
execute
immediate
v_sql;
--这里是把语句进行执行
------
---类似以上这样的存储过程,使用以下的放在进行执行即可:call
test(
'
''001'',''002''
')
;
--内容中的一个‘
需要使用
’‘
进行
转义
一、简单的储存过程:
1、创建一个存储过程
create procedure GetUsers()
begin
select from user;
end;12345
2、调用存储过程
call GetUsers();12
3、删除存储过程
drop procedure if exists GetUsers;
二、带参数的存储过程
1、MySql 支持 IN (传递给存储过程) , OUT (从存储过程传出) 和 INOUT (对存储过程传入和传出) 类型的参数 , 存储过程的代码位于 BEGIN 和 END 语句内 , 它们是一系列 SQL 语句 , 用来检索值 , 然后保存到相应的变量 (通过指定INTO关键字) ;
2、下面的存储过程接受三个参数 , 分别用于获取用户表的最小 , 平均 , 最大分数 , 每个参数必须具有指定的类型 , 这里使用十进制值(decimal(8,2)) , 关键字 OUT 指出相应的参数用来从存储过程传出
create procedure GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;1234567891011
3、调用此存储过程 , 必须指定3个变量名(所有 MySql 变量都必须以 @ 开始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);12
4、该调用并没有任何输出 , 只是把调用的结果赋给了调用时传入的变量 @minScore, @avgScore, @maxScore , 然后即可调用显示该变量的值 :
select @minScore, @avgScore, @maxScore;
5、使用 IN 参数 , 输入一个用户 id , 返回该用户的名字 :
create procedure GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;12345678910
6、调用存储过程 :
call GetNameByID(1, @userName);
select @userName;123
参考资料
SQL存储过程使用介绍csdn博客[引用时间2017-12-31]
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博客,转载请标明出处: >
这样:
CREATE PROCEDURE sp_add(a int, b int,out c int)
begin
set c=a+ b;
end;
调用过程:
call sp_add (1,2,@a);
select @a;
扩展资料:
注意事项
存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
存储过程分为系统存储过程和自定义存储过程。
系统存储过程在master数据库中,但是在其他的数据库中可以直接调用,并且在调用时不必在存储过程前加上数据库名,因为在创建一个新数据库时,系统存储过程在新的数据库中会自动创建。
自定义存储过程,由用户创建并能完成某一特定功能的存储过程,存储过程既可以有参数又有返回值,但是它与函数不同,存储过程的返回值只是指明执行是否成功,并不能像函数那样被直接调用,只能利用execute来执行存储过程。
创建存储过程
SQL Server创建存储过程:
create procedure 过程名
@parameter 参数类型
@parameter 参数类型
。。。
as
begin
end
执行存储过程:execute 过程名
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)