- 浏览: 658628 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (609)
- java (139)
- 数据库 (107)
- 微信 (23)
- IT生活 (5)
- web前端 (74)
- SSH (11)
- 设计模式 (12)
- 重要资料 (11)
- 其他 (15)
- java技巧 (23)
- 服务器 (9)
- 2D/GUI (3)
- JAVA3D (2)
- ANT (5)
- Apache项目 (19)
- 数据类型 (10)
- 报表 (3)
- Collections (6)
- SQL/JDBC (15)
- 开发类 (6)
- EJB (6)
- Email (6)
- 文件读写 (2)
- 游戏 (0)
- Flex (2)
- Generic (2)
- HIbernate (12)
- I18N (5)
- Java EE (9)
- java ME (4)
- JDK 6 (8)
- JNDI/LDAP (5)
- JSP (7)
- JSTL (2)
- 正则表达式 (2)
- 安全 (2)
- Struts2 (12)
- Spring (4)
- Web服务 (10)
- Xml (1)
- JavaScript (30)
- AJAX (7)
- 验证 (4)
- 上传下载 (1)
- office办公软件 (1)
- Android (2)
- IOS (0)
- Dubbo (3)
- memcached/redis (1)
- 小程序 (1)
- 微信公众号 (0)
最新评论
-
wf_wangfeng:
怎么我用第一种方法不行呢 alert(document.rea ...
当jsp页面完全加载完成后执行一个js函数 -
Lori_Liu:
有帮助,至少可以解决了目前所遇到的问题!谢谢..
当jsp页面完全加载完成后执行一个js函数 -
starbhhc:
String actionMessage = new Stri ...
Java读取txt文件乱码 -
starbhhc:
Sev7en_jun 写道GOOD
客气,互相交流。。
javaeye论坛规则小测验(答案)--star -
Sev7en_jun:
GOOD
javaeye论坛规则小测验(答案)--star
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。
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。
发表评论
-
mysql创建用户并授权
2016-09-04 23:42 6141.新建用户。 //登录MYSQL mysql -u ... -
java实现文件转换成二进制存储与取出
2016-08-06 01:21 2746一、功能描述: 将文件转成二进制数据放入数据库中,需要的 ... -
Mongodb的全面总结
2016-07-14 16:35 1402MongoDB的官方文档基本是how to do的介绍,而关 ... -
Navicat连接Oracle数据库时报错ORA-28547
2016-07-12 15:46 707用Navicat连接Oracle数据库时出现如下错误提示: ... -
4.ubuntu14.04 安装mongodb笔记
2016-05-06 08:52 6741、使用系统自动获取安装。 1)获取更新 s ... -
3.mongdb mongdb的shell命令
2016-04-14 11:10 1000在mongdb的安装目录,运行mongo.exe,运 ... -
2.mongdb mongdb客户端使用
2016-04-14 10:26 792robomongo,命令行方便 ... -
1. WIN7下安装运行mongodb
2016-04-14 10:11 5401)、下载MongoDBhttp://downloads. ... -
mysql 与mongodb的特点与优劣
2016-04-13 17:37 982介绍: MongoDB是 ... -
报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用l
2015-07-06 13:16 826报错:1130-host ... is not allow ... -
sql查询今天、昨天、本周、本月、日期的
2015-05-15 10:55 1792sql 求解两个时间差 SELECTDATEDIFF ... -
druid demo
2015-04-08 15:13 1616java程序很大一部分要操作数据库,为了提高性能操作数据库的 ... -
Druid数据库连接池使用
2015-04-08 15:03 728阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的D ... -
Hibernate与 MyBatis的比较
2015-03-20 00:34 640mybatis是半自动的,hibernate是全自动的,就是 ... -
经典SQL语句大全
2015-01-16 01:02 564一、基础 1、说明:创建数据库CREATE DATABAS ... -
MyBatis的几种批量操作
2015-01-11 22:59 1693MyBatis中批量插入 方法一: &l ... -
spring与mybatis三种整合方法
2015-01-11 22:58 489本文主要介绍Spring与Mybatis三种常用整合方法, ... -
MyBatis(六)、MyBatis主配置文件
2015-01-11 22:58 693在定义sqlSessionFactory时需要指定MyBa ... -
MyBatis(五)、动态SQL语句
2015-01-09 01:01 739有些时候,sql语句where条件中,需要一些安全判断,例 ... -
MyBatis(四)、SQL语句映射文件(2)增删改查、参数、缓存
2015-01-09 01:00 5262.2 select 一个select 元素非常简单。例如 ...
相关推荐
DB2编程基础要点主要涉及SQL语句的使用和存储过程的创建。在DB2数据库管理系统中,编程工作是一项核心任务,对于数据的增删改查和处理流程的自动化至关重要。 首先,创建存储过程时,必须注意语法的严谨性。在使用`...
博文链接:https://cowpoke.iteye.com/blog/208322
这篇教程将全面介绍DB2的学习要点,帮助你深入了解和掌握这款强大的数据库系统。 1. **DB2简介** - DB2是IBM公司推出的一种高性能、安全且可扩展的数据库解决方案,支持SQL标准,并具有强大的事务处理能力。 - 它...
- **准备与安装**: 安装DB2 UDB并进行基础配置。 - **数据库结构迁移**: 将MySQL数据库结构转换为DB2 UDB格式。 - **数据迁移**: 将MySQL中的数据迁移到新的DB2 UDB环境中。 - **应用程序迁移**: 修改应用程序代码,...
- **编程接口**:列举了DB2支持的各种编程接口,并对其进行了简要说明。 - JDBC接口的使用方法。 - ODBC接口的配置步骤。 - .NET和Java开发环境下的连接示例。 ##### 18. DB2 for SAP - **SAP集成**:介绍了DB2...
- **应用开发章节概述**:本书从第一章和第二章开始介绍了DB2应用开发的基础概念和技术要点,这些章节直接来源于《Getting Started with DB2 Express-C》这本书的应用开发部分。通过这两个章节的学习,读者可以对DB2...
### Android编程基础知识解析 #### 一、Android Activity 生命周期管理 - **题目背景**: 在 Android 应用开发中,Activity 的生命周期管理非常重要。开发者需要了解不同生命周期回调方法的作用,以便正确地处理 ...
3. **SQL兼容性**:DB2支持标准的SQL语言,并提供了与多种编程语言的良好集成能力,便于开发人员进行数据库应用程序的开发。 4. **大数据支持**:DB2具有出色的大数据处理能力,能够高效地管理和分析大规模数据集,...
《ABAP4编程宝典中文版(完整版)》是一部全面覆盖ABAP4编程语言的权威指南,专为新老ABAP4程序员设计,旨在提供从基础语言组件到复杂报表与事务编码的全方位指导。本书不仅适用于初学者快速掌握ABAP4的核心概念和...
- **知识点**:数据分析工具的使用、统计分析基础知识、编程语言基础。 3. **数据库与SQL技能** - **资格要求**:熟悉SQL语句,掌握至少一种关系型数据库(如MySQL、Oracle、DB2、SQL Server等)。 - **知识点**...
根据提供的文件信息,我们可以推断出这是一份与Java编程相关的笔试题目集合,主要涉及到数据库查询、Servlet的应用、JSP的使用以及Struts框架的基本操作等知识点。下面将对这些知识点进行详细的阐述。 ### 数据库...
以上内容仅涵盖了CICS开发和调试的一些基础要点,实际操作中还需要对主机操作系统、DB2数据库以及网络通信有深入理解。通过学习《CICS User's Handbook》、《CICS联机程序开发与调试》和《CICS教程》这些资料,你...
4:java基础编程掌握程度:熟练。原因:不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包 java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;等。 ...
综上所述,这份笔记详细涵盖了MySQL数据库的基础知识、操作技巧、数据库设计要点以及编程实践等方面的知识。通过对这些知识点的学习和掌握,可以帮助用户更好地理解和使用MySQL,进行高效的数据库开发和管理。