首页  编辑  

Sybase向Oracle迁移注意事项

Tags: /超级猛料/Database.数据库相关/   Date Created:
迁移Sybase到Oracle中,要特别小心的一些东西。

操作符(e.g., (+))

操作符: Sybase “*=” 和Oracle (+)
Select hosp_cde, hosp_name from hospital_codes a, web_hosp_server_mapping b
Where a.hosp_cde *= b.hosp_cde

Select hosp_cde, hosp_name from hospital_codes a, web_hosp_server_mapping b
Where a.hosp_cde = b.hosp_cde(+)

Select hosp_cde, hosp_name 
from hospital_codes a
left join web_hosp_server_mapping b on a.hosp_cde = b.hosp_cde
注意下划线的部分!

临时表: Oracle GTT、PTT

Create global temporary table test_table_1(
	…..
)
全局临时表,  跟普通表一样需要先有表结构
Create private temporary table test_table_1(
	…..
)
v_sql := ‘update testexecute immediate v_sql using ‘zhangsan’, 1;
_table_1 set name = :name where id= :id’;
针对临时表的所有操作必须都用字符串拼接的方式

字符串

Sybase中,Char固定长度,如hospital_cde char(3),Value小于3会在右边加空格填充,如下:

通过执行结果我们可以看到,value后面有1个空格,长度是3
Oracle中,

需要留意varchar2(2 char)    varchar2(2 byte)

主要差别表现为value为中文时

如字符集为GBK时,一个中文占2个字节,为UTF8占3个

varchar2(2 byte)能存1个中文字符

varchar2(2 char)能存2个中文字符
empty string & null,In Sybase,在下面的图中我们可以看到空字符串和null不同:

In Oracle,在下面的图中我们可以看到oracle不存在空字符串,空字符串会被强制转为null (无论是sp或是table中存的数据)

如果value超过长度,Sybase会自动截断,丢弃超出部份 (insert/update都会做同样处理)

在Oracle和我们预期的一致,超出长度会throw error

Sybase条件判断中的null, 在下面的code可以看到,和我们以前接触的其他语言一致

在下面的code可以看到,在oracle中只要有一个为null,不管是<>还是=得到的永远是false

我们要得到期望的结果,code可以改成这样

Sybase中,下面的sql没有order by,但实际上它会按username ASC排序

在Oracle中改成下面这样才能得到和Sybase相同的value

在fc_mas_user中有很多数据,下面的sql能查到多个值,sybase取最后一个

下面的sp可以得到最后一个value “XZY”



上面的sql没查询到记录不会出错


oracle如果直接按sybase的方式会throw error

在Oracle中改成下面这样才能得到和Sybase相同的value

Exception when no_data_found then xxx必须和begin end一起使用,最终等价的Oracle代码: