?
DB2
目前碰到一个任务,需要将原本基于Sybase的系统移植到DB2。前期工作中主要都是对SQL脚本的改写。鉴于目前对Sybase和DB2都不是很熟,所以开此记录日志。记录在过程中所遇到的各种问题。
db2中的系统表介绍
DB2 Command Line Processor(DB2 CLP)是所有 DB2 产品中都有的,可以使用这个应用程序运行 DB2 命令、操作系统命令或 SQL 语句。
在 DB2 数据库被创建的时候,DB2 会创建一些系统表。这些系统表中记录了所有数据库对象的信息,表或视图的列的数据类型,约束的定义,对象的权限和对象之间的依赖关系等。这些系统表的模式为 SYSIBM,其表名以 SYS 作为前缀。例如: SYSTABLES、SYSVIEWS 等等。
DB2 为这些系统表建立了相对应的只读视图。这些视图的模式是 SYSCAT,它们的内容是其相对应的系统表的全部或者部分内容。这些视图的名字没有 SYS 的前缀。例如:SYSCAT.TABLES (是 SYSIBM.SYSTABLES 的视图。
我们可以通过 LIST TABLES FOR SYSTEM 或 LIST TABLES FOR SCHEMA schemaname 命令查看所有的系统表和相关的视图信息。下面我们会介绍一些本文用到的系统表和视图。
移植建表操作:
不需要改动的地方:
- CHAR(30)
- Varchar(30)
- 简单SQL语句本身, select, create table, grant等等
需要修改的地方:
- INT 改为: INTEGER
- GO 改为: 封号 ;
- CLUSTER NONCLUSTER 修改: 直接删除
- tinyINTEGER tinyInt 修改: SMALLINT
- smallInteger 修改: SMALLINT
- exec 修改: 直接删除
- Timestamp 修改: TIMESTAMP(10, 6)
- varchar(30) char(30) 修改: 不用修改
- money 修改: NUMERIC(19, 4)
- print 修改: echo
- image 修改: BLOB(1073741824)
- TEXT 修改: CLOB(2147483647)
执行命令为
db2 -stvf tab.sql
原先的Sybase SQL脚本文件如下:
存储过程
db2在创建或者更新存储过程的过程中,需要使用特殊的结束字符 @ 。
connect to oibsdb @? —- 连接到数据库 drop procedure sp_EXPLTTel @???? —-? 删除一个存储过程 create procedure sp_EXPLTTel (??? —- 创建存储过程 ??? IN I_deal_no??????????? char(15),??? —- ??? IN I_goods_services???? varchar(6500), ??? INI_document_required?? varchar(6500), ??? IN I_add_conditions???? varchar(6500) ) LANGUAGE SQL??? —- BEGIN ??? DECLARE v_Debug???? CHAR(1)????? default ‘0’ ; ??? DECLARE s_rtcd????? INTEGER????? DEFAULT 0; ??? DECLARE s_rtst????? CHAR(5)????? DEFAULT ‘00000’ ; ??? DECLARE s_text????? VARCHAR(500) ; END
db2脚本执行命令:
db2 [email protected] -vf sp_EXPLTTel.sql but????? —-进入db2控制台 select * from syscat.procedures where procname = ‘sp_EXPLTTel’
IDE UltraEdit
修改过程是一个比较辛苦的体力活。一些简单语法规则的不断重复改写,如何才能提高效率。 首先是利用UltraEdit的全局替换功能,寻找一些可以全局替换的元素做统一替换
- print 替换为 echo
- go 替换为 封号 ;
- Sybase中原有C风格的注释进行全局替换 /*进行替换
- int 替换为INTEGER, tinyInteger, tinyInt 替换为SMALLINT
DB2的SQL脚本中所支持的注释方式只有单行注释—-。UltraEdit中有类似eclipse中的多行快捷键注释功能(可以类似于eclipse中一样设置为快捷键Ctrl+Shift+C),但是默认的注释方式是在行首加 # 号,这样,我们可以使用 # 号对无用行进行注释之后,在最后进行全局替换为 —- 来减少手动加注释的工作量。
更进一步,有时候有些代码的缩进不是很规范,可以在该缩进的地方通过注释快捷键添加两个#号。然后将两个 ## 全局替换为四个空格,这样就迅速的实现了缩进操作。?
?