创建:db2 - td@ -vf createSQLproc .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_name DATATYPE [DEAFULT value];
2 、数组
2.1 定义
CREATE TYPE mynames as VARCHAR(30 ) ARRAY [];--定义数组 2.2 声明
DECLARE nameArr mynames;--声明数组 2.3 赋 值
SET TESTARR=ARRAY[1 ,2, 3,4 ,5, 6,7 ,8, 9,10 ];SET TESTARRES (1),( 2)];-- 方法1,使用 SET 语句
SELECT SUM (NUM) INTO TESTARR[1 ] FROM (VALUES ( 1),(2 ))M );--方法 2,使用VALUES INTO 语句
VALUES 1 INTO TESTARR[1 ];--方法 3,使用SELECT INTO 语句 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 复合语句
语法:
=ARRAY[VALUAS TEMP(NU label: BEGIN [ ATOMIC | NOT ATOMIC] --ATOMIC 关键字封装的复合语句被当作一个处理单元
--变量声明、过程逻辑等 END label
4 流程控制
--条件判断IF
IF < condition> THEN
IF FRIEND='张三' THEN
SET MSG ='你好,张三 '; ELSEIF FRIEND=' 李四' THEN SET MSG ='你好,李四 '; ELSE
SET MSG ='对不起,我不认识你 '; END IF ; --循环While
WHILE < condition> DO
SET NUM= NUM+I ; SET I =I+1 ; END WHILE ; --循环for
FOR < loop_name> AS < sql statements> DO
FOR TEST AS SELECT I FROM (VALUES(1),(2DO
SET NUM =NUM+ I; END FOR ; --循环LOOP LABEL:LOOP
),(3)) AS TEMP(I ) END LOOP LABEL; TEST_LOOP:LOOP
SET NUM =NUM+ I; SET I =I+1 ; IF I >10 THEN LEAVE TEST_LOOP ; END IF; END LOOP TEST_LOOP; --循环Repeat REPEAT
SET NUM= NUM+I ; SET I= I+1 ; UNTIL I>10 END REPEAT ; --其他关键字
ITERATE label -- 。在SQL PL 中, ITERATE和LEAVE 实现相同的作用 LEAVE label GOTO label RETURN < result>
4 异常处理
SQLCODE 是在 每一条 SQL 语句执行后收到的代码。
SQLSTATE 是 一个遵守 ISO/ANSI SQL92 标准的长为 5个字 符的字符串,通常,几 个SQLCODE 可能对应一个 SQLSTATE。
--要在 SQL PL 中使用 SQLCODE和 SQLSTATE,我们必要先声明它们,如下: DECLARE SQLCODE INT DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; --自定义异常
DECLARE < condition-name > CONDITION FOR SQLSTATE
SQLSTATE='01XXX' SQLWARNING SQLSTATE='02000' NOT FOUND 其他SQLSTATE SQLEXCEPTION --抛出异常信息
SIGNAL SQLSTATE
CREATE PROCEDURE TESTSIGNAL (
IN FRIEND VARCHAR(10 ) )
LANGUAGE SQL BEGIN
DECLARE myexcept CONDITION FOR SQLSTATE '70000' ;--声明异常
IF FRIEND ='李
四 ' THEN --对输入参数进行验证
SIGNAL myexcept 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 myexcept CONDITION FOR SQLSTATE '70000' ;
DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT SQLSTATE , SQLCODE
INTO state_out, code_out FROM SYSIBM.SYSDUMMY1 ; -- 定义异常处理程序
IF FRIEND ='张三 ' THEN
相关推荐: