设为首页 收藏本站
查看: 1043|回复: 0

[经验分享] DB2存储过程总结

[复制链接]

尚未签到

发表于 2016-11-15 06:51:03 | 显示全部楼层 |阅读模式
存储过程是一个能够封装SQL语句和业务逻辑的数据库应用对象。应用程序和数据库的大量交互会产生网络堵塞,而将应用逻辑的一部分保存在数据库中会使这一情况得到相当程度的改善。另外,存储过程提供一个集中的位置存储您的代码,因此其他的应用可以重用相同的程序。
   在数据库范围内采用存储过程对于其安全性也很有帮助。例如,您可以限制用户只能通过存储过程访问表和视图;这样可以锁定数据库而防止用户存取无权操作的那部分数据。用户通过存储过程存取数据表或者视图时不需要显式赋予权限,而只需要得到运行存储过程的权限。

>>-CREATE PROCEDURE--procedure-name----------------------------->

>--+----------------------------------------------------+--*---->
'-(--+------------------------------------------+--)-'
| .-,------------------------------------. |
| V .-IN----.                            | |
'---+-------+--parameter-name--data-type-+-'
+-OUT---+
'-INOUT-'

>--+--------------------------+--*------------------------------->
'-SPECIFIC--specific-name--'

.-DYNAMIC RESULT SETS 0--------.     .-MODIFIES SQL DATA-.
>--+------------------------------+--*--+-------------------+--->
'-DYNAMIC RESULT SETS--integer-'     +-CONTAINS SQL------+
'-READS SQL DATA----'

.-NOT DETERMINISTIC-.     .-CALLED ON NULL INPUT-.
>--*--+-------------------+--*--+----------------------+--*----->
'-DETERMINISTIC-----'

.-INHERIT SPECIAL REGISTERS-.     .-OLD SAVEPOINT LEVEL-.
>--+---------------------------+--*--+---------------------+---->
'-NEW SAVEPOINT LEVEL-'

.-LANGUAGE SQL-.     .-EXTERNAL ACTION----.
>--*--+--------------+--*--+--------------------+--*------------>
'-NO EXTERNAL ACTION-'

>--+------------------------------+--*-------------------------->
'-PARAMETER CCSID--+-ASCII---+-'
'-UNICODE-'

>--| SQL-procedure-body |--------------------------------------><

SQL-procedure-body:

|---SQL-procedure-statement-------------------------------------|


语法说明:
1、procedure-name: 存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行。
2、(IN | OUT | INOUT parameter-name data-type,...) :传入参数
    IN:输入参数
OUT:输出参数
INOUT:作为输入输出参数
    parameter-name:参数名字,在此存储过程中唯一的标识符。
data-type:参数类型,可以接收SQL类型和创建的表。不支持LONG VARCHAR, LONG VARGRAPHIC, DATALINK, REFERENCE和用户自定义类型。
3、SPECIFIC specific-name:唯一的特定名称(别名),可以用存储过程名代替,这个特定名称用于dorp存储过程,或者给存储过程添加注视用,但不能调用存储过程。如果不指定,则数据库会自动生成一个yymmddhhmmsshhn时间戳的名字。推荐给出别名。
4、DYNAMIC RESULT SETS integer:指定存储过程返回结果的最大数量。存储过程中虽然没有return语句,但是却能返回结果集。
5、CONTAINS SQL, READS SQL DATA, MODIFIES SQL DATA: 指定存储过程中的SQL访问级别
    CONTAINS SQL: 表示存储过程可以执行中,既不可读取 SQL 数据,也不可修改 SQL 数据。
    READS SQL DATA: 表示存储过程可以执行中,可读取SQL,但不可修改 SQL 数据。
    MODIFIES SQL DATA: 表示存储过程可以执行任何 SQL 语句。可以对数据库中的数据进行增加、删除和修改。
6、DETERMINISTIC or NOT DETERMINISTIC:表示存储过程是动态或者非动态的。动态的返回的值是不确定的。非动态的存储过程每次执行返回的值是相同的。
7、CALLED ON NULL INPUT:表示可以调用存储过程而不管任何的输入参数是否为NULL,并且,任何的OUT或者INOUT参数可以返回一个NULL或者非空值。检验参数是否为NULL是在过程中进行的。
8、INHERIT SPECIAL REGISTERS:表示继承专用寄存器。
9、OLD SAVEPOINT LEVEL or NEW SAVEPOINT LEVEL:建立存储点。OLD SAVEPOINT LEVEL是默认的存储点。
10、LANGUAGE SQL:指定程序的主体用的是SQL语言。
11、EXTERNAL ACTION or NO EXTERNAL ACTION:表示存储过程是否执行一些改变理数据库状态的活动,而不通过数据库管理器管。默认是 EXTERNAL ACTION。如果指定为NO EXTERNAL ACTION ,则数据库会确定最最佳优化方案。
12、PARAMETER CCSID:指定所有输出字符串数据的编码,默认为UNICODE编码数据库为PARAMETER CCSID UNICODE ,其他的数据库默认为PARAMETER CCSID 3 ASCII。
13、SQL-procedure-body:存储过程的主体

.-NOT ATOMIC--.
>>-+---------+--BEGIN----+-------------+------------------------>
'-label:--'           '-ATOMIC------'

>-----+-----------------------------------------------+--------->
| .------------------------------------------.  |
| V                                          |  |
'-----+-| SQL-variable-declaration |-+---;---+--'
+-| condition-declaration |----+
'-| return-codes-declaration |-'

>--+----------------------------------+------------------------->
| .------------------------------. |
| V                              | |
'---| statement-declaration |--;-+-'

>-----+--------------------------------------+------------------->
|  .--------------------------------.  |
|  V                                |  |
'----DECLARE-CURSOR-statement--;----+--'

>-----+-------------------------------------+-------------------->
|  .-------------------------------.  |
|  V                               |  |
'----| handler-declaration |--;----+--'

.-------------------------------.
V                               |
>--------SQL-procedure-statement--;---+---END--+--------+------><
'-label--'


语法说明:
1.label:代表一个整体,同时也指定了一个变量可见范围
2.NOT ATOMIC,ATOMIC:是否把过程体当成一个整体,如果为整体(指定为ATOMIC),则表示当存储过程发生错误时会把所有执行的语句进行rollback,否则(指定为NOT ATOMIC,默认)不回滚
3.SQL-variable-declaration:变量声明

DECLARE variable-name data-type [DEFAULT value]

4.condition-declaration:条件声明

|---DECLARE--condition-name--CONDITION--FOR--------------------->
.-VALUE-.
.-SQLSTATE--+-------+---.
>----+-----------------------+---string-constant----------------|

5.return-codes-declaration:返回码的声明,表示存储过程执行的状态

DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLCODE INT DEFAULT 0;

6.DECLARE-CURSOR-statement:游标的声明,用于访问所获取的结果集信息

>>-DECLARE--cursor-name--CURSOR----+------------+--------------->
'-WITH HOLD--'
>-----+------------------------------+-------------------------->
|              .-TO CALLER--.  |
'-WITH RETURN--+------------+--'
'-TO CLIENT--'
>----FOR--+-select-statement-+---------------------------------><
'-statement-name---'

7.handler-declaration:处理器的声明,用于指示当存储过程发生异常时而所执行的动作

>>---DECLARE----+-CONTINUE-+---HANDLER--FOR---------------------->
+-EXIT-----+
'-UNDO-----'
.-,-----------------------------------.
V               .-VALUE-.             |
>---------+-SQLSTATE--+-------+--string--+--+------------------->
+-condition-name---------------+
+-SQLEXCEPTION-----------------+
+-SQLWARNING-------------------+
'-NOT FOUND--------------------'
>----SQL-procedure-statement------------------------------------|


[variable assgin statement]
[other statement]
[logic statement]

1.variable assign statement:变量赋值语句
常见的变量赋值语句有:SET,VALUES INTO,SELECT INTO,FETCH语句

SET variable-name = value
SET variable-name = (SELECT statement)


VALUES value INTO variable-name


SELECT {table-row,...} INTO {variable-name,..} FROM <SELECT statement>


>>-FETCH--+-------+---cursor-name------------------------------->
'-FROM--'
.-,----------------.
V                  |
>------INTO-----variable-name----+-----------------------------><

2.logic statement:逻辑语句
常见的逻辑语句有:IF,CASE,FOR,WHILE,ITERATE,LEAVE,LOOP,REPEAT,GOTO语句

>>-IF--search-condition-THEN----------------------------------->
.------------------------------.
V                              |
>--------SQL-procedure-statement-;---+------------------------->
.-------------------------------------------------------------.
V                                                             |
>----+------------------------------------------------------------+-+>
|                                .-------------------------. |
|                                V                         | |
'-ELSEIF-search-condition-THEN--SQL-procedure-statement-;--+-'
>-----+------------------------------------------+--END IF-----><
|        .------------------------------.  |
|        V                              |  |
'-ELSE-----SQL-procedure-statement-;---+---'


>>-CASE----+-| searched-case-statement-when-clause |-+---------->
'-| simple-case-statement-when-clause |---'
>----END CASE--------------------------------------------------><
simple-case-statement-when-clause
|---expression-------------------------------------------------->
.-------------------------------------------------------------.
|                          .-------------------------------.  |
V                          V                               |  |
>--------WHEN--expression--THEN-----SQL-procedure-statement--;---+--+>
>-----+------------------------------------------+--------------|
|        .------------------------------.  |
|        V                              |  |
'-ELSE-----SQL-procedure-statement--;---+--'
searched-case-statement-when-clause
.-------------------------------------------------------------.
|                           .------------------------------.  |
V                           V                              |  |
>--WHEN--search-condition--THEN---SQL-procedure-statement--;---+--+->
>----+------------------------------------------+---------------|
|        .------------------------------.  |
|        V                              |  |
'-ELSE-----SQL-procedure-statement--;---+--'


>>-+--------+--FOR--for-loop-name--AS--------------------------->
'-label:-'
>--+----------------------------------------------+------------->
|                                              |
'-cursor-name--CURSOR--+-----------+--FOR------'
'-WITH HOLD-'
.----------------------------.
V                            |
>--select-statement--DO----SQL-procedure-statement--;-+--------->
>--END FOR--+-------+------------------------------------------><
'-label-'


>>-+---------+--WHILE--search-condition--DO--------------------->
'-:label--'
.-------------------------------.
V                               |
>--------SQL-procedure-statement--;---+--END WHILE-------------->
>-----+--------+-----------------------------------------------><
'-label--'


.-------------------------------.
V                               |
>>-+---------+--REPEAT-------SQL-procedure-statement--;---+----->
'-label:--'
>----UNTIL--search-condition---END REPEAT----+--------+--------><
'-label--'


.-------------------------------.
V                               |
>>-+---------+--LOOP-------SQL-procedure-statement--;---+------->
'-label:--'
>----END LOOP----+--------+------------------------------------><
'-label--'


>>-GOTO--label-------------------------------------------------><
>>-ITERATE--label----------------------------------------------><
>>-LEAVE--label------------------------------------------------><

其他语句:RETURN,OPEN,CLOSE,CALL

>>-RETURN--+------------+--------------------------------------><
'-expression-'

1.说明:RETURN是立即结果存储过程而返回一个值

>>--OPEN--cursor-name------------------------------------------><

1.说明:一般要使用游标之前,先declare,再open,这样游标才能fetch,最后close

>>--CLOSE--cursor-name-----------------------------------------><

1.说明:关闭游标

>>--CALL--procedure-name(parameter list)-----------------------><

1.说明:调用其它的存储过程,一般IN类型的参数用户传值,OUT类型的参数用"?"代替,如
  创建一个求两整数和的存储过程:
   CAREATE PROCEDURE SUM(IN p_one INT, IN p_two INT, OUT p_result INT)
   ......
  调用这个存储过程:
   CALL SUM(2,4,?)或CALL <user-schema>.SUM(2,4,?)
删除一个已创建的存储过程,语法:

DROP SPECIFIC PROCEDURE specific-name
DROP PROCEDURE procedure-name(parameter list)

example:
  DROP SPECIFIC PROCEDURE SUM_ab;(假设上面SUM存储过程的SPECIFIC为SUM_ab)
  DROP PROCEDURE SUM(INT,INT,INT)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300380-1-1.html 上篇帖子: db2 备份与恢复 下篇帖子: DB2 常用SQL Quick Find
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表