DB2编程1文档格式.docx
- 文档编号:19168895
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:13
- 大小:25.40KB
DB2编程1文档格式.docx
《DB2编程1文档格式.docx》由会员分享,可在线阅读,更多相关《DB2编程1文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
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管理DBINSTANCE的参数18
4.15升级后消除版本问题18
4.16查看数据库表的死锁18
1.1建存储过程时Create
后一定不要用TAB键
createprocedure
的create后只能用空格,而不可用tab健,否则编译会通不过。
切记,切记。
1.2使用临时表
要注意,临时表只能建在user
tempory
tables
space
上,如果database只有system
table
space是不能建临时表的。
另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。
所以,如果程序有多线程,最好不要用临时表,很难控制。
建临时表时最好加上
with
replace选项,这样就可以不显示的drop
临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
1.3从数据表中取指定前几条记录
select
*
from
tb_market_code
fetch
first
1
rows
only
但下面这种方式不允许
market_code
into
v_market_code
only;
选第一条记录的字段到一个变量以以下方式代替
declare
char
(1);
cursor1
cursor
for
only
update;
open
cursor1;
v_market_code;
close
1.4游标的使用
注意commit和rollback
使用游标时要特别注意如果没有加with
hold
选项,在Commit和Rollback时,该游标将被关闭。
Commit
和Rollback有很多东西要注意。
特别小心
游标的两种定义方式
一种为
continue
handler
not
found
begin
set
v_notfound
=
1;
end;
for
v_notfound=0;
while
v_notfound=0
Do
--work
end
while;
这种方式使用起来比较复杂,但也比较灵活。
特别是可以使用with
选项。
如果循环内有commit或rollback
而要保持该cursor不被关闭,只能使用这种方式。
另一种为
pcursor1:
loopcs1
as
cousor1
as
market_code
tb_market_code
update
do
for;
这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。
但不能使用with
如果在游标循环内要使用commit,rollback则不能使用这种方式。
如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。
修改游标的当前记录的方法
update
market_code='
0'
where
current
of
不过要注意将cursor1定义为可修改的游标
不能和GROUP
BY、
DISTINCT、
ORDER
FOR
READ
ONLY及UNION,
EXCEPT,
or
INTERSECT但
UNION
ALL除外)一起使用。
1.5类似decode的转码操作
oracle中有一个函数
decode(a1,'
1'
'
n1'
2'
n2'
n3'
)
aa1
from
db2没有该函数,但可以用变通的方法
case
a1
when
'
then
else
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取得处理的记录数
v_count
int;
updatetb_testsett1=’0’
wheret2=’2’;
--检查修改的行数,判断指定的记录是否存在
get
diagnosticsv_
count=ROW_COUNT;
只对update,insert,delete起作用.
不对select
有效
1.12从存储过程返回结果集(游标)的用法
1、建一sp返回结果集
PROCEDURE
DB2INST1.Proc1
(
)
LANGUAGE
SQL
result
sets
2(返回两个结果集)
------------------------------------------------------------------------
--
SQL
存储过程
P1:
BEGIN
c1
return
to
caller
tb_market_code;
--指定该结果集用于返回给调用者
c2
c1;
c2;
END
P1
2、建一SP调该sp且使用它的结果集
DB2INST1.Proc2
(
out
out_market_code
char
(1))
loc1,loc2
result_set_locator
varying;
--建立一个结果集数组
call
proc1;
--调用该SP返回结果集。
associate
locator(loc1,loc2)
procedure
--将返回结果集和结果集数组关联
allocate
loc1;
cursor2
loc2;
--将结果集数组分配给cursor
out_market_code;
--直接从结果集中赋值
P1
3、动态SQL写法
DECLARE
CURSOR
C1
STMT1;
PREPARE
STMT1
FROM
ALLOCATE
C2
RESULT
SET
?
;
4、注意:
一、如果一个sp调用好几次,只能取到最近一次调用的结果集。
二、allocate的cursor不能再次open,但可以close,是close
sp中的对应cursor。
1.13类型转换函数
cast
time
char(8))
1.14存储过程的互相调用
目前,c
sp可以互相调用。
Sql
sp
可以互相调用,
可以调用C
sp,
但C
不可以调用Sql
sp(最新的说法是可以)
1.15C存储过程参数注意
create
pr_clear_task_ctrl(
IN
IN_BRANCH_CODE
char(4),
IN_TRADEDATE
char(8),
IN
IN_TASK_ID
char
(2),
IN_SUB_TASK_ID
OUT
OUT_SUCCESS_FLAG
INTEGER
DYNAMIC
SETS
0
C
PARAMETER
STYLE
GENERAL
NULLS(如果不是这样,sql
的sp将不能调用该用c写的存储过程,产生保护性错误)
NO
DBINFO
FENCED
MODIFIES
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
DEFAULT
0,
在CALL
SPNAME之后,
1,
CONTINUE
HANDLER
SQLWARNING
IF
<
>
THEN
--警告处理,插入日志
0;
IF;
END;
1.18import用法
db2
import
gh1.out
DEL
messages
err.txt
insert
db2inst1.tb_dbf_match_ha
注意要加schma
1.19values的使用
如果有多个
语句给变量付值,最好使用values语句,改写为一句。
这样可以提高效率。
但要注意,values不能将null值付给一个变量。
values(null)
out_return_code;
这个语句会报错的。
1.20给select
语句指定隔离级别
tb_head_stock_balance
ur
1.21atomic及not
atomic区别
atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。
2
DB2编程性能注意
2.1大数据的导表
应该是export后再load性能更好,因为load不写日志。
比select
要好。
2.2SQL语句尽量写复杂SQL
尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。
DB2的SQL
Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。
Oracle
则相反,推荐将复杂的语句简单化,SQL
Engieer的优化能力不是特别好。
这是因为每一个SQL语句都会有reset
SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。
一个总的思想就是尽量减少SQL语句的个数。
SP的选择
首先,C的sp的性能比sql
的sp
的要高。
一般而言,SQL语句比较复杂,而逻辑比较简单,sql
与
c
的性能差异会比较小,这样从工作量考虑,用SQL写比较好。
而如果逻辑比较复杂,SQL比较简单,用c写比较好。
2.4查询的优化(HASH及RR_TO_RS)
db2set
DB2_HASH_JOIN=Y(HASH排序优化)
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下
72秒。
DB2_RR_TO_RS=Y
该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
这样,db2不用管理Next
key,可以少管理一些东西,这样可以提高性能。
2.5避免使用count(*)
及exists的方法
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。
如果做这两中操作的目的是为
服务的话,就可以省略掉这两步。
直接使用select
选择记录中的字段。
如果是没有记录选择到的话,db2
会将
sqlcode=100
和
sqlstate=’20000’
如果是有多条记录的话,db2会产生一个错误。
程序可以创建
exception
来检测。
这是最快速的方法。
3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。
这个速度也比count(*)
要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。
3DB2表及sp管理
3.1看存储过程文本
text
syscat.procedures
procname='
PROC1'
3.2看表结构
describe
syscat.procedures
3.3查看各表对sp的影响(被哪些sp使用)
PROCNAME
SYSCAT.PROCEDURES
SPECIFICNAME
in(select
dname
sysibm.sysdependencies
bname
in
PKGNAME
syscat.packagedep
bname='
TB_BRANCH'
))
3.4查看sp使用了哪些表
btype='
T'
and
pkgname
(select
specificname
PR_CLEAR_MATCH_DIVIDE_SHA'
))
3.5查看function被哪些sp使用
SYSCAT.functions
funcname='
GET_CURRENT_DATE'
)))
使用function时要注意,如果想drop
掉该function必须要先将调用该function的其它存储过程全部drop掉。
必须先创建function,调用该functio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DB2 编程