科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2编程基础要点

DB2编程基础要点

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。

2008年2月14日

关键字: DB2

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

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

1.6 类似charindex查找字符在字串中的位置

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
        GENERATED ALWAYS AS IDENTITY
        (START WITH 500, INCREMENT BY 1),
      t2 CHAR(1));

在一个表中只允许有一个identity的column。

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 有效

#p#

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。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章