请问如何给DB2数据库的存储过程中 where 的in 条件传参数?

请问如何给DB2数据库的存储过程中 where 的in 条件传参数?,第1张

create
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 过程名


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13340703.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-18
下一篇 2023-07-18

发表评论

登录后才能评论

评论列表(0条)

保存