DB2存储过程学习总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Db2 存储过程学习总结
●在命令窗口执行存储过程,可以方便看出存储过程在哪一行出现错误,方便修改。
●db2 存储过程常用语句格式
----定义
DECLARE CC VARCHAR(4000);
DECLARE SQLSTR VARCHAR(4000);
DECLARE st STATEMENT;
DECLARE CUR CURSOR WITH RETURN TO CLIENT FOR CC;
----执行动态SQL不返回
PREPARE st FROM SQLSTR;
EXECUTE st;
----执行动态SQL返回
PREPARE CC FROM SQLSTR;
OPEN CUR;
----判断是否为空,使用值替代
COALESCE(判断对象,替代值)
----定义临时表
DECLARE GLOBAL TEMPORARY TABLE SESSION.TempResultTable
(
Organization int,
OrganizationName varchar(100),
AnimalTypeName varchar(20),
ProcessType int,
OperatorName varchar(100),
OperateCount int
)
WITH REPLACE -- 如果存在此临时表,则替换
NOT LOGGED;
DB2 9.x临时表使用总结
1). DB2的临时表需要用命令Declare Temporary Table来创建,并且需要创建在用户临时表空间上;
2). DB2在数据库创建时,缺省并不创建用户临时表空间,如果需要使用临时表,则需要用户在创建临时表之前创建用户临时表空间;
3). 临时表的模式为SESSION,SESSION即基于会话的,且在会话之间是隔离的。当会话结束时,临时表的数据被删除,临时表被隐式卸下。对临时表的定义不会在SYSCAT.TABLES中出现 .;
4). 缺省情况下,在Commit命令执行时,DB2临时表中的所有记录将被删除; 这可以通过创建临时表时指定不同的参数来控制;
5). 运行ROLLBACK命令时,用户临时表将被删除;
下面是DB2临时表定义的一个示例:
DECLARE GLOBAL TEMPORARY TABLE results
(
RECID VARCHAR(32) , --id
XXLY VARCHAR(100), --信息来源
LXDH VARCHAR(32 ), --信息来源联系电话
FKRQ DATE --反馈时间
) ON COMMIT PRESERVE ROWS WITH REPLACE NOT LOGGED;
----字符串函数
Substr
----隐形游标迭代
for 游标名as select....... do
使用游标名.字段名
内容区块
end for;
----直接返回值或变量
declare rs1 cursor with return to caller for select 0 from sysibm.sysdummy1;
----判断表是否存在
select count(*) into @exists from syscat.tables where tabschema = current schema and tabname='ZY_PROCESSLOG';
----取前面N条记录
select * from 表名FETCH FIRST N ROWS ONLY
----定义返回值
declare rs0 cursor with return to caller for select 0 from sysibm.sysdummy1;
declare rs1 cursor with return to caller for select 1 from sysibm.sysdummy1;
----得到插入的自增长列最大值
VALUES IDENTITY_VAL_LOCAL() INTO 变量
Merge into [A] using [B] on 条件when ***
通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表
语法如下
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ] WHEN NOT MATHED THEN [execute something else here ! ]
我们先看看一个简单的例子,来介绍一个merge into的用法
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
在这个例子里。前面的merger into products using newproducts 表示的用newproducts表来merge到products表,merge的匹配关系就是on后面的条件子句的内容,这里根据两个表的product_id来进行匹配,那么匹配上了我们的操作是就是when matched then的子句里的动作了,这里的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值到product的product_name里。如果没有匹配上则insert 这样的一条语句进去。大家看看这个merget inot的用法是不是一目了然了呀。这里merger 的功能,好比比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的性能是优于同等功能的update/insert语句的。
Oracle的substr函数简单用法
substr(字符串,截取开始位置,截取长度) //返回截取的字
substr('Hello World',0,1) //返回结果为'H' *从字符串第一个字符开始截取长度为1的字符串substr('Hello World',1,1) //返回结果为'H' *0和1都是表示截取的开始位置为第一个字符
substr('Hello World',2,4) //返回结果为'ello'
substr('Hello World',-3,3)//返回结果为'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i 个字符
测试:
select substr('Hello World',-3,3) value from dual;