概述
一、批量新增 2
二、批量修改 3
三、模糊查询 3
四、无效字符 4
五、日期 5
六、获得当前主键操作 6
七、字段类型的区别 7
八、单引号的处理 10
九、翻页的SQL语句的处理 10
十、长字符串的处理 10
十一、空字符的处理 11
一、批量新增
mysql中支持insert into xxx values (?,?),(?,?) 。例如:
<insert id="saveEntity" parameterType="java.util.List">
insert into role_model (RM_MODELID,RM_ROLEID) values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.modelId},#{item.roleId})
</foreach>
</insert>
但是在oracle中要这样写:insert into xxx select ?,? from dual union all select ?,? from dual union all select ?,? from dual 。例如:
<insert id="saveEntity" parameterType="java.util.List">
insert into role_model (RM_MODELID,RM_ROLEID)
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.modelId},#{item.roleId} from dual
</foreach>
</insert>
区别总结:
1、mysql有values,oracle没values;
2、mysql的separator是逗号“,”,oracle的separator是“union all”;
3、mysql是(?,?),oracle是select ?,? from dual
二、批量修改
mysql写法:
注:mysql数据库连接需要加上&allowMultiQueries=true
例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
<update id="updatebatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update table_name
<set >
<if test="item.status != null" >
status = #{item.status,jdbcType=INTEGER}
</if>
</set>
where id = #{item.id,jdbcType=BIGINT}
</foreach>
</update>
oracle写法:
注:这样的写法虽然可以更新,但是更新操作返回值是-1,并没有返回更新的行数
<update id="updatebatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close="end;" separator=";">
update table_name
<set >
<if test="item.status != null" >
status = #{item.status,jdbcType=INTEGER}
</if>
</set>
where id = #{item.id,jdbcType=BIGINT}
</foreach>
</update>
区别总结:
mysql的标签中open和close都是””而oracle中open=“begin”,close=”end;”。
三、模糊查询
mysql中支持concat ( '%',#{roleName},'%')。例如:
<select id="query" resultMap="resultMap">
select * from role
<where>
<if test="roleName != null and roleName != ''">and ROLE_NAME like concat ( '%',#{roleName},'%') </if>
</where>
order by ROLE_ID desc
</select>
而oracle中却要这样写: '%'||#{roleName}||'%' 。例如:
<select id="query" resultMap="resultMap">
select * from role
<where>
<if test="roleName != null and roleName != ''">and ROLE_NAME like '%'||#{roleName}||'%' </if>
</where>
order by ROLE_ID desc
</select>
区别总结:
mysql在xml中使用concat函数进行字符串的拼接,oracle使用“||”进行字符串的拼接。
四、无效字符
mysql
<insert id="saveuser" parametertype="userentity" >
insert into c_user (id,login_name,password,email)
values (#{id},#{loginname},#{password},#{email});
</insert>
oracle
<insert id="saveuser" parametertype="userentity" >
insert into c_user (id,login_name,password,email)
values (#{id},#{loginname},#{password},#{email})
</insert>
区别总结:
mysql在xml中可以加分号在最后面,但是oracle不可以。
五、日期
mysql:
返回系统日期,输出 2009-12-25 14:38:59
select now();
输出 09-12-25
select date_format(now(),'%y-%m-%d');
获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()
当前时间减去7分钟的时间 :select date_sub(now(),interval 7 minute);
获取时间戳:select unix_timestamp('2008-08-08'); -- 1218124800
oracle:
获取系统日期: SYSDATE()
格式化日期: TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS')
返回系统日期,输出 25-12月-09
select sysdate from dual;
mi是分钟,输出 2009-12-25 14:23:31
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
当前时间减去7分钟的时间
select sysdate,sysdate - interval '7' MINUTE from dual;
获取时间戳:SELECT (SYSDATE - TO_DATE('1970-1-1 8','YYY-MM-DD HH24'))*86400 FROM DUAL;
六、获得当前主键操作
mysql:
<insert id="insert" parameterType="Role" useGeneratedKeys="true" keyProperty="roleId">
insert into role (name, create_time, update_time) values (#{name,jdbcType=VARCHAR}, now(), now())
</insert>
oracle:
在执行插入之前,需要创建一个序列:
create sequenceseq _LSP_ROLE
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
cache 20;
<insert id="insert" parameterClass="ROLE">
<selectKey resultType="java.lang.Long" order="AFTER" keyProperty="roleId">
SELECT seq_LSP_ROLE.currval as ROLEID from DUAL
</selectKey>
insert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)
</insert>
区别总结:
mysql在插入是不需要主键而是在插入过程中自动获取一个自增的主键,不同的是oracle在在执行insert sql前必须指定一个主键值给要插入的记录。
七、字段类型的区别
mysql bigint
oracle numeric()因为oracle没有bigint类型
|
八、单引号的处理
MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
九、翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用
ROWNUM<100, 不能用ROWNUM>80
十、长字符串的处理
ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用
ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
十一、空字符的处理
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符
进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
最后
以上就是动人月饼为你收集整理的oracle与mysql常用区别整理的全部内容,希望文章能够帮你解决oracle与mysql常用区别整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复