Sybase脚本移植到DB2中

?

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),但是默认的注释方式是在行首加 # 号,这样,我们可以使用 # 号对无用行进行注释之后,在最后进行全局替换为 —- 来减少手动加注释的工作量。

更进一步,有时候有些代码的缩进不是很规范,可以在该缩进的地方通过注释快捷键添加两个#号。然后将两个 ## 全局替换为四个空格,这样就迅速的实现了缩进操作。?

?

时间: 2024-10-17 15:31:23

Sybase脚本移植到DB2中的相关文章

db2脚本执行出现db2 command notfound

当执行数据库操作脚本时出现db2 command notfound 解决办法: 在脚本中添加下面一行 export PATH=$PATH:/opt/ibm/db2/V10.5/bin 当然,这个需要根据数据库版本不同做修改

DB2中常用SQL语句

DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化.既易学又易懂的语法.此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml).sql原来拼成sequel,这语言的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统r 的技术基础发展出来 ibm 的产品.而且美国国家标准学会(ansi)

FineUI之使用SQL脚本从数据库表中生成相应的输入控件

在WEB开发时,经常需要依据数据库表中的字段建立相应的输入控件,来获取输入的数据.每次都需要按字段来敲,显然太低效,而且容易出错.这里提供一个SQL脚本生成相应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="server

DB2中如何将非自动存储转换成自动存储空间管理方式

DB2 10引入根据温度管理数据存储的表空间更管理方式,但是需要数据库启用自动存储管理,具体在存储路径在某个目录下即可,要讲非自动存储的表空间转换成自动存储的管理方式需要两个步骤,尤其是从低版本升级过来的数据库. ALTER DATABASE EMPLOYEE ADD STORAGE ON '/data' 这样即可,但是对于原来使用DMS或SMS方式管理的表空间需要做重定向恢复,其实就是先做全备份,然后指定redirect restore即可,在原来的实例下恢复: RESTORE DATABAS

Unity脚本在层级面板中的执行顺序测试4-附加内容

测试4为一些附加内容,后面的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html Unity脚本在层级面板中的执行顺序测试2 http://www.cnblogs.com/hont/p/5034419.html Unity脚本在层级面板中的执行顺序测试3 http://www.cnblogs.com/hont/p/5179427.html 1.基本执行顺序 Awake OnEn

DB2中循环日期跑数据

1.数据库版本: 2.具体实现方式: CREATE OR REPLACE PROCEDURE DB2USER.RUN_PROCEDURE_BY_LOOP(IN begin_date VARCHAR(8),IN end_date VARCHAR(8)) /****************************************************************************** NAME: PURPOSE: REVISIONS: Ver Date Author De

shell脚本练习题(更新中...)

练习题(这里贴的是自己写的代码, 网上给的题目代码我会附加在最下面) 1. 编写shell脚本,计算1-100的和: 1 #!/bin/bash 2 #caculate the sum of numbers from 1 to 100 3 4 sum=0 5 for i in `seq 1 100`; do 6 sum=$[$sum+$i] 7 done 8 echo $sum 2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到

DB2中的is null与=‘’

在DB2中,null和''是完全不同的两个东西. NULL是一个不确定值它不能通过列值过滤,只能通过IS NULL 或者IS NOT NULL方式过滤 而''可以用in,=,<>,>,<来比较判断. 此外,若一个属性的值为null,则select显示时,会以-代替,而''则直接什么都不显示

DB2 中日期 比较

在DB2中的Date 一共识别三种格式,最常见的是这样 '2013-12-12' 对,你没看错,DB2认为这样的字符串就是Date数据 然后我们可以利用函数这样寻找日期区间 select * from users where g_time between '2003-05-04 ' and '2003-05-08' 也可以利用操作符来进行常规的日期大小比较 select * from users where g_time >= '2003-05-04 ' 这篇文档更加详细http://www.c