oracle常见错误及解决方案积累

1.ORA-00933:SQL command not properly ended in?

  可能原因:

  1.   SQL语句写的不正确,比如where语句写在了group by 后面。
  2. 使用了含有order by或者inner join子句的insert 、delete语句。
  3. 使用了含有inner join子句的update语句。
  4. 使用了条件中含有自连接表字段比较的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。

日常问题的积累,如有不足,欢迎指正。望不吝赐教!!!后续会持续总结。。。

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/111590942