db2的过程中怎样写异常处理

如题所述

创建SQL存储过程(CREATE PROCEDURE (SQL) statement ï¼‰

CREATE PROCEDURE procedure-name(IN | OUT | INOUT parameter-name data-type,...) ) ---存储过程可以设定输入参数和输出参数
LANGUAGE SQL                   ----DB2可以用多种语言编写存储过程,这里用的是纯SQL
BEGIN                          ---开始
DECLARE vID   smallint;        ---定义变量 å’ŒOracle一样 DECLARE   å˜é‡å å˜é‡çš„数据类型;
FOR V AS SELECT BRND_CD FROM TMP_BRND_CD   ---for循环 tmp_brnd_cd预先创建好
DO                                         ---循环体开始
SET vID=BRND_CD;                       ---对vID赋值,db2可以用set赋值,也可以用values赋值,这里可以写成values(BRND_CD) into vID
INSERT INTO WWM_FORINSERT_TEST VALUES(vID); ---往wwm_forinsert_test æ’入数据
END FOR;                              -----循环体结束
END @                             -----存储过程结束

参数语法说明

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:存储过程的主体

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-17
CREATE PROCEDURE schema_name.proc_name 
(
  IN  parm1 INTEGER,  OUT parm2 VARCHAR(1000) 
)
    SPECIFIC PROC_YYZY_XYKCJZ
    LANGUAGE SQL
    NOT DETERMINISTIC
    NO EXTERNAL ACTION
    MODIFIES SQL DATA
    CALLED ON NULL INPUT
 LB_MAIN: BEGIN ATOMIC
    /* DECLARE SYSTEM VARIABLES */
    DECLARE SQLSTATE CHAR(5); 
    DECLARE SQLCODE INTEGER; 
    DECLARE V_SQLSTATE CHAR(5); 
    DECLARE I_SQLCODE INTEGER; 
    DECLARE SQL_CUR_AT_END INTEGER; 
    DECLARE SQL_STMT VARCHAR(2000); 
    /* DECLARE USER-DEFINED VARIABLES */ 
    -- DECLARE V_SEPARATOR VARCHAR(50) DEFAULT ','; 
    /* DECLARE STATIC CURSOR */
    -- DECLARE C1 CURSOR /*WITH RETURN*/ FOR
    --   SELECT column1,column2...
    --   FROM table_name
    --   ORDER BY column1,column2...
    -- ;
    /* DECLARE DYNAMIC CURSOR */
    -- DECLARE C2 CURSOR FOR S2;
    /* DECLARE EXCEPTION HANDLE */
    DECLARE UNDO HANDLER FOR SQLEXCEPTION --异常声明
    BEGIN 
      VALUES(SQLCODE,SQLSTATE) INTO I_SQLCODE,V_SQLSTATE;
      SET parm2 = VALUE(parm2,'')
        ||'SYSTEM:SQLCODE='||RTRIM(CHAR(I_SQLCODE))
        ||',SQLSTATE='||VALUE(RTRIM(V_SQLSTATE),'')||'; '
      ; 
    END; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET SQL_CUR_AT_END=1;
    /* DECLARE TEMPORARY TABLE */
    -- DECLARE GLOBAL TEMPORARY TABLE tp1
    -- (
    --   column INTEGER
    -- ) with replace on commit preserve rows not logged; 
    
    /* SQL PROCEDURE BODY */
    
END LB_MAIN;

 上面的是我常用的一个存储过程的代码样本



异常处理需要加在游标声明之后,临时表声明之前(见DECLARE UNDO HANDLER FOR SQLEXCEPTION部分)



常用的异常处理方式分为三种:UNDO(回滚)、EXIT(退出)、CONTINUE(继续执行)

DECLARE UNDO|EXIT|CONTINUE HANDLER FOR



异常处理的对象可以为针对指定的sqlstate代码

DECLARE UNDO|EXIT|CONTINUE HANDLER FOR SQLSTATE XXXX

也可以针对某些condition,如sql异常,sql警告,以及游标末尾

DECLARE UNDO|EXIT|CONTINUE HANDLER FOR SQLEXCEPTION|SQLWARNING|NOT FOUND




异常处理的内容 ,可以是一些回滚,提交语句,也可以是日志记录等

DECLARE UNDO|EXIT|CONTINUE HANDLER FOR SQLEXCEPTION 
BEGIN
    --异常处理内容
END;



引用资料:http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004239.html

相似回答