DB2使用经验备忘(增量更新)

发表于:2007-06-07来源:作者:点击数: 标签:
DB2使用经验备忘(增量更新) 1.安装DB2后可以通过命令窗口这样的命令行方式或控制中心这样的图形界面方式来操作, 而如果你的 数据库 服务端不在本机,则还需要在“客户机配置辅助程序”中做一个客户端 连接的配置。 2.控制中心中无法增删改数据,只能编写 sql
DB2使用经验备忘(增量更新)

1.安装DB2后可以通过命令窗口这样的命令行方式或控制中心这样的图形界面方式来操作,
而如果你的数据库服务端不在本机,则还需要在“客户机配置辅助程序”中做一个客户端
连接的配置。

2.控制中心中无法增删改数据,只能编写sql语句来实现
而quest提供的工具虽然能增加数据,但居然无法用复制、粘贴和Tab键,必须逐个输入,
然后用鼠标点击切换
现存数据看来可以在单元格中编辑修改,但实际却无法commit,呵呵,还是老老实实写up
date语句
至于删除数据,更是非写delete语句不可
不过可以用pb以单元格方式编辑数据,相应的一个缺点是编辑数据的按钮和删除表的按钮
太近,万一点错了删除表的按钮,pb可是不作提示就把表给删了的,faint

3.DB2的视图里不能直接用order by语句,必须这样写 select × from(select a,b,c
from table1 order by a)as tab
这种写法的前提是你已经打过补丁了

4.存储过程的问题:
DB2提供ltrim函数和rtrim函数,但偏偏不提供trim函数,如果你希望去除字符两端的空格
,对不起,必须用ltrim(rtrim()) 的方式调用

insert 语句里面居然不能用表达式赋值,必须把值先赋给一个变量

调用其他存储过程时竟然不能用常量做参数,必须把这个常量的值赋给一个变量,再以这
个变量为参数

select * from table fetch first n rows only 语句居然在存储过程里不可用

5.存储过程里可以使用动态sql,但函数里却不可以使用,kao

6.
遇到commit或rollback时自动关闭游标,所以需要慎重使用单独提交。
proc builder老是在调试中内存不足,屏幕花掉。而如果断点调试时暂停不进行下去的时间稍微长一点就会提示超时,受不了。

7.开发中遇到的一个问题
在使用 日期变量+1 MONTHS OR 日期变量-1 MONTHS
的方式取日期时,比如日期变量值为 2004-02-29
时,存储过程里将日期变量+1 MONTHS 赋值给另一
日期变量时会出错。相应SQLSTATE为01506(db2 ? 01506)
: 对 DATE 或TIMESTAMP值进行了调整,以校正算术运算得出的无效日期。
如果要获取的只是下一月份,可采用的替代方法是获取当前日期所在月份的第一天作为基准后+1 MONTHS OR -1 MONTHS


8.哈哈,今天帮别人弄存储过程的经验@04.08.05

搞了半天搞不定,一查原来的文档才了,原来tmd该死的DB2的存储过程,是转换为C后,进行编译的。因此在数据库服务器上要安装一个C编译器才能 完成存储过程的编译。并且需要使用DB2SET命令,设置DB2_SQLROUTINE_COMPILER_PATH指向C编译器的安装路径。如: db2set
DB2_SQLROUTINE_COMPILER_PATH=E:\ProgramFiles\MicrosoftVisualStudio\VC98\Bin\vcvars32.bat

9.对变量的赋值不能用select ..into ..方式而要用set v=(select ..)的方式,代码示例如下。

drop function SXFM.ISORDERSUBMITDATE;
CREATE FUNCTION SXFM.ISORDERSUBMITDATE(IN_ROW_ID DECIMAL(16,0))
RETURNS DATE
LANGUAGE SQL
BEGIN ATOMIC
DECLARE V_SUBMIT_DATE DATE;
DECLARE V_SELL_ID DECIMAL(16, 0);
DECLARE V_BUY_ID DECIMAL(16, 0);

set V_SELL_ID = (SELECT COALESCE(RECEIVE_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);
set V_BUY_ID = (SELECT COALESCE(PAY_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);
set V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE)) FROM AM_AUDIT_QUEUE A,SM_USER B,SM_USER C
WHERE A.TABLE_CODE='IS_ORDER' AND A.TABLE_ROW_ID=IN_ROW_ID
AND A.AUDIT_EMP_ID=C.ROW_ID AND C.BRANCH_ID=V_BUY_ID --审核方为付款方
AND A.SUBMIT_EMP_ID=B.ROW_ID AND B.BRANCH_ID=V_SELL_ID); --提交方为收款方

RETURN V_SUBMIT_DATE;
END;
#SYNC 10;

补充几个和Oracle的语法差异,懒得登录维护



1.左外连接

把左表中在内连接中不存在的行包含进来



ORACLE:SELECT * FROM TABLE_LEFT C,TABLE_RIGHT B WHERE

C.RID=B.RID(+)

DB2:SELECT **** FROM TABLE_LEFT C LEFT OUTER JOIN TABLE_RINGHT B ON C.RID=B.RID



2.

Oracle: nvl(var,constvalue)---DB2: coalesce(var,constvalue)

Oracle: decode(col,value1,constvalue1,constvalue2)---DB2: case col when '' then 'N' else 'Y' end

3.

*删除sequence

DB2 is DROP SEQUENCE <sequence name> RESTRICT

4.

*insert 语句中不能用表达式赋值

*调用存储过程时不能用常量做参数

5.

Oracle:select rownum from cd_branch

DB2:select row_number() over() from cd_branch

6.

取前K条记录

SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,

ROW_NUMBER() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY

FROM EMPLOYEE

FETCH FIRST K ROWS ONLY;



7.总体看来,DB2的sql比较严格而规范,是标准sql,在Oracle中很多都能用。而Oracle的比较简单灵活,但很多在DB2里的实现要复杂一些
11.DB2的游标打开后遇到commit和rollback默认是会关闭的。保持游标打开的方法是在定义游标时加上with hold选项
12.
F:导出某张表的数据,且该表包含long varchar型数据,该如何操作
Q:
Export:
db2 connect to [dbname] user [user] using [password]
db2move [dbname] export -tn [tablename] -u [user] -p[password] (单表)
db2move [dbname] export -tn [tablename1,tablename2,...] -u [user] -p [password] (多表)

Import:
db2move [dbname] import

原文转自:http://www.ltesting.net