存储过程可以提高程序性能,存储过程创建及运行在数据库服务器上,可以减少数据库存取流量。并且可以帮助集中处理业务逻辑,如果对存储过程进行更改,则使用该存储过程的所有客户机应用都立即可以应用这些更改。
存储过程分为外部存储过程和SQL存储过程,SQL存储过程由SQL语句和控制SQL语句组成。SQL存储过程必须用CREATE PROCEDURE语句进行注册。一旦存储过程注册后,在系统索引表中的信息就会独立于程序而存在
存储过程的创建语法:
存储过程分为外部存储过程和SQL存储过程,SQL存储过程由SQL语句和控制SQL语句组成。SQL存储过程必须用CREATE PROCEDURE语句进行注册。一旦存储过程注册后,在系统索引表中的信息就会独立于程序而存在
存储过程的创建语法:
create procedure procedure_name
({[in|out]parameter_name datatype}[...n])
[specific specific_name]
[dynamic result sets [0|integer]]
SQL_procedure_body
procedure_name:存储过程名称,不能存在存储过程名字和参数数目都相同的存储过程,即使参数的类型不同也不可以。
specific_name:存储过程别名,别名可以用于drop存储过程或者给存储过程添加注释,但是不能调用。在同名存储过程时最好起上别名,若没有指定,则会自动分配类似与"SQL180512150922456",既SQL+时间戳"yymmddhhmmsshhn"
dynamic result sets:指定存储过程返回结果集的最大数量,存储过程虽然没有return语句,但是可以返回结果集。
SQL_procedure_body:存储过程的主体,其核心是一组复合语句,以关键字 begin和end定界,这些语句可以是atomic或者not atomic的,默认是not atomic
存储过程的调用:
CALL procedure_name (入参,?)
规则:
变量和参数必须严格匹配
所有参数都必须有值(out参数需要占位符?)
重载存储过程的区分和参数的匹配取决于参数的目录.
specific_name:存储过程别名,别名可以用于drop存储过程或者给存储过程添加注释,但是不能调用。在同名存储过程时最好起上别名,若没有指定,则会自动分配类似与"SQL180512150922456",既SQL+时间戳"yymmddhhmmsshhn"
dynamic result sets:指定存储过程返回结果集的最大数量,存储过程虽然没有return语句,但是可以返回结果集。
SQL_procedure_body:存储过程的主体,其核心是一组复合语句,以关键字 begin和end定界,这些语句可以是atomic或者not atomic的,默认是not atomic
存储过程的调用:
CALL procedure_name (入参,?)
规则:
变量和参数必须严格匹配
所有参数都必须有值(out参数需要占位符?)
重载存储过程的区分和参数的匹配取决于参数的目录.
1:创建无参存储过程
DB2语法:
--/
CREATE PROCEDURE pro2()
BEGIN
UPDATE t_cps_cupsicacinfo SET CHKDATE='20180511';
END;
/
调用:db2 "call pro2()"
附Mysql创建方式:
mysql语法:
DELIMITER //
CREATE PROCEDURE pro2()
BEGIN
UPDATE t_cps_cupsicacinfo SET CHKDATE='20180511';
END;//
DELIMITER ;
调用:call pro2();
2:创建出参存储过程
DB2语法:
--/
CREATE PROCEDURE pro1(out v_result VARCHAR(10))
BEGIN
if ((select count(THIRDSYSTIME) from T_CPS_CUPSICACINFO where THIRDSYSTIME='20180511')<=5)
then set v_result='昨天交易笔数小于5';
else set v_result='昨天交易笔数大于5';
end if;
END;
/
调用:db2 "call pro1(?)"
附Mysql创建方式:
mysql语法:
DELIMITER //
CREATE PROCEDURE pro1(out v_result VARCHAR(10))
BEGIN
if ((select count(THIRDSYSTIME) from T_CPS_CUPSICACINFO where THIRDSYSTIME='20180511')<=5)
then set v_result='昨天交易笔数小于5';
else set v_result='昨天交易笔数大于5';
end if;
END;//
DELIMITER ;
调用:call pro1(@a);
select @a;
Mysql带返回参数的存储过程调用是@+占位参数,并且需要在Call之后进行Select才可以看见返回结果
3:创建入参存储过程
CREATE PROCEDURE pro3(IN CHKDATE VARCHAR(10))
BEGIN
UPDATE t_cps_cupsicacinfo SET CHKDATE=CHKDATE;
END;//