1.ORA-00933:SQL command not properly ended in?
可能原因:
- SQL语句写的不正确,比如where语句写在了group by 后面。
- 使用了含有order by或者inner join子句的insert 、delete语句。
- 使用了含有inner join子句的update语句。
- 使用了条件中含有自连接表字段比较的Triangular Join。
解决方案:
检查语句的子句组合是否正确,检查语句的使用顺序是否正确,比如group by是否放在where之后,order by 是否放在group by 之后。
2. ORA-03113错误
简单的把这个错误理解为Oracle客户端进程和数据库后台进程连接中断。
网上有的说是日志的错误,有的说是字段没起别名导致的,我是重新打开连接数据库工具后恢复正常的。但是真正的原因究竟如何呢?可以参考博客:https://blog.csdn.net/u010098331/article/details/51473328
3.Oracle清空表数据
3.1. delete [from] tableName [where 条件]; 记录逐条删除
3.2.Truncate [table] tableName;删除时不产生回退信息,数据量大时速度快
4.Oracle出现 java.sql.SQLRecoverableException: IO 错误: Socket read timed out 的错误
Caused by: oracle.net.ns.NetException: Socket read timed out
at oracle.net.ns.Packet.receive(Packet.java:339)
at oracle.net.ns.DataPacket.receive(DataPacket.java:106)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
... 49 common frames omitted
这是执行定时任务的时候oracle在有限的时间内没有执行完成,所以才抛出了这个异常的。
经过查找研究,原因是:
客户端没有在限定的时间内将数据发送给服务器,服务器为了保证服务性能,认定那个连接已经失效,所以出现上述异常。由此得出解决方案为:增大客户端的超时时间。
(感觉个人遇到这个问题的原因为:可能是在执行定时任务的时候,数据量过大,导致的超时。 可以结合具体的场景,去精确过滤返回的数据再进行处理。)
5.java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not est
感觉自己的是服务意外中断导致的报错,因为清理缓存后重新启动就好了。网上说的是服务器地址错误或格式错误 正确格式为: jdbc:oracle:thin:@ip地址:端口号:服务名
6.程序中的报错:Cause: java.sql.SQLTimeoutException: ORA-01013: 用户请求取消当前的操作
首先,先看你的oracle 数据库的事物有没有提交
当你在操作 oracle数据库的时候 有select * from....for update 操作的情况下 事物会被回滚 你要手动提交一下
不然就会出现 : ORA-01013:用户请求取消当前的操作
我是在程序运行中报的这个错误,感觉是定时任务没有执行完毕,新的任务又开始了。网上有说是超时时间设置的短了。
7.ora-03114处理
ora-03114 : 没有连接到oracle。
原因:当连接没有建立的时候尝试调用Oracle。通常是适应用户编写程序的时候没有进行登陆操作造成的。当然,也有可能是因为网络连接问题导致的断开连接。
通常造成03114错误如下:
1 服务器或者是服务器监听器未运行
2 Missing entry to the tnsnames.ora
3 网络问题
4 连接池出现问题
plsql工具是重新连接解决的。 程序中是 增加了try catch,在catch中重新实例化连接,并将连接打开即可。
8. 使用Navicat连接oracle数据库时报错Error - OCI_INVALID_HANDLE。上一刻正常执行的SQL也报了这个错误。
网上给出了很多的解决办法,比如:突然断电或者oracle进程杀掉了; 查看oci.dll应用版本和服务器版本是否一致等等。我采用的是重启Navicat。虽然暂时性的解决问题,但并不是长久之计,感觉Navicat对mysql的支持性比较好,建议使用plsql工具。如果有高手路过希望可以给出正确的解决办法,不胜感激。。。
9. ORA-01830:日期格式图片在转换整个输入字符串之前结束
错误原因:
date类型不能包含秒以后的精度,如日期:2012-06-20 21:01:24,如果使用to_date()函数来处理这种格式的时间,就会出现这种错误。
解决方案:
把to_date(date,’yyyy-mm-dd’)改成to_date(substr(date,1,10),’yyyy-mm-dd’),如果date本身不是字符串格式,在使用substr之前还需要先用to_char()转换成字符串类型,并且在使用substr时,注意验证取数长度,也就是substr函数的第二、三个参数。
10.ORA-00955: 名称已由现有对象使用
可能的原因:
1)表重名;
2)列重名;
3)在Oracle里写了drop table if exists这样的语句。
解决方案:
如果出现了第三种情况,果断把if exists删掉就好了,这个在Oracle里是错误写法,主要还是SQL语言可移植性差。如果没出现第三种情况,那就检查表名和列名的重名情况吧。
11.ORA-00904:标示符无效
可能的原因:
1)列名写错了,和数据表中的列名不一致
2)中文列名没带引号
12.ORA-00923:未找到要求的 FROM 关键字
可能的原因:
取别名的时候用了关键字,比如用size、date之类的做列名
解决方案:
别名的选择尽量避开这些关键字,最好是所有的列名都避开这些关键字。
13..Oracle数据库ORA-00911: 无效字符 问题和解决
在Java程序中,出现此错误。原因竟然是xml中的sql语句中在结尾写了分号导致的!!!删除即可。
ORA-00911:invalid character
可能的原因:
这个问题是在Python中写SQL代码的时候碰到的。因为Python里的SQL代码不能有分号,但是在SQL里写代码的时候习惯带分号,所以出现了这个错。
解决方案:
删掉分号就好了,其实在SQL里执行SQL语句也可以没有分号的,所以我现在都直接不写分号了,复制到Python里运行自然也就不会出现这个错误了。
14.ORA-01840: 输入值对于日期格式不够长
可能的原因:
1)日期本身不对,比如写了2月29日,结果根本没有这天
2)时间格式不对,比如你要求转换成带时分秒的,结果字符串并没有这么长
解决方案:
检查数据类型、格式、数据是否正确,时间上出的错,大都是这么检查,然后用to_char,substr和改变要转换的时间格式来组合解决问题。
15.ORA-12519, TNS:no appropriate service handler found
java连接oracle数据库,对接第三方的数据,接收到的数据有三千条左右,执行过程中程序出现此错误。
此时在navicat中运行SQL又出现这个错误:Error - OCI_INVALID_HANDLE。
java程序中的错误是因为数据量太大导致的,修改最大连接数即可。
--当前连接数
select count(*) from v$process;
--允许最大连接数 (默认是150)
select value from v$parameter where name = 'processes';
//下面这两个也可以查到相关信息
SHOW PARAMETER SESSION; (查询session信息,我的session是170)
SHOW PARAMETER PROCESS;(查询processes信息)
--修改最大连接数(把processes改成500就好了)
alter system set processes = 500 scope = spfile;
记得一定要重启oracle服务,再运行 sql命令 select value from v$parameter where name = 'processes'; 看看processes是不是500。
日常问题的积累,如有不足,欢迎指正。望不吝赐教!!!后续会持续总结。。。