Oracle常见错误及解决方案汇总
1、 错误提示ORA-00933: SQL command not properly ended in?
可能的原因:
1)语句写的顺序不正确,比如WHERE语句写在了GROUP BY后面;
2)使用了含有ORDER BY或INNER JOIN子句的INSERT、DELETE语句;
3)使用了含有INNER JOIN子句的UPDATE语句;
4)使用了条件中含有自连接表字段比较的Triangular Join;
解决方案:
检查语句的子句组合是否正确,检查语句的使用顺序是否正确,比如GROUP BY是否放在WHERE之后,ORDER BY是否放在GROUP BY之后。
参考链接:https://www.cnblogs.com/baiyangcao/p/oar-00933-insert-into-select.html
2、 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函数的第二、三个参数。
3、ORA-01652:无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
这个问题是我同事遇到的,我和她运行同样的代码,但是我的没错,她的出现了这个错误,而且她把整段代码删除后重贴,错误就解决了,很奇怪。
可能的原因:
1)临时表空间大小做了限制,而当进行order by、group by这些排序相关的运算,或者访问视图等操作时,空间大小受到限制就会出现这类错误。
2)还有一种我自己猜测的原因,就是在写join的时候,没有注意到匹配条件,导致产生了笛卡尔积,那么基本表很大的情况下,再大的临时表空间也可能会不够用,所以写join或者用where子句实现join功能的时候,一定要注意匹配条件。
解决方案:
扩展临时表空间(这个一般如果自己不会,可以找DBA帮忙?):
方法一、增大临时文件大小:
SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize100m;
Database altered.
方法二、将临时数据文件设为自动扩展:
SQL> alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited;
参考链接:https://www.cnblogs.com/songling/archive/2011/03/04/1970965.html
4、ORA-00955: 名称已由现有对象使用:
可能的原因:
1)表重名;
2)列重名;
3)在Oracle里写了drop table if exists这样的语句。
解决方案:
如果出现了第三种情况,果断把if exists删掉就好了,这个在Oracle里是错误写法,主要还是SQL语言可移植性差。如果没出现第三种情况,那就老实检查表名和列名的重名情况吧。
5、ORA-01861: 文字与格式字符串不匹配:
可能的原因:
使用to_date函数时,且很有可能转换的参数是一个未可知的格式,时间参数的格式和要转换的格式不匹配,这个原因和ORA-01830错误类似,解决方案也类似,要保证时间参数的类型、格式,时间处理函数都没有出错才行,而且时间处理函数在每个数据库里都不太一样,要尤其注意。
解决方案:
先把要转换的参数换成字符串格式,再用to_date函数,更保险一点。
6、ORA-00904:标示符无效
可能的原因:
1)列名写错了,和数据表中的列名不一致
2)中文列名没带引号
7、ORA-00979: 不是 GROUP BY 表达式:
可能的原因:
SELECT子句里用到的除了count等计算函数里用到的列以外,其他的列没有在GROUP BY子句里写出来。因为数据库有这个要求,除了函数里面的列名,其他的必须前后都有。
解决方案:
老实在GROUP BY里面把列名都加上。不过如果想在SELECT里面取很多列,还加上计算函数的输出结果,也是不太现实,因为一般计算函数都是针对多行而言的,如果在SELECT子句里写了一些唯一标识的字段,比如id类字段,那么在GROUP BY里也必须加上这个字段,那COUNT也就没意义了。所以如果又要计算,又要取很多列,可能还是老实做join比较靠谱。
8、ORA-00923:未找到要求的 FROM 关键字
可能的原因:
取别名的时候用了关键字,比如用size、date之类的做列名
解决方案:
别名的选择尽量避开这些关键字,最好是所有的列名都避开这些关键字。
9、ORA-00937: not a single-group group function
原因和解决方案都和ORA-00979类似
10、ORA-00911:invalid character
可能的原因:
这个问题是在Python中写SQL代码的时候碰到的。因为Python里的SQL代码不能有分号,但是在SQL里写代码的时候习惯带分号,所以出现了这个错。
解决方案:
删掉分号就好了,其实在SQL里执行SQL语句也可以没有分号的,所以我现在都直接不写分号了,复制到Python里运行自然也就不会出现这个错误了。
11、ORA-01476: 除数为 0:
可能的原因:
计算除法的时候,分母为0
解决方案:
用decode函数在判断分母为0的时候把分母设为不为0的函数即可。比如decode(num,0,1) 。
12、ORA-01840: 输入值对于日期格式不够长
可能的原因:
1)日期本身不对,比如写了2月29日,结果根本没有这天
2)时间格式不对,比如你要求转换成带时分秒的,结果字符串并没有这么长
解决方案:
检查数据类型、格式、数据是否正确,时间上出的错,大都是这么检查,然后用to_char,substr和改变要转换的时间格式来组合解决问题。
13、SQL执行错误#1248,提示Every derived table must have its own alias
可能的原因:
出现这个错误时,我写了很多个select语句,就是层层过滤需要的信息,实现的功能是从一个表中先获取所有属于某个班的学生的id,再根据这些id从另一个表中获取这些学生所有课程的成绩得分,再从这次过滤的结果中根据课程进行Group by求均值。前面两个select语句都没出错,写到第三个的时候就报了这个错。
解决方案:
在用select过滤数据形成一个新的临时表时,最好用as给这个表定义一个别名。如下:
select t.cno,avg(t.degree) from
(select * from score where sno in
(select sno from student where class=95033)) as t #这里写了三个select语句,如果不重名名的话,会报错
group by t.cno
1
2
3
4
不写as t就报错了。