DB2存储过程学习笔记资料.docx

上传人:b****2 文档编号:2321216 上传时间:2022-10-28 格式:DOCX 页数:26 大小:30.47KB
下载 相关 举报
DB2存储过程学习笔记资料.docx_第1页
第1页 / 共26页
DB2存储过程学习笔记资料.docx_第2页
第2页 / 共26页
DB2存储过程学习笔记资料.docx_第3页
第3页 / 共26页
DB2存储过程学习笔记资料.docx_第4页
第4页 / 共26页
DB2存储过程学习笔记资料.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

DB2存储过程学习笔记资料.docx

《DB2存储过程学习笔记资料.docx》由会员分享,可在线阅读,更多相关《DB2存储过程学习笔记资料.docx(26页珍藏版)》请在冰豆网上搜索。

DB2存储过程学习笔记资料.docx

DB2存储过程学习笔记资料

创建:

db2 - td@ -vfcreateSQLproc .db2 --end@( 此处的@可替换成其他符号 )

调用:

 db2 call 过程名(参数 )

1基础

--声明变量:

DECLARE < variable-name > < data-type> < DEFAULT constant >

--赋值:

SET x= 10;

SET y=( SELECT SUM (c1) from T1);

VALUES 10 INTO x;

SELECT SUM (c1) INTO y from T1 ;

--会话全局变量:

CREATE VARIABLE var_nameDATATYPE [DEAFULT value];

2、数组

2.1 定义

CREATE TYPE mynames as VARCHAR(30 ) ARRAY [];--定义数组

2.2 声明

DECLARE nameArrmynames;--声明数组

2.3 赋 值

SET TESTARR=ARRAY[1 ,2, 3,4 ,5, 6,7 ,8, 9,10 ];SET TESTARR =ARRAY[VALUES 

(1),( 2)];-- 方法1,使用 SET 语句

SELECT SUM (NUM) INTO TESTARR[1 ] FROM (VALUES ( 1),(2 )) AS TEMP(NUM );--方法 2,使用VALUESINTO 语句

VALUES 1 INTO TESTARR[1 ];--方法 3,使用SELECTINTO 语句

SET TESTARR[1] =1; --方法4, 使用ARRAY 构造函数

2.4 操作数组的函数

 ARRAY_DELETE:

删除数组元素

 TRIM_ARRAY:

从右开始删除指定数目 个元素

 ARRAY_FIRST:

返回数组中第一 个元素

 ARRAY_LAST:

返回数组中最后一 个元素

 ARRAY_NEXT:

返回数组下一个元素

 ARRAY_PRIOR:

返回数组前一个元素

 ARRAY_VARIABLE:

返回参数指定的元素

 ARRAY_EXISTS:

判断数组是否有元素

 CARDINALITY:

返回数组中元素的 个数

 MAX_CARDINALITY:

返回数组中元素的 个数

  UNNEST:

将数组转换 为表

3复合语句

语法:

label:

 BEGIN [ ATOMIC | NOT ATOMIC] --ATOMIC 关键字封装的复合语句被当作一个处理单元

--变量声明、过程逻辑等

END label

4 流程控制

--条件判断IF

IF < condition> THEN

    ;

ELSEIF  THEN

    ;

ELSE

    ;

END IF ;

IF FRIEND='张三' THEN

    SET MSG ='你好,张三 ';

ELSEIFFRIEND=' 李四' THEN

    SET MSG ='你好,李四 ';

ELSE

    SET MSG ='对不起,我不认识你 ';

END IF ;

--循环While

WHILE < condition>

DO

    ;

END WHILE ;

WHILE I<= 10

DO

SET NUM= NUM+I ;

    SET I =I+1 ;

END WHILE ;

--循环for

FOR < loop_name> AS < sql statements>

DO

    ;

END FOR ;

FOR TEST AS SELECT I FROM (VALUES

(1),(2 ),(3)) AS TEMP(I )

DO

    SET NUM =NUM+ I;

END FOR ;

--循环LOOP

LABEL:

LOOP

;

   LEAVELABEL;

END LOOP LABEL;

TEST_LOOP:

LOOP

    SET NUM =NUM+ I;

    SET I =I+1 ;

    IF I >10 THEN

       LEAVETEST_LOOP ;

    END IF;

END LOOP TEST_LOOP;

--循环Repeat

REPEAT

;

   UNTIL 

END REPEAT ;

REPEAT

SET NUM= NUM+I ;

SET I= I+1 ;

   UNTILI>10

END REPEAT ;

--其他关键字

ITERATE label -- 。

在SQLPL 中, ITERATE和LEAVE 实现相同的作用

LEAVElabel

GOTO label

RETURN < result>

4异常处理

SQLCODE 是在 每一条 SQL 语句执行后收到的代码。

SQLSTATE 是 一个遵守 ISO/ANSISQL92 标准的长为 5个字 符的字符串,通常,几 个SQLCODE 可能对应一个 SQLSTATE。

--要在 SQLPL 中使用 SQLCODE和 SQLSTATE,我们必要先声明它们,如下:

DECLARE SQLCODE INT DEFAULT 0;

DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

--自定义异常

DECLARE < condition-name > CONDITION FOR SQLSTATE ;

DECLARE mytrucCONDITION FOR SQLSTATE '01004';  --定义一个字符串数据被截断的异常,名字为 mytruc

--默认的3 种异常

SQLSTATE='01XXX' SQLWARNING

SQLSTATE='02000' NOT FOUND

其他SQLSTATE SQLEXCEPTION

--抛出异常信息

SIGNAL SQLSTATE  SET MESSAGE_TEXT=;

CREATE PROCEDURE TESTSIGNAL (

    IN FRIEND VARCHAR(10 )

LANGUAGE SQL

BEGIN

    DECLARE myexceptCONDITION FOR SQLSTATE '70000' ;--声明异常

   

    IF FRIEND ='李四 ' THEN                           --对输入参数进行验证

       SIGNALmyexcept SET MESSAGE_TEXT = '输入参数不能为李四 ';

    END IF;

   

    IF FRIEND ='张三 ' THEN                           --对输入参数进行验证

       SIGNAL SQLSTATE '70000' SET MESSAGE_TEXT = '输入参数不能为张三';

    END IF;

END!

--异常处理定义

DECLARE [ CONTINUE | EXIT | UNDO ] HANDLER FOR  

    --CUNTINUE, 当抛出异常后,由对应的异常处理器解决异常,工作流会继续执行抛出异常语句的下一个语句。

    --EXIT,     当抛出异常后,相应的异常处理器解决该异常,工作流会直接到程序的末尾。

    --UNDO,     当抛出异常后,对应的异常处理器解决此异常,工作流直接到达程序的末尾并且撤销所有已实现的操作,或者回滚所有已执行的语句。

CREATE PROCEDURE TEST (

    IN FRIEND VARCHAR(10 )

   ,OUT state_out CHAR(5)

   ,OUT code_out INT)

LANGUAGE SQL

BEGIN

    DECLARE SQLCODE INT DEFAULT 0;

    DECLARE SQLSTATE CHAR (5) DEFAULT '00000';

   

    DECLARE myexceptCONDITION FOR SQLSTATE '70000' ;

   

    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT SQLSTATE , SQLCODE INTO state_out, code_out FROM SYSIBM.SYSDUMMY1 ;  -- 定义异常处理程序

    IF FRIEND ='张三 ' THEN

       SIGNALmyexcept SET MESSAGE_TEXT = '输入参数不能为张三 ';

    END IF;

END!

5获取前面执行的SQL语句的相关信息

--前面执行的SQL 语句处理的行数

--前面执行的SQL 语句返回的 DB2 错误或警告消息文本

--与前一个CALL 语句相关联的过程返回的状态值

GET DIAGNOSTICS =[ROW_COUNT | DB2_RETURN_STATUS | 

condition-information :

EXCEPTION 1 =[MESSAGE_TEXT | DB2_TOKEN_STRING]

CREATE PROCEDURE TESTPROC1 (IN CH1 CHAR

(2))

BEGIN

    DECLARE SQLCODE INTEGER DEFAULT 0;

    DECLARE SQLSTATE CHAR (5) DEFAULT '';

    DECLARE ERR_MSG VARCHAR(70 );

    DECLARE R_STATE INTEGER DEFAULT 0 ;

   

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION --声明异常处理模块

    BEGIN

        GET DIAGNOSTICS EXCEPTION 1 ERR_MSG =MESSAGE_TEXT; --获取前面执行的 SQL 语句返回的错误或警告消息

        SET R_STATE=1;

    END;

    INSERT INTO TEST VALUES (CH1);

    RETURN R_STATE ;

END!

----------------------------------

CREATE PROCEDURE TESTPROC (OUT R_COUNT INTEGER, OUT R_STATE INTEGER)

P1:

BEGIN

    SET R_COUNT =0;

    SET R_STAT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1