DB2数据库使⽤存储过程详解
存储过程(Stored Procedure)是在⼤型中,⼀组为了完成特定功能的SQL语句集,经编译后存储在数据库中,⽤户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执⾏它。
主要特点:
类语⾔主要提供以下功能,让⽤户可以设计出符合引⽤需求的程序:
1)、说明
2)、ANSI(美国国家标准化组织)兼容的SQL命令(如Select,Update….)
3)、⼀般流程控制命令(if…else…、while….)
4)、内部函数
存储过程的优点:
(1) .存储过程的能⼒⼤⼤增强了SQL语⾔的功能和灵活性。存储过程可以⽤流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2) .可保证数据的安全性和完整性。
(3) .通过存储过程可以使没有权限的⽤户在控制之下间接地存取数据库,从⽽保证数据的安全。
(4) .通过存储过程可以使相关的动作在⼀起发⽣,从⽽可以维护数据库的完整性。
(5) .在运⾏存储过程前,数据库已对其进⾏了语法和句法分析,并给出了优化执⾏⽅案。这种已经编译好的过程可极⼤地改善SQL语句的性能。由于执⾏SQL语句的⼤部分⼯作已经完成,所以存储过程能以极快的速度执⾏。
(6) .可以降低⽹络的通信量。
(7) .使体现企业规则的运算程序放⼊中,以便:
(8) .集中控制。
(9) .当企业规则发⽣变化时在中改变存储过程即可,⽆须修改任何。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放⼊应⽤程序中,则当企业规则发⽣变化时,就需要修改应⽤程序⼯作量⾮常之⼤(修改、发⾏和安装应⽤程序)。如果把体现企业规则的运算放⼊存储过程中,则当企业规则发⽣变化时,只要修改存储过程就可以了,应⽤程序⽆须任何变化。
简单讲:
1.存储过程只在创造时进⾏编译,以后每次执⾏存储过程都不需再重新编译,⽽⼀般SQL语句每执⾏⼀次就编译⼀次,所以使⽤存储过程可提⾼数据库执⾏速度。
2.当对数据库进⾏复杂操作时(如对多个表进⾏Update,Insert,Query,Delete时),可将此复杂操作⽤存储过程封装起来与数据库提供的事务处理结合⼀起使⽤。
3.存储过程可以重复使⽤,可减少数据库开发⼈员的⼯作量
4.安全性⾼,可设定只有某些⽤户才具有对指定存储过程的使⽤权
有⼀点需要注意的是,⼀些⽹上盛传的所谓的存储过程要⽐sql语句执⾏更快的说法,实际上是个误解,并没有根据,包括微软内部的⼈也不认可这⼀点,所以不能作为正式的优点,希望⼤家能够认识到这⼀点。
⽤户创建的存储过程是由⽤户创建并完成某⼀特定功能的存储过程,事实上⼀般所说的存储过程就是指本地存储过程。
临时存储过程
分为两种存储过程:
⼀是本地临时存储过程,以井字号(#)作为其名称的第⼀个字符,则该存储过程将成为⼀个存放在tempdb数据库中的本地临时存储过程,且只有创建它的⽤户才能执⾏它;
⼆是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为⼀个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程⼀旦创建,以后连接到服务器的任意⽤户都可以执⾏它,⽽且不需要特定的权限。
远程存储过程
在SQLServer2005中,远程存储过程(RemoteStored Procedures)是位于远程服务器上的存储过程,通常可以使⽤分布式查询
和EXECUTE命令执⾏⼀个远程存储过程。
扩展存储过程
扩展存储过程(ExtendedStored Procedures)是⽤户可以使⽤外部程序语⾔编写的存储过程,⽽且扩展存储过程的名称通常以xp_开头。⼀.创建存储过程
createprocedure sp_name
@[参数名] [类型],@[参数名] [类型]
as
begin
.........
end
以上格式还可以简写成:
createproc sp_name
@[参数名] [类型],@[参数名] [类型]
as
begin
.
........
end数据库优化sql语句
/*注:“sp_name”为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头*/
⼆.调⽤存储过程
1.基本语法:execsp_name [参数名]
三.删除存储过程
1.基本语法:
dropprocedure sp_name
2.注意事项
(1)不能在⼀个存储过程中删除另⼀个存储过程,只能调⽤另⼀个存储过程
四.其他常⽤命令
1.showprocedure status
显⽰数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.showcreate procedure sp_name
显⽰某⼀个mysql存储过程的详细信息
3、execsp_helptext sp_name
显⽰你这个sp_name这个对象创建⽂本
DB2存储过程实例:
客户在进⾏短信服务这个业务申请时,需要填写⼀些基本信息,然后根据这些信息判断这个⽤户是否已经存在于业务系统中。因为⽹
上服务和业务系统两个项⽬物理隔离,⽽且⽹上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。
解决⽅式是通过存储过程:
功能说明:
调⽤存储过程时会传⼊⼀些值(IN输⼊参数),然后根据传⼊的值查询数据库(select语句),根据查询结果执⾏操作(添加、删除、
更新)有两种⽅式执⾏写好的存储过程:
DROP PROCEDURE "PLName"
@
CREATE PROCEDURE "PLName"(--存储过程名字
IN IN_ID BIGINT ,                    --以下全是输⼊参数
IN IN_ENTNAME VARCHAR(200) ,
IN IN_REGNO VARCHAR(50),
IN IN_PASSWORD VARCHAR(20),
IN IN_LEREP VARCHAR(300),
IN IN_CERTYPE CHARACTER(1),
IN IN_CERNO VARCHAR(50),
IN IN_LINKMAN VARCHAR(50),
IN IN_SEX CHARACTER(1),
IN IN_MOBTEL VARCHAR(30),
IN IN_REQDATE TIMESTAMP,
IN IN_REMITEM VARCHAR(300),
IN IN_STATE CHARACTER(1),
IN IN_TIMESTAMP TIMESTAMP
)
BEGIN
declare V_RESULT  BIGINT;    --声明变量
DELETE FROM  TableNameA WHERE ID = IN_ID;
SET V_RESULT = NULL;          --为变量赋值
--检查⽤户输⼊的信息是否合法
select b.id INTO V_RESULT  from TableNameB b,TableNameC c where 正常的判断条件
if(V_RESULT IS NOT NULL)  then ---如果合法,执⾏下⾯的insert语句
INSERT INTO TableNameA(ID,ENTNAME,REGNO,PASSWORD,LEREP,CERTYPE,CERNO,LINKMAN,SEX,MOBTEL,REQDATE,REMITEM,STATE,TIMESTAMP    VALUES(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITE  end if;
commit;
END
@
1.拷贝到DB2客户端⼯具中直接执⾏
  特别注意:执⾏时将改成@,之前很多错误都和它有关,⽐如:“该命令被当作 SQL语句来处理,因为它不是有效的命令⾏处理器命
令”.
2.将上⾯的语句保存为test.db2⽂件放到任意⽬录下(⽐如D盘根⽬录),然后在cmd输⼊db2cmd 然后输⼊db2 -td@ -vf D:
\test.db2即可执⾏后就可以测试存储过程写的是否正确.
直接写sql:
call PLName(存储过程名字) (IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_R

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。