`
liuwentao
  • 浏览: 77972 次
  • 来自: 江西
社区版块
存档分类
最新评论

db2编程使用技巧一(转帖)

阅读更多

1 DB2编程
1.1 建存储过程时CREATE 后一定不要用TAB键 3
1.2 使用临时表 3
1.3 从数据表中取指定前几条记录 3
1.4 游标的使用 4
注意commit和rollback 4
游标的两种定义方式 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.15 C存储过程参数注意 8
1.16 存储过程FENCE及UNFENCE 8
1.17 SP错误处理用法 9
1.18 IMPORT用法 9
1.19 VALUES的使用 9
1.20 给SELECT 语句指定隔离级别 10
1.21 ATOMIC及NOT ATOMIC区别 10
2 DB2编程性能注意 10
2.1 大数据的导表 10
2.2 SQL语句尽量写复杂SQL 10
2.3 SQL  SP及C SP的选择 10
2.4 查询的优化(HASH及RR_TO_RS) 11
2.5 避免使用COUNT(*) 及EXISTS的方法 11
3 DB2表及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
4 DB2系统管理 13
4.1 DB2安装 13
4.2 创建DATABASE 14
4.3 手工做数据库远程(别名)配置 14
4.4 停止启动数据库实例 14
4.5 连接数据库及看当前连接数据库 14
4.6 停止启动数据库HEAD 15
4.7 查看及停止数据库当前的应用程序 15
4.8 查看本INSTANCE下有哪些DATABASE 15
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.11 DB2环境变量 17
4.12 DB2命令环境设置 17
4.13 改变隔离级别 17
4.14 管理DB\INSTANCE的参数 18
4.15 升级后消除版本问题 18
4.16 查看数据库表的死锁 18
 
1 DB2编程
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;

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;
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;
这个语句会报错的。

分享到:
评论

相关推荐

    编程(db2)使用技巧

    根据给定的文件信息,以下是对“编程(db2)使用技巧”的详细知识点解析: ### 1. DB2编程基础 #### 1.1 创建表(Create Table) 在DB2中创建表是一个基本操作,用于定义数据存储结构。创建表时,需要指定列名、数据...

    DB2编程技巧与实用技术

    DB2编程技巧与实用技术是数据库管理领域的重要一环,特别是在处理复杂的业务逻辑和性能调优时显得尤为重要。本文将详细解析几个关键的DB2编程技术。 首先,创建存储过程时,需要注意SQL语句的格式。在使用`CREATE ...

    db2编程技巧

    ### DB2编程技巧详解 #### 一、DB2基本操作 **1.1 创建表 (Create Table)** 在DB2中创建表时,通常使用`CREATE TABLE`语句。例如: ``` CREATE TABLE tb_market_code ( market_code CHAR(10), -- 其他字段定义 ...

    DB2 编程技巧开发笔记

    这篇"DB2编程技巧开发笔记"涵盖了多个关键领域,旨在帮助开发者和管理员提升在DB2环境中的工作效率和技能。以下是对这些知识点的详细解释: 1. **DB2命令**:DB2提供了一系列的命令行工具,用于执行数据库操作,如`...

    DB2编程基础DB2编程基础DB2编程基础

    在DB2编程中,理解并熟练掌握这些基础概念和技巧至关重要,它们能帮助开发者编写出高效、稳定的数据库应用程序。除此之外,还要注意SQL标准的遵循,避免与特定数据库系统的语法差异带来的问题,并确保代码的可移植性...

    DB2编程序技巧

    db2 开发中常用技巧

    DB2编程基础要点 sql 存储过程

    在使用`CREATE PROCEDURE`语句时,"create"后的空白应仅使用空格,避免使用制表符(TAB键),因为制表符可能导致编译错误,这是DB2编程中的一个常见陷阱。 在使用临时表时,DB2有其特定的规定。临时表必须建立在"user...

    db2使用技巧db2使用技巧

    作为一个专业的 IT 行业大师,我将从给定的文件中生成相关的知识点,总结 DB2 使用技巧,帮助开发者更好地使用 DB2。 DB2 编程 1.1 建存储过程时 CREATE 后一定不要用 TAB 键 在创建存储过程时,CREATE 后只能...

    db2使用14个经典小技巧

    2. **编目TCP/IP节点**:使用 `db2 catalog tcpip node remote server ostype` 命令来添加一个新的TCP/IP节点,其中`remote`是节点名称,`ostype`是操作系统类型。 3. **取消节点编目**:若需移除节点,运行 `db2 ...

    java连接DB2数据库编程简介

    Java连接DB2数据库编程是Java开发中的一项重要技能,尤其在企业级应用中,数据库的交互通常是必不可少的。本篇文章将深入探讨如何使用Java来连接并操作DB2数据库,包括基本的连接步骤、所需的库以及实用示例。 首先...

    DB2编程及SQL指南

    在本书中,作者使用了一些专业术语来描述DB2及其相关组件,例如“DB2 for OS/390 and z/OS”指的是IBM DB2 Universal Database Server的一个版本,适用于OS/390和z/OS操作系统。此外,书中还会提到各种SQL命令和函数...

    IBM DB2 数据库使用小技巧

    ### IBM DB2 数据库使用小技巧详解 IBM DB2 是一款功能强大的企业级数据库管理系统,广泛应用于各种商业和工业环境中。对于DB2的使用者来说,掌握一些常用命令和技巧是提高工作效率的关键。以下是对给定文件中提到...

    .net连接DB2数据库编程简介

    本文将详细介绍如何使用.NET Framework和IBM Data Provider for .NET来实现这一目标,以及相关的编程概念和示例。 首先,理解.NET Framework是Microsoft开发的用于构建、部署和运行应用程序的平台,而DB2则是IBM...

    DB2使用手册

    * DB2 支持多种编程语言,包括 SQL、Java、Python 等。 二、DB2 安装和配置 * 安装 DB2 需要满足一定的硬件和软件要求。 * DB2 安装完成后,需要进行配置,包括设置数据库实例、配置连接参数等。 三、DB2 使用 *...

    十大DB2优化技巧

    【DB2优化技巧详解】 DB2数据库管理系统是IBM公司的一款高效、可靠的企业级数据库解决方案,广泛应用于各种在线交易处理(OLTP)和电子商务系统。针对DB2的性能优化至关重要,以下是一些关键的优化技巧,旨在提升DB2...

    关于DB2的实用技巧

    DB2是一款由IBM开发的关系型数据库管理系统,广泛应用于企业级数据存储和管理。掌握DB2的实用技巧对于数据库管理员和开发人员来说至关重要。本篇将深入探讨DB2的一些关键特性和实用技巧,帮助你更高效地操作和管理...

Global site tag (gtag.js) - Google Analytics