# Oracle Mybatis 常用语法、报错处理


锁表查看
SELECT l.session_id sid,
       s.serial#,
       l.locked_mode 锁模式,
       l.oracle_username 登录用户,
       l.os_user_name 登录机器用户名,
       s.machine 机器名,
       s.terminal 终端用户名,
       o.object_name 被锁对象名,
       s.logon_time 登录数据库时间
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#;

封闭符
  • 双引号作为封闭符
  • 数据库中字段默认为大写,如果需要小写,在建表DDL中用双引号进行修饰
单条插入自增主键
  • 批量插入估计也可以使用此方法
<insert id="insert" parameterType="map" >
   <selectKey  keyProperty="id" resultType="int" order="BEFORE">
       select nvl(max(id),0)+1 from test
   </selectKey>
insert into test(ID,MEMBER_ID) values(#{id},#{memberId})
</insert>
批量插入没有自增操作
<insert id="insertbatch">
insert into test(column1,column2,column3)
 <foreach collection="list"   item="item" separator="union all">
 	(select 
     		to_char(
            nvl(
            <choose>
                <when test="item.column1 !=null">#{item.column1}</when>
                <otherwise>null</otherwise>
            </choose>
            ,null)
            ),
     		to_char(
            nvl(
            <choose>
                <when test="item.column2 !=null">#{item.column2}</when>
                <otherwise>null</otherwise>
            </choose>
            ,null)
            ),
    		to_char(
            nvl(
            <choose>
                <when test="item.column3 !=null">#{item.column3}</when>
                <otherwise>null</otherwise>
            </choose>
            ,null)
            )
     from dual)
</foreach>
</insert>
批量插入含有自增主键
  • 新建一个序列获取自增序号:
CREATE SEQUENCE TEST_SEQUENCE INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999999999999999999 NOCYCLE NOCACHE NOORDER ;
  • 批量插入
 <insert id="insertBatch">
insert into table(ID,COLUMN1,RECORDTIME)
select TEST_SEQUENCE.NEXTVAL ID,m.COLUMN1,to_date(m.RECORDTIME,'yyyy-mm-dd hh24:mi:ss') from (
<foreach collection ="list" item ="item" index ="index" separator ="union all" >
    select
     to_char(
     nvl(<choose><when test="item.column1 !=null">#{item.column1}</when><otherwise>null</otherwise></choose>,null)) COLUMN1,
     nvl(<choose><when test="item.recordtime !=null">#{item.recordtime}</when><otherwise>null</otherwise></choose>,null) RECORDTIME from dual
</foreach>  
) m
</insert>insert>     
  • 批量插入 表中有 clob类型的:上面的方法搞不了:Mybatis执行会报错,其实Sql拼接的Sql到库里是没有问题的。
<insert id="insertBatch" parameterType="java.util.List">
    begin
    <foreach collection="list" item="item" index="index" separator=";">
        insert into test(id, content) 
        values( #{item.id},#{item.content,jdbcType=CLOB})
    </foreach> 
    ;end;
</insert>
  • 批量插入 insert all
INSERT ALL 
<foreach collection="list" item="item">
INTO table(column1,column2) VALUES (#{item.column1},#{item.column2}) 
</foreach>
SELECT 1 FROM DUAL;
limit 语法
select * from test where rownum =1;
类似于group_concat的函数
  • 使用wm_concat
Oracle 查询大小写区分
转为小写  LOWER('ABC') 结果 abc
转为大写  UPPER('aBc') 结果 ABC
dual表的用途
  • dual是一个虚拟表,用来构成select的语法规则
  • 例如:
SELECT 'zhangsan' AS name,13 AS age FROM dual
to_date()
  • 时间格式转换
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') AS datetime from dual; 

select to_date('2005-01-01','yyyy-MM-dd HH24:mi:ss') AS datetime from dual; 

Oracle 常见错误

SQL 错误 [979] [42000]: ORA-00979: 不是 GROUP BY 表达式
  • 错误描述:group by语句后面的字段和列中的字段应该匹配
  • 解决方式:使用distinct代替groupby查询
SQL 错误 [923] [42000]: ORA-00923: 未找到要求的 FROM 关键字
  • 错误描述:缺少from表的内容
  • 解决方式:SELECT 'zhangsan' AS name,13 AS age FROM dual使用dual虚拟表
SQL 错误 [904] [42000]: ORA-00904: “type”: 标识符无效
  • 错误描述:select的列和数据库表中字段不一致,注意大小写,特殊字符加上双引号

  • 解决方式:

    select "TYPE" from 表名;
    
ORA-01830: 日期格式图片在转换整个输入字符串之前结束
  • 日期格式转换错误
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') AS datetime from dual; 

select to_date('2005-01-01','yyyy-MM-dd HH24:mi:ss') AS datetime from dual; 
SQL 错误 [932] [42000]: ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB
  • 错误描述:库中的字段是clob类型的,blob字段不允许distinctinsertupdate等操作。他是特殊的对象,其实数据库里纪录的只是一个类似指针的对象,就象一个视图的概念。
  • 解决方式:
SELECT * FROM TEST WHERE to_char(test) ='1'
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值