美文网首页
Oracle常见错误及解决方案汇总

Oracle常见错误及解决方案汇总

作者: S等价交换S | 来源:发表于2019-05-22 16:07 被阅读0次

    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就报错了。

    相关文章

      网友评论

          本文标题:Oracle常见错误及解决方案汇总

          本文链接:https://www.haomeiwen.com/subject/cmnnaqtx.html