设为首页 收藏本站
查看: 685|回复: 0

[经验分享] Oracle的语句失败以及解决方法

[复制链接]

尚未签到

发表于 2018-9-22 09:40:13 | 显示全部楼层 |阅读模式
  当使用Oracle数据库管理企业数据或者商业数据时,应用开发人员、用户和DBA(Database Administrator,数据库管理员)可能会遭遇不同类型的失败。失败不同,Oracle所提供的处理方法也有所不同。有些失败需要DBA进行恢复,而有些失败不需要任何用户进行干预。Oracle失败包括语句失败、用户错误、进程失败、网络失败、例程失败和介质失败六种类型,下面简述下语句失败以及解决方法。
           1.1.1         语句失败
  语句失败是指处理SQL语句出现逻辑失败。当出现语句失败时,Oracle Server会自动回退失败的SQL语句,并且会给用户返回错误代码和错误消息。通过查看错误代码和错误消息,应用开发人员和DBA可以确定错误原因,并解决这些错误。下面介绍常用的语句失败及其解决方法。
  1.       应用逻辑错误
  应用逻辑错误主要是指SQL语句的编写错误,例如在未连接到数据库的情况下执行SQL语句。改类错误应该由应用开发人员解决,而不是DBA的责任。错误示例如下:
  SQL>UPDATE  emp  set  sal=1000  WHERE  empno=7788;
  SP2-0640:未连接
  为了防止出现上述错误,首先需要以正确的用户连接到Oracle数据库,然后再执行相应的SQL语句。解决示例如下:
  D:\>sqlplus sys/oracle as sysdba(本地)
  已连接。
  SQL>UPDATE  emp  SET  sal=1000  WHERE  empno=7788;
  已更新1行。
  2. 输入错误数据
  输入错误数据是指用户试图输入违反约束规则的错误数据。假定在EMP.SAL列(emp.表名,SAL.列名)上定义了CHECK约束,并且该CHECK约束要求工资必须在800~5000之间,如果在执行INSERT语句或UPDATE   语句时输入的工资值不在该范围内,那么执行SQL语句会出现失败。错误示例如下:
  SQL> update emp set sal=6000 where empno=7788;
  update emp set sal=6000 where empno=7788
  *
  第一行出现错误:
  ORA-02290:违反检查约束条件(SCOTT.SYS_C005298)
  为了解决错误数据的输入问题,应该仔细核对要输入的数据,然后输入正确的数据重新执行语句。解决示例如下:
  SQL> update emp set sal=6000 where empno=7788;
  已更新 1 行。
  3.执行未授权操作
  执行未授权操作是指数据库用户试图执行未被授权的数据库操作。假定SMITH用户不具备SELECT ANY TABLE系统权限,并且在SCOTT.EMP表上不具备任何对象权限,那么当该用户访问SCOTT.EMP表时将会显示错误信息。错误示例如下:

  SQL> create user smith>  用户已创建。

  SQL>>  用户已更改。(给用户解锁)
  SQL> grant create session to smith;
  授权成功。(授予连接会话权限)
  D:\>sqlplus smith/oracle
  SQL> select ename,sal from scott.emp where deptno=10;
  select ename,sal from scott.emp where deptno=10
  *
  第 1 行出现错误:
  ORA-00942: 表或视图不存在
  如上所示,因为SMITH用户在scott.emp表上不具备任何权限,所有当查询该表时会显示错误信息。为了解决这种错误,应该为用户授予必需的权限。解决示例如下:
  D:\>sqlplus sys/oracle as sysdba
  SQL> grant select on scott.emp to smith;
  授权成功。
  D:\>sqlplus smith/oracle
  SQL> select ename,sal from scott.emp where deptno=10;
  ENAME             SAL
  ---------- ----------
  CLARK            2450
  KING             5000
  MILLER           1300
  4. 超出空间配额
  超出空间配额是指用户在特定表空间上所需实际空间超过了该用户在该表空间上可占用的最大空间。假定smith用户在user01表空间上具有1m的空间配额,并且其对象已经在user01表空间上占用了900k的空间,如果该用户要建立的新表所需空间超过200K,那么建表将会出现失败。错误示例如下:
  SQL> create tablespace user01
  2  datafile 'E:\oracle\product\10.2.0\oradata\orcl\user01.dbf'>200M;
  表空间已创建。(创建表空间)

  SQL>>  用户已更改。(授予用户使用表空间权限)
  SQL> grant create table to smith;
  授权成功。(授予用户创建表权限)
  
  create table temp(cola int,colb int) storage(minextents 4)
  *
  第1行出现错误:
  ORA-01536:超出表空间’USERO1’的空间限额
  为了解决这种错误,应该以DBA身份登录到数据库,使用ALTER USER语句为用户分配更多的空间配额,然后重新执行相应语句。解决示例如下:
  D:\>sqlplus sys/oracle as sysdba
  SQL>alter user smith quota 100m on user01;
  用户已更改。
  D:\>sqlplus smith/oracle
  SQL> create table temp(cola int,colb int) storage(minextents 4);
  表已创建。
  5.表空间无足够空间
  表空间无足够空间是指当SQL操作需要从表空间分配空间时,表空间没有足够剩余空间所导致的错误。当用户执行Create Table语句、INSERT语句或UPDATE语句、使用SQL*Loader装载数据时,可能会导致在表空间中分配区。如果表空间没有足够的剩余空进啊,那么分配区将会失败。错误示例如下:
  SQL> insert /*+append*/ into sales value (select * from temp);
  Insert /*+append*/ into sales value (select * from temp)
  第一行出现错误:
  ORA-01653:表SMITH.SALES无法通过8 (在表空间USER01中)扩展
  如上所示,当用户试图将TEMP表数据装载到SALES表时,因为表空间USER01没有足够的剩余空间,从而导致了以上错误。从技术角度讲,DBA应该确保表空间具有足够空间,以避免出现该类错误。但如果出现了这种错误,DBA应该扩展表空间。解决示例如下:
  SQL> conn system/oracle
  SQL>>10m autoexend on next 10m;
  SQL> conn smith/oracle
  已连接。
  SQL> insert /*+append*/ into sales value (select * from temp);
  已创建280000行。
  《待续》
  
  SQL>create table temp(cola int,colb int) storage(minextents 4);


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-599787-1-1.html 上篇帖子: Oracle Minus 取差集 下篇帖子: Oracle BIEE在linux下的安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表