db2编程技巧.docx

上传人:b****5 文档编号:8787484 上传时间:2023-05-15 格式:DOCX 页数:16 大小:25.40KB
下载 相关 举报
db2编程技巧.docx_第1页
第1页 / 共16页
db2编程技巧.docx_第2页
第2页 / 共16页
db2编程技巧.docx_第3页
第3页 / 共16页
db2编程技巧.docx_第4页
第4页 / 共16页
db2编程技巧.docx_第5页
第5页 / 共16页
db2编程技巧.docx_第6页
第6页 / 共16页
db2编程技巧.docx_第7页
第7页 / 共16页
db2编程技巧.docx_第8页
第8页 / 共16页
db2编程技巧.docx_第9页
第9页 / 共16页
db2编程技巧.docx_第10页
第10页 / 共16页
db2编程技巧.docx_第11页
第11页 / 共16页
db2编程技巧.docx_第12页
第12页 / 共16页
db2编程技巧.docx_第13页
第13页 / 共16页
db2编程技巧.docx_第14页
第14页 / 共16页
db2编程技巧.docx_第15页
第15页 / 共16页
db2编程技巧.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

db2编程技巧.docx

《db2编程技巧.docx》由会员分享,可在线阅读,更多相关《db2编程技巧.docx(16页珍藏版)》请在冰点文库上搜索。

db2编程技巧.docx

db2编程技巧

1DB2编程

1.1建存储过程时CREATE 后一定不要用TAB键3

1.2使用临时表3

1.3从数据表中取指定前几条记录3

1.4游标的使用4

注意commit和rollback4

游标的两种定义方式4

修改游标的当前记录的方法5

1.5类似DECODE的转码操作5

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

1.7类似DATEDIF计算两个日期的相差天数5

1.8写UDF的例子5

1.9创建含IDENTITY值(即自动生成的ID)的表6

1.10预防字段空值的处理6

1.11取得处理的记录数6

1.12从存储过程返回结果集(游标)的用法6

1.13类型转换函数8

1.14存储过程的互相调用8

1.15C存储过程参数注意8

1.16存储过程FENCE及UNFENCE8

1.17SP错误处理用法9

1.18IMPORT用法9

1.19VALUES的使用9

1.20给SELECT 语句指定隔离级别10

1.21ATOMIC及NOT ATOMIC区别10

2DB2编程性能注意10

2.1大数据的导表10

2.2SQL语句尽量写复杂SQL10

2.3SQL  SP及C SP的选择10

2.4查询的优化(HASH及RR_TO_RS)11

2.5避免使用COUNT(*) 及EXISTS的方法11

3DB2表及SP管理12

3.1看存储过程文本12

3.2看表结构12

3.3查看各表对SP的影响(被哪些SP使用)12

3.4查看SP使用了哪些表12

3.5查看FUNCTION被哪些SP使用12

3.6修改表结构12

4DB2系统管理13

4.1DB2安装13

4.2创建DATABASE14

4.3手工做数据库远程(别名)配置14

4.4停止启动数据库实例14

4.5连接数据库及看当前连接数据库14

4.6停止启动数据库HEAD15

4.7查看及停止数据库当前的应用程序15

4.8查看本INSTANCE下有哪些DATABASE15

4.9查看及更改数据库HEAD的配置16

4.9.1改排序堆的大小16

4.9.2改事物日志的大小16

4.9.3出现程序堆内存不足时修改程序堆内存大小16

4.10查看及更改数据库实例的配置16

4.10.1打开对锁定情况的监控。

16

4.10.2更改诊断错误捕捉级别17

4.11DB2环境变量17

4.12DB2命令环境设置17

4.13改变隔离级别17

4.14管理DB\INSTANCE的参数18

4.15升级后消除版本问题18

4.16查看数据库表的死锁18 

1DB2编程

1.1建存储过程时Create 后一定不要用TAB键

createprocedure

的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;

1.4游标的使用

注意commit和rollback

使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。

Commit 和Rollback有很多东西要注意。

特别小心

游标的两种定义方式

一种为

declare continue handler for not found

   begin

     set v_notfound = 1;

   end;

declare cursor1 cursor with hold for select 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

--work

set v_notfound=0;

fetch cursor1 into v_market_code;

end while;

close cursor1;

这种方式使用起来比较复杂,但也比较灵活。

特别是可以使用with hold 选项。

如果循环内有commit或rollback 而要保持该cursor不被关闭,只能使用这种方式。

另一种为

     pcursor1:

 for loopcs1 as  cousor1  cursor  as

select  market_code  as market_code

           from tb_market_code

           for update

        do

        end for;

       这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。

  但不能使用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

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;

updatetb_testsett1=’0’

wheret2=’2’;

--检查修改的行数,判断指定的记录是否存在

get diagnosticsv_ 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.15C存储过程参数注意

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.17SP错误处理用法

如果在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.18import用法

db2 import  from  gh1.out   of  DEL messages err.txt insert into  db2inst1.tb_dbf_match_ha

注意要加schma

1.19values的使用

如果有多个 set  语句给变量付值,最好使用values语句,改写为一句。

这样可以提高效率。

 

但要注意,values不能将null值付给一个变量。

values(null) into out_return_code;

这个语句会报错的。

1.20给select 语句指定隔离级别

select * from tb_head_stock_balance with ur

 

1.21atomic及not atomic区别

atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。

2 DB2编程性能注意

2.1大数据的导表

应该是export后再load性能更好,因为load不写日志。

比select into 要好。

2.2SQL语句尽量写复杂SQL

   尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。

   DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。

Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。

这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。

一个总的思想就是尽量减少SQL语句的个数。

2.3SQL  SP及C SP的选择

首先,C的sp的性能比sql 的sp 的要高。

一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。

而如果逻辑比较复杂,SQL比较简单,用c写比较好。

2.4查询的优化(HASH及RR_TO_RS)

db2set DB2_HASH_JOIN=Y(HASH排序优化)

   指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。

   剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下  72秒。

db2set DB2_RR_TO_RS=Y       

 该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.

这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。

     

2.5避免使用count(*) 及exists的方法

1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。

2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。

如果做这两中操作的目的是为

       select into 服务的话,就可以省略掉这两步。

直接使用select into 选择记录中的字段。

如果是没有记录选择到的话,db2 会将  sqlcode=100 和 sqlstate=’20000’

如果是有多条记录的话,db2会产生一个错误。

程序可以创建  continue handler for  exception 

              continue handler for  not found

来检测。

这是最快速的方法。

3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。

这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。

3DB2表及sp管理

3.1看存储过程文本

select text from syscat.procedures where procname='PROC1';

3.2看表结构

describe table syscat.procedures

describe select * from syscat.procedures

3.3查看各表对sp的影响(被哪些sp使用)

select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname='TB_BRANCH'))

3.4查看sp使用了哪些表

select bname from syscat.packagedep where btype='T' and pkgname in(select bname from sysibm.sysdependencies where dname in (select specificname from syscat.procedures where procname='PR_CLEAR_MATCH_DIVIDE_SHA'))

3.5查看function被哪些sp使用

select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname   in  (select SPECIFICNAME from SYSCAT.functions where funcname='GET_CURRENT_DATE')))

使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。

必须先创建function,调用该func

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2