记录一次mysql 与orcale 适配过程

    技术2023-06-14  70

    记录一次mysql 与orcale 适配过程

    1.mysql表导入orcale 使用navicat传输工具 2.导出的.sql文件中 表名和字段名自动加了" " 去除双引号,去除navicat中多余的注释,我这边导出的sql文件中没有默认值,加上默认值。注意orcale中date的默认值是sysdate,plsql中执行文件建表。表建好以后发现很多坑: (1) 主键不能自增

    ###创建sequence create sequence t_user_autoinc_seq minvalue 1 maxvalue 99999999 start with 1 increment by 1 nocycle nocache order; ###t_user 是表名 t_user_trigger是新建的触发器 create or replace trigger t_user_trigger before insert on t_user for each row begin select t_user_autoinc_seq.nextval into :new.id from dual; end t_user_autoinc_tg; ###每张表都得创建sequence和trigger (2)更新时间不能自动更新 ###更新时间创建触发器就好了 create or replace trigger t_user_info_trigger before update on t_user for each row begin :new.MODIFIED_DATE := sysdate; end;

    3.到这表这块没啥问题了,这边项目中用的mybatis,下边是mybatis中遇到的坑以及解决方案 (1)配置mybatis默认值

    <!--设置当JDBC类型为空时,某些驱动程序 要指定值,default:OTHER --> <setting name="jdbcTypeForNull" value="NULL"/>

    (2)sql差异

    a.不能用as 做别名 b.cancat只能拼接2个字符,需要多个 需要多个concat拼接 c.orcale中group by 分组字段必须在select中 d.单条insert返回主键问题 <selectKey resultType="java.lang.Integer" order ="AFTER" keyProperty="id" keyColumn="id"> select T_DATASOURCE_AUTOINC_SEQ.Currval from dual </selectKey> ### T_DATASOURCE_AUTOINC_SEQ创建主键自增的seq e.批量插入 <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id"> INSERT ALL <foreach collection="list" item="item" index="index" > into t_XXX (creater, modifier ) values ( #{item.creater,jdbcType=VARCHAR}, #{item.modifier,jdbcType=VARCHAR} ) </foreach> select 1 from dual </insert>

    f.批量insert or update

    <insert id="batchInsertOrUpdate" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id"> MERGE INTO t_user t USING( <foreach collection="list" item="item" index="index" separator="UNION ALL" > SELECT #{item.userId,jdbcType=VARCHAR} user_id, #{item.age,jdbcType=INTEGER} age FROM DUAL </foreach>) ### 唯一键约束 t1 on (t.user_id=t1.user_id) WHEN MATCHED THEN UPDATE SET t.age=t1.age WHEN NOT MATCHED THEN insert(user_id, age) values(t1.user_id, t1.age) </insert>

    orcale 分页差异 mysql limit orcale使用rownum 项目中可以使用开源的pagehelper适配mysql与orcale。

    ps. 后续肯定还有很多问题,目前暂时就发现这些。

    Processed: 0.017, SQL: 9