`
starbhhc
  • 浏览: 658628 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

DB2编程基础要点

阅读更多
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写见sqllibsamplescliudfsrv.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。

分享到:
评论

相关推荐

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

    DB2编程基础要点主要涉及SQL语句的使用和存储过程的创建。在DB2数据库管理系统中,编程工作是一项核心任务,对于数据的增删改查和处理流程的自动化至关重要。 首先,创建存储过程时,必须注意语法的严谨性。在使用`...

    转-DB2编程基础要点

    博文链接:https://cowpoke.iteye.com/blog/208322

    DB2 学习教程全面整理打包

    这篇教程将全面介绍DB2的学习要点,帮助你深入了解和掌握这款强大的数据库系统。 1. **DB2简介** - DB2是IBM公司推出的一种高性能、安全且可扩展的数据库解决方案,支持SQL标准,并具有强大的事务处理能力。 - 它...

    MySQL to DB2 UDB Conversion Guide

    - **准备与安装**: 安装DB2 UDB并进行基础配置。 - **数据库结构迁移**: 将MySQL数据库结构转换为DB2 UDB格式。 - **数据迁移**: 将MySQL中的数据迁移到新的DB2 UDB环境中。 - **应用程序迁移**: 修改应用程序代码,...

    IBM DB2 认证教程

    - **编程接口**:列举了DB2支持的各种编程接口,并对其进行了简要说明。 - JDBC接口的使用方法。 - ODBC接口的配置步骤。 - .NET和Java开发环境下的连接示例。 ##### 18. DB2 for SAP - **SAP集成**:介绍了DB2...

    DB2 getting started

    - **应用开发章节概述**:本书从第一章和第二章开始介绍了DB2应用开发的基础概念和技术要点,这些章节直接来源于《Getting Started with DB2 Express-C》这本书的应用开发部分。通过这两个章节的学习,读者可以对DB2...

    Android编程基础笔试题及答案20.docx

    ### Android编程基础知识解析 #### 一、Android Activity 生命周期管理 - **题目背景**: 在 Android 应用开发中,Activity 的生命周期管理非常重要。开发者需要了解不同生命周期回调方法的作用,以便正确地处理 ...

    DBA最有用的数据库系统原理知识 Oracle MySql DB2

    3. **SQL兼容性**:DB2支持标准的SQL语言,并提供了与多种编程语言的良好集成能力,便于开发人员进行数据库应用程序的开发。 4. **大数据支持**:DB2具有出色的大数据处理能力,能够高效地管理和分析大规模数据集,...

    ABAP4编程宝典中文版(完整版)

    《ABAP4编程宝典中文版(完整版)》是一部全面覆盖ABAP4编程语言的权威指南,专为新老ABAP4程序员设计,旨在提供从基础语言组件到复杂报表与事务编码的全方位指导。本书不仅适用于初学者快速掌握ABAP4的核心概念和...

    高级数据分析师的工作职责文本.docx

    - **知识点**:数据分析工具的使用、统计分析基础知识、编程语言基础。 3. **数据库与SQL技能** - **资格要求**:熟悉SQL语句,掌握至少一种关系型数据库(如MySQL、Oracle、DB2、SQL Server等)。 - **知识点**...

    金讯java笔试题目

    根据提供的文件信息,我们可以推断出这是一份与Java编程相关的笔试题目集合,主要涉及到数据库查询、Servlet的应用、JSP的使用以及Struts框架的基本操作等知识点。下面将对这些知识点进行详细的阐述。 ### 数据库...

    CICS联机程序开发与调试

    以上内容仅涵盖了CICS开发和调试的一些基础要点,实际操作中还需要对主机操作系统、DB2数据库以及网络通信有深入理解。通过学习《CICS User's Handbook》、《CICS联机程序开发与调试》和《CICS教程》这些资料,你...

    JSP程序员成长手册

    4:java基础编程掌握程度:熟练。原因:不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包 java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;等。 ...

    超详细的MySQL学习笔记

    综上所述,这份笔记详细涵盖了MySQL数据库的基础知识、操作技巧、数据库设计要点以及编程实践等方面的知识。通过对这些知识点的学习和掌握,可以帮助用户更好地理解和使用MySQL,进行高效的数据库开发和管理。

Global site tag (gtag.js) - Google Analytics