1.1 建存储过程时Create 后一定不要用TAB键 create procedure 的create后只能用空格,而不可用tab健,否则编译会通不过。 切记,切记。
1.2 使用临时表
要注意,临时表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建临时表的。
另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。
建临时表时最好加上 with replace选项,这样就可以不显示的drop 临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
1.3 从数据表中取指定前几条记录
select * from tb_market_code fetch first 1 rows only
但下面这种方式不允许select market_code into v_market_code from tb_market_code fetch first 1 rows only; |
declare v_market_code char(1); declare cursor1 cursor for select market_code from tb_market_code fetch first 1 rows only for update; open cursor1; fetch cursor1 into v_market_code; close cursor1; |
注意commit和rollback
使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。Commit 和Rollback有很多东西要注意。特别小心
游标的两种定义方式
一种为
declare continue handler for not found beginset v_notfound = 1;end;declare cursor1 cursor with hold forselect market_code from tb_market_code for update;open cursor1;set v_notfound=0;fetch cursor1 into v_market_code;while v_notfound=0 Do--workset v_notfound=0;fetch cursor1 into v_market_code;end while;close cursor1; |
另一种为
pcursor1: for loopcs1 as cousor1 cursor as select market_code as market_codefrom tb_market_codefor updatedoend for; |
但不能使用with hold 选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。
修改游标的当前记录的方法
update tb_market_code set market_code='0' where current of cursor1; |
不过要注意将cursor1定义为可修改的游标
declare cursor1 cursor for select market_code from tb_market_code for update;for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。 |
1.5 类似decode的转码操作
oracle中有一个函数 select decode(a1,'1','n1','2','n2','n3') aa1 from
db2没有该函数,但可以用变通的方法
select case a1 when '1' then 'n1' when '2' then 'n2' else 'n3' end as aa1 from |
Locate(‘y’,’dfdasfay’)
查找’y’ 在’dfdasfay’中的位置。
1.7 类似datedif计算两个日期的相差天数
days(date(‘2001-06-05’)) – days(date(‘2001-04-01’)) days 返回的是从 0001-01-01 开始计算的天数 |
1.8 写UDF的例子
C写见sqllib\samples\cli\udfsrv.c
1.9 创建含identity值(即自动生成的ID)的表
建这样的表的写法
CREATE TABLE test (t1 SMALLINT NOT NULL ENERATED ALWAYS AS IDENTITY (START WITH 500, INCREMENT BY 1), t2 CHAR(1)); |
1.10 预防字段空值的处理
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT FROM DEPARTMENT |
和oracle的isnull类似,但isnull好象只能两个表达式。