锁表查看
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
字段不允许distinct
、insert
、update
等操作。他是特殊的对象,其实数据库里纪录的只是一个类似指针的对象,就象一个视图的概念。 - 解决方式:
SELECT * FROM TEST WHERE to_char(test) ='1'