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) , --idXXLY 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 thenupdate set p.product_name = np.product_namewhen not matched theninsert 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;附:java中substring(index1,index2)的简单用法作用:从字符串索引(下标)为index1的字符开始截取长度为index2-index1 的字符串。
String str="Hello World";System.out.println(str.substring(0,5));打印结果为:Hello●LOCATE(substr,str), LOCATE(substr,str,pos)第一个语法返回字符串str第一次出现的子串substr的位置。
第二个语法返回第一次出现在字符串str的子串substr的位置,从位置pos开始。
substr不在str中,则返回0。
SQL> SELECT LOCATE('bar', 'foobarbar');+---------------------------------------------------------+| LOCATE('bar', 'foobarbar') |+---------------------------------------------------------+| 4 |+---------------------------------------------------------+1 row in set (0.00 sec)●●●REPLACE函数的使用REPLACE用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
语法REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )参数''string_replace1''待搜索的字符串表达式。
string_replace1 可以是字符数据或二进制数据。
''string_replace2''待查找的字符串表达式。
string_replace2 可以是字符数据或二进制数据。
''string_replace3''替换用的字符串表达式。
string_replace3 可以是字符数据或二进制数据。
返回类型如果string_replace(1、2 或3)是支持的字符数据类型之一,则返回字符数据。
如果string_replace(1、2 或3)是支持的binary 数据类型之一,则返回二进制数据。
示例下例用xxx 替换abcdefghi 中的字符串cde。
SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')GO下面是结果集:------------abxxxfghixxx(1 row(s) affected)SQL的partition by 字段(可实现自动分配组号跟归组合并)先看例子:if object_id('TESTDB') is not null drop table TESTDBcreate table TESTDB(A varchar(8), B varchar(8))insert into TESTDBselect 'A1', 'B1' union allselect 'A1', 'B2' union allselect 'A1', 'B3' union allselect 'A2', 'B4' union allselect 'A2', 'B5' union allselect 'A2', 'B6' union allselect 'A3', 'B7' union allselect 'A3', 'B3' union allselect 'A3', 'B4'-- 所有的信息SELECT * FROM TESTDBA B-------A1 B1A1 B2A1 B3A2 B4A2 B5A2 B6A3 B7A3 B3A3 B4-- 使用PARTITION BY 函数后SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM FROM TESTDBA B NUM-------------A1 B1 1A1 B2 2A1 B3 3A2 B4 1A2 B5 2A2 B6 3A3 B7 1A3 B3 2A3 B4 3可以看到结果中多出一列NUM 这个NUM就是说明了相同行的个数,比如A1有3个,他就给每个A1标上是第几个。