服务器 频道

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''@
   

0
相关文章