Oracle到mysql转换的问题总结要点Word下载.docx
- 文档编号:6819351
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:52
- 大小:45.30KB
Oracle到mysql转换的问题总结要点Word下载.docx
《Oracle到mysql转换的问题总结要点Word下载.docx》由会员分享,可在线阅读,更多相关《Oracle到mysql转换的问题总结要点Word下载.docx(52页珍藏版)》请在冰点文库上搜索。
%Y-%m-%d%H:
%i:
%s'
)
注意时间格式的对应
to_date(str,’yyyy-MM-ddhh24:
str_to_date(str,'
注意时间格式
%Y-%m-%d%T'
to_char()、to_number()
convert(字段名,类型)
类型转换
date+n
date_add(date,intervalnday)
日期增加n天
selectdate_add(sysdate(),INTERVAL2DAY);
add_months(date,n)
date_add(date,intervalnmonth)
日期增加n个月
selectdate_add(sysdate(),INTERVAL2MONTH);
date1-date2
datediff(date1,date2)
日期相减获取天数
2.oracle中decode()函数,可以用casewhen进行替换
例子:
Oracle:
selectdecode(a,b,c,d)ascol1fromtable1;
Mysql:
select
case
whena=bthenc
whena!
=bthend
endascol1
fromtable1
3.oracle的函数ROW_NUMBER()OVER(PARTITIONBYcol1ORDERBYcol2),根据col1分组,在分组内根据col2排序,改函数计算的值就表示每组内部排序后的顺序编号。
Mysql没有这个函数,可以用mysql的用户变量来实现
selectrow_number()over(partitionbycol1orderbycol2)asnumfromtable1
selectnum1asnumfrom(selectif(@pdept=col1,@rank:
=@rank+1,@rank:
=1)asnum1,@pdept:
=col1fromtable1orderbycol2)H
这里用到mysql的用户变量。
4.oracle的行号ROWNUM,mysql没有这个行号,也需要用用户变量来实现。
select*fromtable1whererownum-col1=0
Mysql:
select*fromtable1,(SELECT(@rowNum:
=0))HHwhere(@rowNum:
=@rowNum+1)-col1=0
5.Oracle中的substr(hello,a,b)mysql中是substring(hello,a,b)oracle的a=0和a=1是一样的,都是从第一个开始。
Mysql是从0开始。
6.Oracle的nvl()对应mysql的ifnull()。
7.Oracle中的WMSYS.WM_CONCAT(),列转行函数,以逗号隔开,mysql可以用GROUP_CONCAT()进行替换。
8.Oracle的||可以用mysql的+替代,但是mysql在往某列加上字符时应该用concat,
例如给表中name字段加上x:
updatetable1setname=concat(x,name)。
1.1
移植过程中重点问题
1.1.1
数据类型差异
ORACLE数据库和MYSQL数据库在数据类型方面差异比较大,而且数据类型也是一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基础。
以下给出了ORACLE
à
MYSQL数据类型的对应关系。
数值类型:
NUMBER
DECIMAL,精度刻度都不变
注:
如果是序列用BIGINT
字符串类型:
VARCHAR2
VARCHAR长度不变。
LONG
LONGTEXT
这里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TEXT类型也需要指名长度,否则建立key会报错
日期类型:
DATE
DATETIME
TIMESTAMP(N)
TIMESTAMP
1.1.2
SQL语法差异
SEQUENCE:
MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:
1、
作为表中自增字段的序列号。
2、
程序中获得自动编号。
MYSQL数据类型中存在
AUTO_INCREMENT为自增数据类型。
我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。
对于ORACLE中SEQUENCE作为表的自增列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。
ORACLE开发的应用程序中直接SELECT
SEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。
首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值:
mysql>
SELECT
LAST_INSERT_ID();
+------------------+
|
LAST_INSERT_ID()
|
3
1
row
in
set
(0.06
sec)
我们可以创建一个含有自增列的表,对该表进行INSERT操作后,再利用LAST_INSERT_ID()函数来获得刚刚INSERT的值,也就是相当于ORACLE中的SEQUENCE.NETVAL。
也就是INSERT操作+SELECT操作获得一个自动编号。
CREATE
TABLE
MOCHA_BE_SEQUENCE(ID
BIGINT
NOT
NULL
PRIMARY
KEY
AUTO_INCREM
ENT);
Query
OK,
0
rows
affected
(0.63
INSERT
INTO
MOCHA_BE_SEQUENCE
VALUES(NULL);
(0.09
(0.05
2
(0.00
BLOG:
ORACLE和MYSQL都支持二进制大对象,数据类型的名称都是BLOB,在存储方面都是一样的,BLOB列没有字符集,并且排序和比较基于列值字节位数;
在开发应用程序时需要注意对两种数据库BLOG类型的操作的差异。
视图
Mysql视图限制
(1)SELECT语句不能包含FROM子句中的子查询。
(2)SELECT语句不能引用系统或用户变量。
(3)SELECT语句不能引用预处理语句参数。
(4)在存储子程序内,定义不能引用子程序参数或局部变量。
(5)在定义中引用的表或视图必须存在。
但是,创建了视图后,能够舍弃定义引用的表或视图。
要想检查视图定义是否存在这类问题,可使用CHECK
TABLE语句。
(6)在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。
(7)在视图定义中命名的表必须已存在。
(8)不能将触发程序与视图关联在一起。
我所要迁移的系统中的视图90%用到了子查询,解决方案是首先重新写查询语句,尽量避免子查询,避免不了,就将子查询中的内容,单独create成一个新的视图,然后再建立所需要的视图。
Oracle中带子查询的视图:
OR
REPLACE
VIEW
MOCHA_IM_ALL_ACCOUNT_VIEW
AS
USER_ID
AS
ID,
USER_NAME
NAME,
CONCAT(CONCAT(CONCAT(NVL(ORG.ORG_CODE,'
00000001.10000000'
),
'
.00.'
PERSON_POSITION.PERSON_LEVEL),
LPAD(PERSON_POSITION.ORG_PERSON_NO,9,'
0'
))
CODE,
NVL(ORG.ORG_LEVEL,
1)
REC_LEVEL,
PERSON'
REC_TYPE
FROM
(SELECT
PERSON.USER_ID
PERSON.USER_NAME,
NVL(POSITION.ORG_ID,
-1)
ORG_ID,
NVL(POSITION.ORG_PERSON_NO,
0)
ORG_PERSON_NO,
NVL(POSITION.PERSON_LEVEL,
64'
)
PERSON_LEVEL
MOCHA_IM_PERSON_POSITION
POSITION,
MOCHA_IM_PERSON
PERSON
WHERE
=
POSITION.USER_ID
(+)
AND
PERSON.ADMIN_FLAG
And
PERSON.STATUS='
A'
PERSON_POSITION,
MOCHA_IM_ORG_VIEW
ORG
PERSON_POSITION.ORG_ID
ORG.ORG_ID
(+)
UNION
ALL
00000001.20000000.00.64000000000'
I'
00000001.30000000.00.64000000000'
CODE
1
ADMIN_FLAG
1'
STATUS='
LPAD(ORG_ID,20,'
ORG_NAME
ORG_CODE
CODE,ORG_LEVEL
ORG'
REC_TYPE
MOCHA_IM_ORG_VIEW
-1'
未分派人员'
DUAL
-2'
待删除人员'
00000001.20000000'
-3'
系统管理员'
00000001.30000000'
From
/
转为mysql:
PERSON_POSITION
IFNULL(POSITION.ORG_ID,
IFNULL(POSITION.ORG_PERSON_NO,
IFNULL(POSITION.PERSON_LEVEL,
POSITION
LEFT
JOIN
ON
;
NAME,
CONCAT(CONCAT(CONCAT(IFNULL(ORG.ORG_CODE,'
),
IFNULL(ORG.ORG_LEVEL,
ORG
触发器,函数,存储过程
语法的区别,难点在于异常处理模块,其他要关注的比如定义游标的语法,mysql控制流程等等。
对于触发器来讲对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
例如,对于某一表,不能有两个BEFORE
UPDATE触发程序。
但可以有1个BEFORE
UPDATE触发程序和1个BEFORE
INSERT触发程序,或1个BEFORE
UPDATE触发程序和1个AFTER
就是说mysql不支持oracle中create
trigger
***
before
insert
or
Update
delete
on
***.此时应该把这个触发器拆分为3个触发器。
Oracle下触发器:
TRIGGER
MOCHA_IM_DUTY_TRG
BEFORE
UPDATE
DELETE
MOCHA_IM_DUTY
FOR
EACH
ROW
DECLARE
befImg
VARCHAR2(2000);
afterImg
action
VARCHAR2(10);
action_module
info_category
VARCHAR2(20);
BEGIN
:
IM'
duty'
[DUTY_ID]'
||
old.duty_id
[DUTY_NAME]'
old.duty_name;
new.duty_id
new.duty_name;
IF
(:
is
null)
THEN
Insert'
MOCHA_IM_AUDIT_LOG
(ACTION_TIMESTAMP,
ACTION,
ACTION_MODULE,
INFO_CATEGORY,
BEFORE_IMAGE,
AFTER_IMAGE)
VALUES
(SYSDATE,
action,
action_module,
info_category,
befImg,
afterImg);
ELSIF
Delete'
ELSE
Update'
IF(befImg
!
afterImg)
END
IF;
EXCEPTION
WHEN
OTHERS
then
end;
mysql下:
MOCHA_IM_DUTY_TRG_INSERT
DECLARE
VARCHAR(2000);
VARCHAR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle mysql 转换 问题 总结 要点