51CTO技术论坛 » DB2 » DB2编程序技巧(二)        上一帖     下一帖    查看完整版本

页: [1]

老三2006-10-31 05:42
DB2编程序技巧(二)

1.10 预防字段空值的处理
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT
FROM DEPARTMENT
   COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。
   和oracle的isnull类似,但isnull好象只能两个表达式。
      

1.11 取得处理的记录数
declare v_count int;
update tb_test set t1=’0’
where t2=’2’;
--检查修改的行数,判断指定的记录是否存在
get diagnostics v_ count=ROW_COUNT;      
只对update,insert,delete起作用.
不对select into 有效

1.12 从存储过程返回结果集(游标)的用法
1、建一sp返回结果集
CREATE PROCEDURE DB2INST1.Proc1 (  )
    LANGUAGE SQL
    result sets 2(返回两个结果集)
------------------------------------------------------------------------
-- SQL 存储过程  
------------------------------------------------------------------------
P1: BEGIN
        declare c1 cursor  with return to caller for  
            select  market_code
            from    tb_market_code;
        --指定该结果集用于返回给调用者
        declare c2 cursor  with return to caller for  
            select  market_code
            from    tb_market_code;
         open c1;
         open c2;
END P1                                       

2、建一SP调该sp且使用它的结果集

CREATE PROCEDURE DB2INST1.Proc2 (
out out_market_code char(1))
    LANGUAGE SQL
------------------------------------------------------------------------
-- SQL 存储过程  
------------------------------------------------------------------------
P1: BEGIN

declare loc1,loc2 result_set_locator varying;  
--建立一个结果集数组
call proc1;
--调用该SP返回结果集。
associate result set locator(loc1,loc2) with procedure proc1;
--将返回结果集和结果集数组关联
allocate cursor1 cursor for result set loc1;
allocate cursor2 cursor for result set loc2;
--将结果集数组分配给cursor
fetch  cursor1 into out_market_code;
--直接从结果集中赋值
close cursor1;         

END P1

3、动态SQL写法
     DECLARE CURSOR C1 FOR STMT1;  
     PREPARE STMT1 FROM
        'ALLOCATE C2 CURSOR FOR RESULT SET ?';
4、注意:
一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。
二、 allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。

1.13 类型转换函数
select cast ( current time as char(8)) from tb_market_code

1.14 存储过程的互相调用
目前,c sp可以互相调用。
Sql sp 可以互相调用,
Sql sp 可以调用C sp,
但C sp 不可以调用Sql sp(最新的说法是可以)

1.15 C存储过程参数注意
create procedure pr_clear_task_ctrl(
IN IN_BRANCH_CODE char(4),
              IN IN_TRADEDATE   char(8),
           IN IN_TASK_ID     char(2),
       IN IN_SUB_TASK_ID char(4),
       OUT OUT_SUCCESS_FLAG INTEGER )
  
DYNAMIC RESULT SETS 0
LANGUAGE C  
PARAMETER STYLE GENERAL WITH NULLS(如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误)
NO DBINFO
FENCED
MODIFIES SQL DATA
EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@

1.16 存储过程fence及unfence
fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。
一般而言,fence的存储过程比较安全。
但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。

1.17 SP错误处理用法
如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,
DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都
会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。
处理办法:
定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,
在CALL SPNAME之后, SET V_STATUS = 1,
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
IF V_STATUS  1 THEN
--警告处理,插入日志
SET V_STATUS = 0;
END IF;
END;
1.18 import用法
db2 import  from  gh1.out   of  DEL messages err.txt insert into  db2inst1.tb_dbf_match_ha

注意要加schma

1.19 values的使用
如果有多个 set  语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。
  
但要注意,values不能将null值付给一个变量。
values(null) into out_return_code;
这个语句会报错的。

1.20 给select 语句指定隔离级别
select * from tb_head_stock_balance with ur
  
1.21 atomic及not atomic区别
atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。

2  DB2编程性能注意
2.1 大数据的导表
应该是export后再load性能更好,因为load不写日志。
比select into 要好。

redking2008-4-10 06:58
good

关键词: DB2       编程       程序       d              

相关文章:
DB2编程序技巧 (四)
新的文件系统为Solaris 10锦上添花
Sql Server实用操作小技巧集合
MAC扫描器.rar
中团论坛申请友情链接!

查看完整版本: DB2编程序技巧(二)


Powered by 51CTO.COM