· 数据类型
编号 |
ORACLE |
MYSQL |
注释 |
1 |
NUMBER |
int / DECIMAL |
DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; |
2 |
Varchar2(n) |
varchar(n) |
|
3 |
Date |
DATATIME |
日期字段的处理 |
4 |
INTEGER |
int / INTEGER |
Mysql中INTEGER等价于int |
5 |
EXCEPTION |
SQLEXCEPTION |
详见<<2009001-eService-O2MG.doc>>中2.5 Mysql异常处理 |
6 |
CONSTANT VARCHAR2(1) |
mysql中没有CONSTANT关键字 |
从ORACLE迁移到MYSQL,所有CONSTANT常量只能定义成变量 |
7 |
TYPE g_grp_cur IS REF CURSOR; |
光标 : mysql中有替代方案 |
详见<<2009001-eService-O2MG.doc>>中2.2 光标处理 |
8 |
TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; |
数组: mysql中借助临时表处理 |
详见<<2009001-eService-O2MG.doc>>中2.4 数组处理 |
9 |
自动增长的序列 |
自动增长的数据类型 |
MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 |
10 |
NULL |
NULL |
空字符的处理 |
· 基本语法
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
变量的声明方式不同 |
li_index NUMBER := 0 |
DECLARE li_index INTEGER DEFAULT 0 |
1. mysql 使用DECLARE定义局部变量. |
2 |
变量的赋值方式不同 |
lv_inputstr := iv_inputstr |
SET lv_inputstr = iv_inputstr |
1. oracle变量赋值使用:= |
3 |
跳出(退出)语句不同 |
EXIT; |
LEAVE procedure name; |
1. oracle: 如果exit语句在循环中就退出当前循环.如果exit语句不再循环中,就退出当前过程或方法. |
while 条件 loop |
label_name:while 条件 do |
|||
4 |
定义游标 |
TYPE g_grp_cur IS REF CURSOR; |
DECLARE cursor_name CURSOR FOR SELECT_statement; |
oracle可以先定义游标,然后给游标赋值. |
5 |
定义数组 |
TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; |
可以使用临时表代替oracle数组, 也可以循环拆分字符来替代oracle数组. |
目前可以使用临时表来代替oracle数组. |
6 |
注释方式不同 |
"-- message" 或 "/** …. */" 或 "/* …. */" |
"-- message" 或 "/* …. */" 或 "#" |
mysql注释来自 MySQL 5.1参考手册 9.5. 注释语法, 建议同oracle一样, 单行用--, 多行/* */ |
7 |
自带日期时间函数格式不同 |
Oracle时间格式:yyyy-MM-dd hh:mi:ss |
Mysql时间格式:%Y-%m-%d %H:%i:%s |
1. MYSQL日期字段分DATE和TIME两种. |
8 |
日期加减 |
当前时间加N天: sysdate+N |
日期相加: date_add(now(), INTERVAL 180 DAY) |
|
9 |
字符串连接符不同 |
result := v_int1||v_int2; |
set result = concat(v_int1,v_int2); |
|
10 |
定义游标不同 |
CURSOR l_bk_cur IS |
DECLARE l_bk_cur CURSOR |
详见<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.2 Mysql游标处理部分 |
11 |
事务回滚 |
ROLLBACK; |
ROLLBACK; |
oracle和mysql中使用方法相同 |
12 |
GOTO语句 |
GOTO check_date; |
GOTO check_date; |
oracle和mysql中使用方法相同 |
· 函数
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
数字函数 |
round(1.23456,4) |
round(1.23456,4) |
一样: |
2 |
abs(-1) |
abs(-1) |
功能: 将当前数据取绝对值 |
|
3 |
ceil(-1.001)) |
ceiling(-1.001) |
功能: 返回不小于 X 的最小整数 |
|
4 |
floor(-1.001) |
floor(-1.001) |
功能: 返回不大于 X 的最大整数值 |
|
5 |
Max(expr)/Min(expr) |
Max(expr)/Min(expr) |
功能:返回 expr 的最小或最大值。MIN() 和 MAX() 可以接受一个字符串参数;在这 |
|
6 |
字符串函数 |
ascii(str) |
ascii(str) |
功能:返回字符串 str 最左边的那个字符的 ASCII 码值。如果 str 是一个空字符串, |
7 |
CHAR(N,...) |
CHAR(N,...) |
功能:CHAR() 以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符 |
|
8 |
REPLACE(str,from_str,to_str) |
REPLACE(str,from_str,to_str) |
功能: 在字符串 str 中所有出现的字符串 from_str 均被 to_str 替换,然后返回这个字符串. |
|
9 |
INSTR('sdsq','s',2) |
INSTR('sdsq','s') |
参数个数不同 |
|
10 |
SUBSTR('abcd',2,2) |
substring('abcd',2,2) |
函数名称不同: |
|
11 |
instr(‘abcdefg’,’ab’) |
locate(‘ab’,’abcdefg’) |
函数名称不同: |
|
12 |
length(str) |
char_length() |
函数名称不同: |
|
13 |
REPLACE('abcdef', 'bcd', 'ijklmn') |
REPLACE('abcdef', 'bcd', 'ijklmn') |
一样: |
|
14 |
LPAD('abcd',14, '0') |
LPAD('abcd',14, '0') |
一样: |
|
15 |
UPPER(iv_user_id) |
UPPER(iv_user_id) |
一样: |
|
16 |
LOWER(iv_user_id) |
LOWER(iv_user_id) |
一样: |
|
17 |
控制流函数 |
nvl(u.email_address, 10) |
IFNULL(u.email_address, 10) |
函数名称不同(根据不同的作用进行选择): |
18 |
DECODE(iv_sr_status,g_sr_status_com, ld_sys_date, NULL) |
无,请用IF或CASE语句代替. |
说明: |
|
19 |
类型转换函数 |
TO_CHAR(SQLCODE) |
date_format/ time_format |
函数名称不同 |
20 |
to_date(str,format) |
STR_TO_DATE(str,format) |
函数名称不同: |
|
21 |
trunc(-1.002) |
cast(-1.002 as SIGNED) |
函数名称不同: |
|
22 |
TO_NUMBER(str) |
CAST("123" AS SIGNED INTEGER) |
函数名称不同 |
|
23 |
日期函数 |
SYSDATE |
now() / SYSDATE() |
写法不同: |
24 |
Next_day(sysdate,7) |
自定义一个函数:F_COMMON_NEXT_DAY(date,int) |
函数名称不同: |
|
25 |
ADD_MONTHS(sysdate, 2) |
DATE_ADD(sysdate(), interval 2 month) |
函数名称不同: |
|
26 |
2个日期相减(D1-D2) |
DATEDIFF(date1,date2) |
功能: 返回两个日期之间的天数。 |
|
27 |
SQL函数 |
SQLCODE |
MYSQL中没有对应的函数,但JAVA中SQLException。getErrorCode()函数可以获取错误号 |
Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。 |
28 |
SQLERRM |
MYSQL中没有对应的函数,但JAVA中SQLException。getMessage()函数可以获取错误消息 |
Oracle内置函数SQLCODE和SQLERRM是特别用在OTHERS处理器中,分别用来返回Oracle的错误代码和错误消息。 |
|
29 |
SEQ_BK_DTL_OPT_INT_KEY.NEXTVAL |
自动增长列 |
在MYSQL中是自动增长列. 如下方法获取最新ID: |
|
30 |
SUM(enable_flag) |
SUM(enable_flag) |
一样: |
|
31 |
DBMS_OUTPUT.PUT_LINE(SQLCODE) |
在MYSQL中无相应的方法,其作用是在控制台中打印,用于测试,对迁移无影响。 |
dbms_output.put_line每行只能显示255个字符,超过了就会报错 |
· 循环语句
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
IF语句使用不同 |
IF iv_weekly_day = 'MON' THEN |
IF iv_weekly_day = 'MON' THEN |
1. mysql和oracle除了关键字有一个字差别外(ELSEIF/ELSIF),if语句使用起来完全相同. |
2 |
FOR语句不同 |
FOR li_cnt IN 0..(ii_role_cnt-1) LOOP |
loopLable:LOOP |
|
3 |
while语句不同 |
WHILE lv_inputstr IS NOT NULL LOOP |
WHILE lv_inputstr IS NOT NULL DO |
1. oracle 中使用while语句关键字为: while 表达式 loop… end loop; |
· 存储过程&Function
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
创建存储过程语句不同 |
create or replace procedure P_ADD_FAC( |
DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`; |
|
2 |
创建函数语句不同 |
CREATE OR REPLACE FUNCTION F_ROLE_FACS_GRP( |
DROP FUNCTION IF EXISTS `SD_ROLE_F_ROLE_FACS_GRP`; |
1.在创建函数时如果存在同名的函数,会删除老的函数. |
3 |
传入参数写法不同 |
procedure P_ADD_FAC( |
create procedure P_ADD_FAC( |
|
function func_name( |
create function func_name( |
|||
4 |
包的声明方式 |
create or replace package/package body package name |
拆分成多个存储过程或函数 |
oracle可以创建包,包中可以包含多个存储过程和方法. |
5 |
存储过程返回语句不一样 |
return; |
LEAVE proc; (proc 代表最外层的begin end) |
oracle存储过程和方法都可以使用return退出当前过程和方法. |
6 |
存储过程异常处理不一样 |
EXCEPTION |
DECLARE EXIT HANDLER FOR SQLEXCEPTION |
oracle : 内部异常不需要定义,在存储过程或函数末尾写上EXCEPTION后,后面的部分即为异常处理的部分. oracle可以定义自定义异常,自定义异常需要使用raise关键字抛出异常后,才可以在EXCEPTION中捕获. |
7 |
过程和函数的声明变量的位置不同 |
声明变量在begin…end体之前 |
声明变量在begin...end体内,begin之后其他任何内容之前 |
|
8 |
NO_DATA_FOUND异常处理 |
EXCEPTION |
使用FOUND_ROWS()代替NO_DATA_FOUND. 详见注释. |
oracle中: |
9 |
在存储过程中调用存储过程方式的不同 |
Procedure_Name(参数); |
Call Procedure_Name(参数); |
MYSQL存储过程调用存储过程,需要使用Call pro_name(参数). |
10 |
抛异常的方式不同 |
RAISE Exception_Name; |
见备注 |
详见<<2009002-OTMPPS-Difficult Questions-0001.doc>>中2.5 Mysql异常处理部分 |
· 触发器
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
创建触发器语句不同 |
create or replace trigger TG_ES_FAC_UNIT |
create trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_unit` |
1. Oracle使用create or replace trigger语法创建触发器. |
2 |
触发器new和old记录行的引用不同 |
取得新数据: :new.FAC_CD |
取得新数据: NEW.FAC_CD |
1. new和old记录行的引用: |
· 用户权限
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
创建用户 |
Create user user_name identified by user_password |
CREATE USER user_name IDENTIFIED BY user_password; |
1.oracle创建用户 |
2 |
删除用户 |
Drop user user_name cascade; |
Drop user user_name; |
1. Oracle |
3 |
修改密码 |
alter user user_name identified by new_password |
|
1.mysql修改密码 |
4 |
设置用户权限 |
Grant connect to star -- star角色允许用户连接数据库, 并创建数据库对象 |
GRANT ALL ON picture.* TO test IDENTIFIED BY "test"; |
1. 详见< |
5 |
回收权限 |
Revoke select, update on product from user02; |
REVOKE privileges (columns) ON what FROM user |
1. Oracle |
· 其它
编号 |
类别 |
ORACLE |
MYSQL |
注释 |
1 |
内连接的更改 |
1、 2、 |
方法一 |
oracle sql语句和mysql sql语句有一定的区别. |
2 |
最后一句执行的sql statement所取得或 |
SQL%ROWCOUNT |
执行select语句后用: FOUND_ROWS() |
oracle中: |
3 |
查询分页 |
SELECT t1.* |
方法:使用循环变量替换oracle中ROWNUM |
|
4 |
java null值 |
""作为参数传入后,在oracle中将识别为null |
""作为参数据传mysql还是"" |
现在java代码需要修改: |
5 |
执行动态sql |
lv_sql := 'SELECT ' ||' distinct ' || iv_cd_field_name || ' FIELD1 '|| |
set @a = iv_cd_field_name; |
1. oracle可以将动态sql放在游标中执行. |
6 |
存储过程相互调用时传递数组 |
oracle使用数组步骤: END LOOP; |
mysql中数用数组步骤: |
存储过程相互调用时传递数组解决方法: |
7 |
Java无法以String来接取int |
select fac_unit_key FILED1在oracle可以 |
select fac_unit_key FILED1在mysql中要改 |
CAST(intvalue AS CHAR) |