你特定的执行可能和这个错误类型相似,但是错误号和名称可能不同。我们使用SQL*PLUS来运行我们的SQL语句,并设置ECHO和FEEDBACK为开的状态来查看声明。
记住,一些错误会产生错误信息,而另一些可能只是在逻辑上不充分,它们将不可避免的在接下来引起重大的错误。如果你严格关注细节,你可以避免大多数错误,尽管你还总是会偶尔发现错误。
常见错误
本节描述了许多你在执行所有类型的SQL语句时会得到的常见错误。大多数都很简单,简单到使你想踢自己一脚,而其它的看起来很明显的错误则是由于理解错误而产生的。
表或视图不存在
当你收到一个错误声明你要访问的表不存在时,这是很容易查证的;例如:
输入:
SQL> @tables.sql
输出:
SQL> spool tables.lstSQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select owner|| '.' || table_name
2 from sys.dba_table
3 where owner = 'SYSTEM'
4 order by table_name
5 /
from sys.dba_table
*
ERROR at line 2:
ORA-00942: table or view does not exist
SQL> spool off
SQL>
分析:
注意在table 单词下面的星号。正确的表名是sys.dba_tables 。而之前的表名里缺少了s。
但是如果你知道这个表确实存在而你仍然收到了这个错误信息呢?有的时候当你收到了这个错误时,这个表事实上是存在的,但是可能有个安全问题——那就是,这个表存在,但是你没有权限访问它。这个错误还可能是数据库服务器对“你没有权限访问这个表!”的一种委婉的说法。
提示: 在你惊慌之前,如果有可用的DBA帐户,立即使用一个DBA帐户验证这个表是否存在,或者使用schema 帐户。你会经常发现表确实存在,而是这个用户缺乏适当的权限来访问它。
无效的用户名和密码
输入:
SQL*Plus: Release 3.2.3.0.0 - on Sat May 10 11:15:35 1997 Copyright (c) Oracle Corporation 1979, 1994. All rights reserved. Enter user-name: rplew Enter password:
输出:
ERROR: ORA-01017: invalid username/password; logon denied Enter user-name:
这个错误的原因是输入了不正确的用户名或不正确的密码。再试一次。如果还不成功,重置你的密码。如果你确定你输入了正确的用户名和密码,并且你对不只一个的数据库具有权限,那么确保你正在试图连接的是正确的数据库。
没有指定FROM关键字
输入:
SQL> @tblspc.sql
输出:
SQL> spool tblspc.lstSQL> set echo on
SQL> set feedback on
SQL> set pagesize 1000
SQL> select substr(tablespace_name,1,15) a,
2 substrfile_name, 1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;
substrfile_name, 1,45) c, bytes
*
ERROR at line 2:
ORA-00923: FROM keyword not found where expected
SQL> spool off
SQL>
分析:
这个错误可能令人误解。有关键字FROM,但是你在第二行上在substr和file_name之间丢失了一个左括号。这个错误还可能是由于在SELECT语句中的字段名称之间丢失了逗号而引起的。如果在SELECT语句中一个字段后没有跟着一个逗号,这个查询处理器会自动查找FROM关键字。上面的语句修改如下:
SQL> select substr(tablespace_name,1,15) a, 2 substr(file_name,1,45) c, bytes
3 from sys.dba_data_files
4 order by tablespace_name;
这里不允许使用Group功能
输入:
SQL> select count(last_name), first_name, phone_number 2 from employee_tbl
3 group by count(last_name), first_name, phone_number
4 /
输出:
group by count(last_name), first_name, phone_number *
ERROR at line 3:
ORA-00934: group function is not allowed here
SQL>
分析:
对于任何group功能, COUNT不能用在GROUP BY条件中。你只可以列出字段和非group功能,例如在GROUP BY 中使用SUBSTR条件。
提示: COUNT是一个作用于查询中的group上的功能。
上一个语句使用适当的语法修改如下:
SQL> select count(last_name), first_name, phone_number 2 from employee_tbl
3 group by last_name, first_name, phone_number;
温馨提示:内容为网友见解,仅供参考