Oracle 转 MySQL 语法变化
(一般情况)
1. Oracle : start with …connect by
Mysql 不支持,可以利用函数解决
例如:
<if test="_databaseId == 'oracle'">
start with T1.stu_id=#{ stu_id } connect by prior T1. stu_id = stu_id
</if>
<if test="_databaseId == 'mysql'">
AND T1. stu_id in(
select teacher_id from t_system_orgs where FIND_IN_SET(stu_id, get_org_pid(#{teacher_id }))
)
</if>
其中get_teacher_id需要在mysql中,自己写一个函数
函数内容如下:
CREATE FUNCTION `get_teacher_id`(`rootId` char(100)) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE pTemp VARCHAR(1000);
DECLARE cTemp VARCHAR(1000);
SET pTemp = '$';
SET cTemp =cast(rootId as CHAR);
WHILE cTemp is not null DO
SET pTemp = concat(pTemp,',',cTemp);
SELECT group_concat(teacher_id) INTO cTemp FROM t_stu_teacher
WHERE FIND_IN_SET(stu_id,cTemp)>0;
END WHILE;
RETURN pTemp;
END
注意:在函数中,需要把,要生成树形结构的字段以及表名放到函数中
2. Oracle :nvl的转换
Nvl 在MySQL中用ifnull代替
3. Oracle :nvl2的转换
oracle: NVL2(exp1,exp2,exp3)
如果 exp1 不为空 ,函数返回 exp2 的值;
如果 exp2 为空 ,函数返回 exp3 的值;
mysql : IF ( ISNULL(字段名) , 0 , 1 )
如果字段名是null,函数返回0,不是null,函数返回1
4. 时间日期转换
Oracle:To_date(‘日期’,)------(也可以用to_char)
YYYY-MM-DD HH24:MI:SS
MySql:date_formate(‘日期’,)
%Y-%m-%d-%T
5. oracle的序列
oracle序列:
seq_orgid.nextval
mysql: oracle 的sequence改写,需要建函数,建表
函数:
CREATE DEFINER = `root`@`localhost` FUNCTION `NewProc`(seq_name varchar(50))
RETURNS int(11)
begin
update control_sequence
set current_value = current_value + increment_value
where name = seq_name;
return func_currval(seq_name);
end;
表:
CREATE TABLE `control_sequence` (
`name` varchar(50) NOT NULL COMMENT '序列的名字,唯一',
`current_value` bigint(100) NOT NULL COMMENT '当前的值',
`increment_value` int(11) NOT NULL DEFAULT '1' COMMENT '步长,默认为1',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='公共的序列表,用于为非自增且要求唯一的字段记录和获取唯一ID。';
用法:(func_nextval(‘seq_orgid’)
6. oracle的to_char
Mysql需要根据数据的格式进行转换
Cast(字段 as 类型)
CONVERT(字段 as 类型)
7. Oracle 自带的rowId,rowNum
Mysql需要自己手动添加
Oracle:
Select t.* , rownum rn FROM t_tables_gather t where 1=1
Mysql:
SELECT t.*, (@rownum:=@rownum+1 ) rn FROM (SELECT @rownum:=0)a, t_tables_gather t where 1=1
注意:mysql 无法像oracle一样生成字母的rowId,所以代替rowid也是数字递增。
8. null的使用
Oracle中的sql可以直接插入null,或者‘ ’,
Mysql 不支持,mysql 只能插入null