ORACLE 使用过程中,及调试plsql脚本过程中,碰到的错误,及其解决办法。不断更新...
ORA-20000 问题的解决:
ORA-20000: 是因为overflow,一般方法为设置值大一些。
set long 10000;
set linesize 10000;
set serverout on size 10000;
下面是可能出现的几种情况。
1 ORU-10027:buffer overflow limit of 2000 bytes;
方法1:set serveroutput on size 10000000 //设置大点,默认为2000 bytes
方法2:exec dbms_output.enable(999999999999999999999); //默认为2000 bytes
2 ORU-10028:line length overflow,limit of 255 chars per line ;
oracle 10g release2中取消了255个字节的限制。之前的版本,会有255字节的限制。
上面的设置调整都不起作用。在10.2前的版本,对于不太长的内容,可以使用SUBSTR函数来解决这个问题。不确定长度的,目前还没找到解决办法。
ORA-03113 ,ORA-03114
多表查询full outer join的时候,可能会出现ORA-03113:end-of-file on communication channel ,ORA-03114:not connected to ORACLE错误。原因之一是oracle底层的BUG。
解决方法:
方法1 将数据库打补丁,升级至10.2.0.4.0及以上。
方法2 如果不能升级数据库,那么也可以使用left outer join和right outer join查询,然后union all两个结果集来得到full outer join的结果。
ORA-14452
ORA-14452 attempt to create, alter or drop an index on temporary table already in use
创建更改或者删除临时表操作时,产生的错误,因为表还有session在使用。或者表中还有数据。
可能的解决方法
方法1 查看临时表的使用情景,是否是要用到事务级的临时表。
方法2 在删除表前,先trancate表数据。
方法3 kill掉使用的session(会影响到其他session的操作)
查出使用该临时表的session:
sql>select ss.sid, ss.SERIAL#, ss.PROGRAM, ss.OSUSER, ss.SCHEMANAME, ss.MACHINE, ss.TERMINAL
from v$lock l, user_objects o, v$session ss
where ss.SID = l.SID and l.ID1 = o.OBJECT_ID and o.OBJECT_NAME = 'TTEMP_KHZLDR'
根据查到的sid和serial#,把session kill掉。
sql>alter system kill session 'sid, serial#';
ORA-08103
ORA-08103: object no longer exists
产生:存储过程用到了临时表。
纠错:在提交后使用了临时表中的数据。查看是否设置了自动提交,或者事务提交前,使用时表数据已经被清空或表被删除。