一、序言
自古序言吹水,最近由于项目需要,开始使用起了oracle,大学一直用的是mysql,虽然mysql与oracle都是SQL,但是两者还是有些许不一样,以下内容,往后使用遇到的坑就汇总到这里。
二、oracle成神之路(扑街之路)
1、oracle 11R的安装
安装步骤 csdn上一大堆,我这里就推荐一篇:
Oracle11g安装教程
我安装时,没出现啥问题,一切正常,一步到位。
2、oracle 11R 的卸载
这个就比较坑爹了,我前一个员工,安装时,密码不知给我弄成啥了,我也懒得去重置密码,百度一堆迷迷糊糊的,就干脆卸载,刚好体验一下安装oracle
卸载这里推荐百度经验上的贴,删得干干净净:
oracle 11R的卸载
3、oracle的分页实现
这个真是的皮,mysql写习惯,以为oracle也是limiit分页,然后,居然给我报错,我靠我还以为太久没写了,limit拼错了,一脸懵逼的百度一波,居然oracle没有limit,分页是用rownum,这就牛逼了
基本分页格式可以写成
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
参考文章:oracle分页
4、坑爹的group by
下列语句,如果是在mysql下执行,肯定没有问题,但是oracle就不行,目前我还真不能理解这样做的意义。
这里的主要原因是,oracle的group by 的列,必须是select 的所有列,所以我这应该改成下图,这样就不会报错了,问题可能也来,要是,我就是想group by 一个列呢,另一个列我不想group,那就只能嵌套子查询了
5、oracle语法 nvl
经常性,会有需要sum的业务,也常常会有null值,如果不处理,肯定会出错,所以既需要nvl(sum(xx),0),值得一提的是,mysql的相应语法是nullif(sum(xx),0)
6、oracle的时间格式化语法
毕竟接触mysql比较多,习惯性就写了,date_format(),然后居然给我报错,说标识符无效,这就尴尬了,还以为自己英语能力变差了,拼写错误,百度得知,oracle没有这个语法,应该用to_char(),如果你的时间字段是varchar2的话,还应该用to_date()函数,将其转为日期在to_char()
附to_char() 格式化函数详解
7、sys用户使用navicat连接oracle问题
使用sys登录时,出现下方的弹窗
解决
选择上方的高级选项,选择角色SYSDBA,回去常规再次连接,即可
8、oracle的快速数据迁移
8.1 oracle数据备份
- 导出此用户下的所有表
exp 用户名/密码 file=xx/xx.dmp - 导出此用户下的部分表
exp 用户名/密码 file=xx/xx.dmp tables=(xx,xx,xx) - 导出远程服务用户下的部分表
exp 用户名/密码/(服务名,默认orcl) file=xx/xx.dmp tables=(xx,xx,xx)
oracle的dmp数据导入
- 导入此用户下的所有表
imp 用户名/密码 file=xx/xx.dmp full=y - 导入此用户下的部分表
imp 用户名/密码 file=xx/xx.dmp tables=(xx,xx,xx) - 导入远程服务用户下
imp 用户名/密码/(服务名,默认orcl) file=xx/xx.dmp tables=(xx,xx,xx)
最后附上一些参数的参考地址:https://blog.csdn.net/fghsfeyhdf/article/details/79807690
9、oracle 查询的字段全为大写
某条select之后的结果,居然是这样,字段全大写了,跟java的实体类对应不上,这里只需要 添加 as别名,同时注意别名需要双引号,这点很重要
select acceptor as "acceptor" from you_table
10、oracle 除数不能为0
利用decode函数
select decode(b,0,0,a/b) from dual;
当b = 0时,返回0,否则才返回a/b的结果。
11、oracle误删数据找回
通过时间恢复删除且已提交的数据
1)查询当前系统时间
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual;
2)查询删除数据的时间点的数据
select * from 表名 as of timestamp to_timestamp(‘2018-10-09 15:29:00’,‘yyyy-mm-dd hh24:mi:ss’); (如果不是,则继续缩小范围)
3)恢复删除且已提交的数据
–开启行移动功能(解决执行以下语句报错问题)
alter table 表名 enable row movement;
–恢复某个时间点的数据
flashback table 表名 to timestamp to_timestamp(‘2018-10-09 15:29:00’,‘yyyy-mm-dd hh24:mi:ss’);
–关闭行移动功能
alter table 表名 disable row movement;
12、oracle的长度限制
oracle的表名、字段名、constraint名的长度只能在30字符,超长会报错。