导航

Oracle失败──语句失败

Posted on 2008-08-21 14:48  毅无涯  阅读(601)  评论(0编辑  收藏  举报

       语句失败是指处理SQL语句时出现逻辑失败。当出现语句失败时,Oracle Server会自动回退失败的SQL语句,并且会给用户返回错误代码和错误消息。

        1,应用逻辑错误

       应用逻辑错误主要指SQL语句的编写错误。例如在未连接DB的情况下执SQL语句。该类错误应该由开发人员解决,而不是DBA的责任。

       Example:

       SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 21 11:51:02 2008

        Copyright (c) 1982, 2005, Oracle.  All rights reserved.

        SQL> select * from emp where rownum < 2;
        SP2-0640: 未连接
        SQL>

       解决方法:需要以正确的用户连接到Oracle DB,然后再执行相应的SQL语句。

        SQL> connect scott/tiger@orcl
        已连接。
        SQL> set pagesize 50
        SQL> set linesize 600
        SQL> select * from emp;

            EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
        ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             7369 SMITH       CLERK            7902 17-12月-80            800                       20

        SQL>

 

        2,输入错误数据

       输入错误数据是指用户试图输入违反约束规则的错误。

       Example:

       SQL> Alter Table EMP Add Constraint CHK_SAL CHECK(SAL>=800 AND SAL<=5000);

       表已更改。

       SQL> UPDATE EMP SET SAL = 100 WHERE EMPNO = 7788;
       UPDATE EMP SET SAL = 100 WHERE EMPNO = 7788
       *
       第 1 行出现错误:
       ORA-02290: 违反检查约束条件 (SCOTT.CHK_SAL)

       解决方法:仔细审核要输入的数据,然后输入正确的数据重新执行SQL。

       SQL> UPDATE EMP SET SAL = 1000 WHERE EMPNO = 7788;

       已更新 1 行。

       SQL>

 

       3,执行未授权操作

       执行未授权操作是指DB用户试图执行未被授权的DB操作。

       Example:

       SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 21 13:05:46 2008

        Copyright (c) 1982, 2005, Oracle.  All rights reserved.

        SQL> connect / as sysdba
        已连接。
        SQL> Create User TEST Identified by TEST;

        用户已创建。

        SQL> Grant connect to TEST;

        授权成功。

        SQL> connect test/test@orcl
        已连接。
        SQL> select * from scott.emp where rownum < 2;
        select * from scott.emp where rownum < 2
                                   *
        第 1 行出现错误:
        ORA-00942: 表或视图不存在

       解决方法:为用户授予必需的权限。

       SQL> connect scott/tiger@orcl
        已连接。
        SQL> Grant SELECT On EMP To TEST;

        授权成功。

        SQL> conn test/test@orcl
        已连接。
        SQL> select empno, ename from scott.emp where rownum < 2;

             EMPNO ENAME
        ---------- ----------
              7369   SMITH

 

       4,超出空间配额

       超出空间配额是指用户在特定表空间上所需实际空间超过了该用户在该表空间上可占用的最大空间。

       Example:

       SQL> conn / as sysdba
       已连接。
       SQL> Alter User TEST Quota 3K On Users;

       用户已更改。

       SQL> Grant Create Any Table to TEST;

       授权成功。

       SQL> conn test/test@orcl;
       已连接。
       SQL> Create Table TableA
         2  (
         3    ColA varchar2(50),
         4    ColB varchar2(100)
         5  )
         6   TableSpace Users;
       Create Table TableA
       *
       第 1 行出现错误:
       ORA-01536: 超出表空间 'USERS' 的空间限额

       解决方法:使用DBA身份登录到DB,使用Alter User语名为用户分配更多的空间配额,然后重新执行。

       SQL> conn / as sysdba
       已连接。
       SQL> Alter User TEST Quota 50M On Users;

       用户已更改。

       SQL> conn test/test@orcl
       已连接。
       SQL>  Create Table TableA
         2   (
         3     ColA varchar2(50),
         4     ColB varchar2(100)
         5   )
         6    TableSpace Users;

       表已创建。

       SQL>

 

       5,表空间无足够空间

       表空间无足够空间是指当SQL操作需要从表空间分配空间时,表空间没有足够剩余空间所导致的错误。

      Example:

       SQL> connect new/new@orcl
       已连接。
       SQL> Grant Select On Stock To Test;

       授权成功。

       SQL> connect test/test@orcl
       已连接。

       SQL> insert /*+append*/into tablea value(select colA,colB from new.temp);
       insert /*+append*/into tablea value(select colA,colB from new.temp)
       *
       第 1 行出现错误:
       ORA-01653: 表 TEST.TABLEA 无法通过 128 (在表空间 USERS 中) 扩展

       解决方法:扩展表空间

       SQL> conn / as sysdba
       已连接。
       SQL> ALTER TABLESPACE "USERS" ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF' SIZE
       500M;

       表空间已更改。

       SQL> insert /*+append*/into tablea value(select colA,colB from new.temp);

       已创建8045614行。

       SQL>