DB2存储过程杂谈
来源:互联网 发布:淘宝日本直邮物流信息 编辑:程序博客网 时间:2024/06/08 10:42
DB2常用的异常处理方式分为三种: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;
通常如何使用GET DIAGNOSTICS语句
解答:使用GET DIAGNOSTICS 变量 = ROW_COUNT语句可以获取最后一次执行INSERT、UPDATE或DELETE之后的记录数;DB2 SQL PL 支持GET DIAGNOSTICS语句获取SQL语句执行的信息,它可以用来返回CONDITION HANDLER的错误信息;GET DIAGNOSTICS EXCEPTION 1 变量 = MESSAGE_TEXT;但这样就不能再获取行数了。注意:GET DIAGNOSTICS语句是不支持SELECT和SELECT INTO语句的。
(1):CASE
WHEN 条件 THEN 结果1 (条件为:true/false)
WHEN 条件2 THEN 结果12
WHEN 条件3 THEN 结果13
ELSE 结果2
END
(2):CASE 表达式1
WHEN 表达式2 THEN 结果1 (当表达式1==表达式2)
WHEN 表达式3 THEN 结果13
WHEN 表达式4 THEN 结果14
ELSE 结果2
END
LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)
LEFT,RIGHT 分别返回ARG的最左边或最右边length个字符,ARG可以是字符或String
cast(N AS TYPE)将参数N转换为TYPE型。
比如
select cast(1 as float)/3 from sysibm.sysdummy1; ---将1转换为float型,然后除以3.
select cast(1 as decimal(10,2))/3 from sysibm.sysdummy1; --将1转换为decimal(10,2)型,然后除以3.
select cast(1111 as char(4)) from sysibm.sysdummy1; --将1111转换为字符型的'1111',要注意的是不可以转换为varchar,这是db2不允许的。
动态sql
-----
PREPARE FROM
261.----定义
262. DECLARE CC VARCHAR(4000);
263. DECLARE SQLSTR VARCHAR(4000);
264. DECLARE st STATEMENT;
265. DECLARE CUR CURSOR WITH RETURN TO CLIENT FOR CC;
266.
267.----执行动态SQL不返回
268. PREPARE st FROM SQLSTR;
269. EXECUTE st;
--------
在动态 sql中调用存储过程,如果存储过程中带有参数,必须要用到into和using 参数
对应的每一个in和inout的参数需要一个using的宿主变量,对于每个out和inout的参数需要一个into的宿主变量,
例如:
proc1(in param1, out param2)
set call_statement = 'call proc1(?,?)'
prepare s1 from call_statement
execute s1 into myvar2 using myvar1;
proc2(in param1, inout param2)
set call_statement = 'call proc2(?,?)'
prepare s1 from call_statement
execute s1 into myvar2 using myvar1, myvar2;
------
.创建临时表
DECLARE GLOBAL TEMPORARY TABLE 语句来定义临时表。DB2的临时表是基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现.
eg: DECLARE GLOBAL TEMPORARY TABLE SESSION.Temp_K_Cig (Cig varchar(20)) WITH REPLACE NOT LOGGED on commit preserve rows;
其中not logged 指不记录事务日志,with replace 指在程序结束后自动删除该临时表
1). DB2的临时表需要用命令Declare Temporary Table来创建, 并且需要创建在用户临时表空间上;
2). DB2在数据库创建时, 缺省并不创建用户临时表空间, 如果需要使用临时表, 则需要用户在创建临时表之前创建用户临时表空间;
3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现 .;
4). 缺省情况下, 在Commit命令执行时, DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;
5). 运行ROLLBACK命令时, 用户临时表将被删除;
还提供on commit preserve rows, 和on commit delete rows功能。
但是只提供global功能,意即表本身不会自动删除。 只是提供是否保留数据的功能。这样,preserve rows相当于会话级,而on commit delete rows则相当于事务级的临时表了。用处还是蛮
大的
为什么需要定义临时表:只有当我们在一个工作单元中的多条SQL语句中使用同一临时集合时,我们才需要定义临时表。临时表(TEMPORARY TABLE)通常应用在需要定义临时集合的场合。但是,在大部分需要临时集合的时候,我们根本就不需要定义临时表。当我们在一条SQL语句中只使用一次临时集合时,我们可以使用嵌套表表达式来定义临时集合;当我们在一条SQL语句中需要多次使用同一临时集合时,我们可以使用公共表表达式
存储过程:没有返回值;对于sqlserver、db2,可以进行查询、插入、更新、删除操作
函数:有返回值;对于sqlserver、db2,不可以进行插入、更新、删除操作
----DB2 MERGE INTO语句的使用
DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。
语法如下:
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name SET col1 = col_val1,col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values)
关键字、参数
into子句
在into子句中指定所要修改或者插入数据的目标表
using子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
on子句
在on子句中指定执行插入或者修改的满足条件。
when matched | not matched
用该子句通知数据库如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
------------
db2的命令行执行,登陆系统
su - db2odb
db2 connect to tsodb
db2 "select 1 from syscat.columns where colname='COL1' and tabname='TAB1' and tabschema='SCH1'"
- DB2存储过程杂谈
- java调用DB2存储过程杂谈
- DB2的存储过程
- db2存储过程语法
- DB2存储过程
- DB2 存储过程 调试
- DB2存储过程
- db2存储过程
- db2 存储过程
- db2 存储过程
- db2存储过程
- DB2分页存储过程
- DB2分页存储过程
- DB2分页存储过程
- DB2 存储过程开发
- db2 存储过程
- DB2存储过程总结
- DB2存储过程实例
- ViewFlipper实现滚动布局
- iOS 去掉html标签
- iOS10本地通知UserNotifications快速入门
- 如何严格设置php中session过期时间
- 一个Win32 C++ 动态连接库的模板 — 调用方可管理DLL分配的内存
- DB2存储过程杂谈
- null is not object evaluating ('_this3_selectRow')
- Android 启动另一个引用的方法记录
- js函数参数和返回值
- 高级容器ApplicationContext的初始过程---总览与概述
- Fragment全解析系列
- Excel规划求解求哪几个数字之和等于一个固定值
- Oracle行转列、列转行的Sql语句总结
- 工厂模式