目前碰到一个任务,需要将原本基于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 -td@ -vf sp_EXPLTTel.sql but —-进入db2控制台 select * from syscat.procedures where procname = ‘sp_EXPLTTel’ IDE UltraEdit
修改过程是一个比较辛苦的体力活。一些简单语法规则的不断重复改写,如何才能提高效率。 首先是利用UltraEdit的全局替换功能,寻找一些可以全局替换的元素做统一替换