关于ORA-01812错误是怎么产生的?如何新闻发布避免产生金句

ORA-01555错误分析_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ORA-01555错误分析
上传于||文档简介
&&O​R​A​-15错​误​分​析
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢关于ORA-01013的问题,紧急求助!!!!三千兄,救救我啊...
[问题点数:100分,结帖人zhaoyan]
关于ORA-01013的问题,紧急求助!!!!三千兄,救救我啊...
[问题点数:100分,结帖人zhaoyan]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2003年2月 其他数据库开发大版内专家分月排行榜第三
2004年2月 Oracle大版内专家分月排行榜第三2003年8月 Oracle大版内专家分月排行榜第三
2003年1月 Oracle大版内专家分月排行榜第二2002年10月 Oracle大版内专家分月排行榜第二
2002年12月 Oracle大版内专家分月排行榜第三2002年8月 Oracle大版内专家分月排行榜第三
2004年2月 Oracle大版内专家分月排行榜第三2003年8月 Oracle大版内专家分月排行榜第三
2003年4月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&博客访问: 132144
博文数量: 47
博客积分: 2014
博客等级: 上尉
技术积分: 480
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
一.错误描述 ORA-1157, "cannot identify/lock data file %s - see DBWR trace file" 引起的原因: 因为数据文件已经在被使用了从而导致数据库的后台进程不能找到相应的数据文件或者不能锁定相应的数据文件,这样数据库将禁止访问这些数据文件而其他的数据文件则没有影响。伴随这个错误操作系统将会提示是哪个数据文件不能被识别。 ORA-01157错误一般和ORA-01110错误一起出现,往往还有操作系统级别上的错误,例如ORA-07360,同时一个DBWR的trace文件会在background_dump_dest的目录下生成。例如,在Solaris的平台上,会有如下的错误信息显示: ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: '/export/home/Oracle/oradata/817/users01.dbf' 然后查看DBWR的trace文件内容,会有如下的内容: ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: '/export/home /Oracle/oradata/817/users01.dbf' ORA-27037: unable to obtain file status SVR4 Error: 2: No such file or directory Additional information: 3 下面就几个容易产生ORA-1157错误的方面详细谈谈: 二. 通常引起ORA-1157错误的原因和解决方法 如果你是使用Oracle9i,就用SQLPLUS代替SVRMGRL执行以下的命令。 1. 数据文件存在,但是Oracle认不到它 这种情况可能是在操作系统级上数据文件被重命名了或者移动到了一个新的分区或者位置,这种情况比较简单,只是需要将数据文件恢复成原始的数据文件名字或者重新命名数据文件到一个新的位置/目录就可以解决问题了。 重新命名数据文件到一个新的位置/目录的方法: A. 数据库是打开状态的 1)查看那个数据文件所在的表空间还包含有哪些数据文件,执行以下查询: SELECT FILE_NAME, STATUS FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = ''; 2)确定所有数据文件的状态都是可用的。 3)把表空间变成只读表空间: ALTER TABLESPACE
READ ONLY; 4)确定在数据字典中表空间是显示为只读的: SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = ''; TABLESPACE_NAME STATUS ------------------------------ ---------
READ ONLY 5)用操作系统命令拷贝数据文件到一个新的位置,拷贝完成后把整个表空间 OFFLINE,这个时候用户是不能访问这个表空间的: ALTER TABLESPACE
OFFLINE; 6)重命名这个数据文件到一个新的位置了,这个操作会自动的更新控制文件中的内容: ALTER DATABASE RENAME FILE '/FULL_PATH_OF_OLD_LOCATION/AND_DATAFILE_NAME.DBF' TO '/FULL_PATH_OF_NEW_LOCATION/AND_DATAFILE_NAME.DBF'; 7)ONLINE这个表空间: ALTER TABLESPACE YOUR_TABLESPACE_NAME ONLINE; 8)把这个表空间置成可读写的状态: ALTER TABLESPACE YOUR_TABLESPACE_NAME READ WRITE; 9)在操作系统级上删除原来旧的数据文件。 B.数据库是关闭状态的 1) 先正常关闭数据库。 2) 用操作系统命令拷贝数据文件到一个新的位置。 3) MOUNT数据库,这样将读取控制文件,但是不会读取数据文件: STARTUP MOUNT 4) 重命名这个数据文件到一个新的位置了,这个操作会自动的更新控制文件中的内容: ALTER DATABASE RENAME FILE '/FULL_PATH_OF_OLD_LOCATION/AND_DATAFILE_NAME.DBF' TO '/FULL_PATH_OF_NEW_LOCATION/AND_DATAFILE_NAME.DBF'; 5) 打开数据库: ALTER DATABASE OPEN; 2. 数据文件不存在或者对于Oracle来说是不可用的 数据文件被物理的移走了或者损坏导致Oracle不能再认到了,例如数据文件被截断或者覆盖了,一般会出现ORA-27046、ORA-1157的错误提示: ORA-27046: file size is not a multiple of logical block size 这种情况下可以有两种选择去解决问题: A. 重建数据文件所属的那个表空间 这种方法比较适用于USERS、TEMP、INDEX表空间,如果数据库是正常关闭的,也就是说回滚段中没有激活的表空间事务,也推荐使用这种方法。如果是SYSTEM表空间,则要重建数据库了。 具体步骤如下: 1) MOUNT数据库: STARTUP MOUNT PFILE=''; 2) OFFLINE DROP数据文件: ALTER DATABASE DATAFILE '' OFFLINE DROP; 3) 打开数据库: ALTER DATABASE OPEN; 4) 删除表空间: DROP TABLESPACE
INCLUDING CONTENTS; 5) 重建表空间: CREATE TABLESPACE
DATAFILE ' SIZE ; 6) 重建表空间中所有以前存在的对象:可以使用以前创建对象的脚本或者利用最近可用的EXPORT DUMP来重建以前存在的对象。 B.用正常的恢复过程去恢复数据文件 这种方法比较适用于只读表空间或者那种不能用重建表空间的方法的USERS和INDEX表空间。如果是回滚段表空间,那必须要求数据库是正常关闭的才能使用这个方法。如果是SYSTEM表空间,并且备份和所有的归档日志都全的情况下,强烈建议使用这种方法去恢复的,但是如果是非归档方式,则就只能利用当前所有的联机日志进行恢复了。 在很多的情况下,重建表空间是不可能的或者是非常费时费力的,因此,从备份和利用归档日志恢复数据文件是一种比较好的方法,尤其是对于只读表空间来说,因为没有数据的写入和更改,因此直接用备份来恢复是最快最省事的。 具体步骤如下: 1) 从备份中恢复丢失或者损坏的数据文件。 2) MOUNT数据库: STARTUP MOUNT PFILE=''; 3) 执行以下的查询: SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE# FROM V$LOG V1, V$LOGFILE V2 WHERE V1.GROUP# = V2.GROUP#; 这个查询将列出所有联机重做日志以及它们所代表的SEQUENCE和FIRST CHANGE NUMBER. 4) 如果数据库是非归档状态下的,执行以下的查询: SELECT FILE#, CHANGE# FROM V$RECOVER_FILE; 如果CHANGE#大于最小的联机重做日志文件的FIRST_CHANGE#,那么数据文件可以被恢复,记住恢复数据文件的时候要应用所有的联机重做日志文件,然后到第5步。 如果CHANGE#小于最小的联机重做日志文件的FIRST_CHANGE#,那么这个数据文件将不能被恢复了,那么只能从最近的数据库全备份恢复或者重建这个数据文件所属的表空间了。 5) 恢复数据文件: RECOVER DATAFILE ''; 6)确认所有的归档日志都被应用了直至出现"Media recovery complete"的提示信息,如果Oracle提示有一个不存在的归档日志文件,那么就可能要应用所有的联机重做日志文件来恢复直至出现"Media recovery complete"的提示信息。 7) 打开数据库: ALTER DATABASE OPEN; 3. 数据库临时表空间的数据文件的丢失 当数据库的临时表空间的数据文件丢失也会引起ORA-01157的错误。因为数据库对临时表空间的数据文件不会发生检查点,所以这个时候数据库照样能够打开。这种情况下的解决方法是逻辑上删除临时表空间的数据文件,并且重新增加一个新的临时表空间的数据文件。 例如: SELECT * FROM DBA_OBJECTS ORDER BY OBJECT_NAME; select * from dba_objects order by object_name; * ERROR at line 1: ORA-01157: cannot identify/lock data file 5 - see DBWR trace file ORA-01110: data file 5: '/Oracle/oradata/temp01.dbf' ALTER DATABASE TEMPFILE ‘/Oracle/oradata/temp01.dbf‘ DROP; SELECT TABLESPACE_NAME,FILE_NAME FROM DBA_TEMP_FILES; ALTER TABLESPACE TEMP ADD TEMPFILE ‘/Oracle/oradata/temp01.dbf‘ SIZE 100M; 三.由于操作系统的问题或者第三方软件的问题导致ORA-01157错误 1. 当使用vxfddstat去访问快速I/O或者其它的应用,会获得"Cannot open file"的错误,而Oracle会返回如下的错误: ORA-01157: cannot identify data file 1 - file not found ORA-01110: data file 1: '' 这个时候用户应该去联系Veritas的技术支持,技术支持网站网址为/。 2. 在HP-UNIX的机器上,如果系统核心参数nflock设置不是足够大的时候,这样可能会使Oracle不能锁定所需要的数据文件而导致错误: ORA-27086: skgfglk: unable to lock file - already in use 或者错误: ORA-01157: cannot identify/lock data file 4 - see DBWR trace file ORA-0110: data file 4: '/Oracle/oradata/user01.dbf' ORA-27041: unable to open file HP-UX Error: 23: File table overflow Additional information: 2 或者错误: ORA-07445: exception encountered: core dump [%s] [%s] [%s] [%s] [%s] [%s] ORA-01110: data file %s: '%s' ORA-01242: data file suffered media failure: database in NOARCHIVELOG mode ORA-01115: IO error reading block from file %s (block # %s) ORA-27041: unable to open file HP-UX Error: 23: File table overflow Additional information: 3 解决这个问题的方法是增大相关的核心参数:(建议以下的配置) nproc 4096 Max Number of Processes nfile 63488 Max Number of Open Files nflocks 4096 Max Number of File Locks 3. 如果Oracle需要的数据文件被其他进程锁定的条件下也会导致这个错误。 例如:备份软件将可能锁定要备份的数据文件 在WINDOWS上可能会有如下的错误: ORA-01157: signalled during alter database open ORA-01157: can not identify datafile
ORA-01110: datafile
path and filename of datafile ORA-27047: Unable to read header of file
OSD-04006: Read file failure Error 33: process can not access file 操作系统错误33是一个error_lock_violation,表明一部分数据文件被WINDOWS的其他进程锁定了。 或者错误: ORA-1157 - cannot identify datafile
- file not found ORA-1110 - datafile :
ORA-9202 - sfifi: error identifying file OSD-4006(OS 203) - The System could not find the environment option that was entered 在ALERT文件中将会同时出现以下的错误: ORA-1115 - IO error reading block from file %s (block # %s) ORA-1110 - datafile :
ORA-9206 - sfrfb: error reading from file OSD-4006(OS 203) - The System Could not find the environment option that was entered 或者错误: ORA-1242 - data file suffered media failure: database in NOARCHIVELOG mode ORA-1114 - IO error writing block to file
ORA-9205 - sfqio: error reading or writing to disk OSD-4016(OS 33) - The process cannot access the file because another process has locked a portion of the file 另外还可能会出现以下错误: KCF: write/open error dba=0x703473d block=0x3473d online=1 file=7 E:Oracledatagreccrecind2.dbf error=9211 txt: 'OSD-4008 : WriteFile error (OS 203) - The System Could not find the environment option that was entered 某些情况下ALERT文件中会出现: Instance terminating due to error 1110. Instance terminated by
PID=XXX 或者:
TERMINATING INSTANCE DUE TO ERROR 472 ORA 472 - PMON process terminated with error 在WINDOWS的事件查看器中可以看到以下事件: 23 Error ReadFile() failure 25 Error WriteFile() failure 如果这是个冷备份,那就要等冷备份完成后启动数据库或者结束冷备份启动数据库。对于备份软件,最好都配置成不要锁定打开的数据文件的备份方式。 这种情况的解决方法是手工的清除在数据文件上的锁: 1) 运行ps -ef | grep ,查出在数据文件上已经存在的进程。 2) 运行kill –9 进程ID 4.使用WINDOWS的FILE MANAGER拷贝Oracle的数据文件的时候也会引起ORA-01157的错误,例如文件名大于通常用的8.3格式,如果文件名大于8个字符或者你的扩展名大于3个字符就会引起这个错误。要避免这个错误,在WINDOWS下拷贝文件不要用FILE MANAGER,最好使用浏览器去拷贝文件,如果已经使用FILE MANAGER,那么对于长文件名的文件会自动加上一个~,这样要重新命名拷贝的文件为原来的文件名字。 5. 使用网络应用工具也可能会引起ORA-01157的错误。 在一些网络工具的使用操作中要求对数据文件进行加锁,如果由于实例错误或者主机的问题可能会导致这些锁会一直的存在,这种情况下需要系统管理员手工的去释放这些锁。 6. 如果Oracle的数据文件被一个其他的用户恢复也可能引起ORA-01157的错误。 在Oracle的数据文件被恢复之后,Oracle数据库认不到恢复后的数据文件,因此错误ORA-1157 (cannot identify datafile - file not found)就可能发生: &#1048698; 数据文件在操作系统上是否存在 &#1048698; SELECT * FROM V$DATAFILE查看数据文件的正确路径 &#1048698; ALTER SYSTEM CHECK DATAFILE是否成功 &#1048698; 使用BACKUP CONTROLFILE TO TRACE查看数据文件的正确路径 一般出现这种问题有可能是操作系统上的权限问题,首先查看数据文件的权限,当数据文件被其他用户恢复的时候可能权限就变了,可能Oracle用户就不能访问了,这样就要对恢复后的数据文件修改权限和属主。 7. ULIMIT设置的值不够大也可能会引起ORA-01157的错误。 在DBWR的跟踪文件中会有ORA-1157和ORA-27092的错误: ORA-01157: cannot identify/lock data file N - see DBWR trace file ORA-01110: data file 1: '' ORA-27092: skgfofi: size of file exceeds file size limit of the process Additional information: xxxxx Additional information: yyyyy Oracle8.1.7对于打开数据库会执行很严格的在操作系统的上的ULIMIT的检查,如果文件大小的限制不够大,则数据库就会打不开,出现以上的错误。因此就要增大ULIMIT: ULIMIT -f ; 四.在移植过程中出现ORA-01157的错误 1.如果使用移植工具把Oracle7数据库升级到Oracle8i数据库,,当执行数据库转换的时候有可能会出现以下的错误: ORA-1157 cannot identify datafile
- file not found ORA-1110 datafile :
移植工具首先使用Oracle7的控制文件去创建一个CONVERT.ORA文件,当增加一个新的表空间或者新的数据文件如果新增数据文件没有包含全路径,导致在CONVERT.ORA文件中就没有数据文件路径正确的指向。 解决方法一是要修改%Oracle_home%rdbmsxxconvert.ora下的CONVERT.ORA文件中的数据文件的路径为正确的路径,然后重新执行数据库转换。 解决方法二是先用备份恢复Oracle7的数据库,然后重新创建控制文件,修改数据文件的路径为正确的路径,然后重新执行移植过程。 2.使用移植工具把数据库Oracle7.3.X移植到Oracle8.1.X,可能会出现以下错误: ORA-01157: cannot identify/lock data file 2 - see DBWR tracefile ORA-01110: data file 2: '/oradata/V734/users01.dbf' ORA-27046: file size is not a multiple of logical block size Additional information:1 一般是数据文件从裸设备dd到文件系统中,数据文件的大小不是严格的Oracle Block Size的整数倍造成的。例如: file size =
bytes Oracle block size = 8092 bytes 解决方法一是把数据文件RESIZE到一个Oracle Block Size的整数倍: ALTER DATABASE DATAFILE '' RESIZE ; - the integer should be a multiple of 8 in our example 解决方法二: 1) 使用dbfsize命令去获取数据文件的在数据库中的大小: dbfsize
2) 查看数据文件在操作系统上的大小: ls -lt
3) 使用MOD函数对比1)和2)的值,得出余数。 4) 确定数据库已经关闭了,然后使用dd命令。 例如: 操作系统上的文件大小是 bytes,使用dbfsize得出的结果是6 byte blocks,那么使用以下命令: dd if=bs=4096 count=511745 NB: count= 511744 + 1 (1 for recovering from this problem) mv
5) startup nomount alter database convert; 五.其他一些可能产生ORA-01157错误的原因 1.控制文件的突然中断引起ORA-01157的错误。 A.一种可能的原因是在控制文件中的文件名的结尾处有一个空格。 可以使用'ALTER DATABASE BACKUP CONTROLFILE TO TRACE'命令,然后在初始化参数user_dump_dest所指向的目录下面查找相应的TRACE文件,查看控制文件的内容。例如: '/home/d/Oracle/oradata/ecn/rdx02.dbf ' <-- corrupt '/home/d/Oracle/oradata/ecn/rdx02.dbf' <-- non-corrupt 这种情况下用好的控制文件代替坏了的控制文件,并修改初始化参数文件中的CONTROL_FILES参数,去掉坏了的控制文件。如果所有的控制文件都损坏了,那就需要重建控制文件了。 重建控制文件的方法: 1) 以SYS用户登陆,执行 ALTER DATABASE BACKUP CONTROLFILE TO TRACE; 2) 生成的TRACE文件在USER_DUMP_DEST的目录下,然后查看一下USER_DUMP_DEST的具体目录路径: SELECT VALUE FROM V$PARAMETER WHERE NAME=’USER_DUMP_DEST’; 或者SHOW PARAMETER USER_DUMP_DEST; 3) 找出相应的TRACE文件,最简单的找正确的TRACE文件的方法是看TRACE文件的创建时间,然后修改TRACE文件保存成一个SQL脚本,例如: STARTUP NOMOUNT CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG MAXLOGFILES 5 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 1 MAXLOGHISTORY 453 LOGFILE GROUP 1 'D:ORACLEORADATAORCLREDO01.LOG' SIZE 1M, GROUP 2 'D:ORACLEORADATAORCLREDO02.LOG' SIZE 1M, GROUP 3 'D:ORACLEORADATAORCLREDO03.LOG' SIZE 1M DATAFILE 'D:ORACLEORADATAORCLSYSTEM01.DBF', 'D:ORACLEORADATAORCLUNDOTBS01.DBF', 'D:ORACLEORADATAORCLOEM_REPOSITORY.DBF' CHARACTER SET ZHS16GBK ; 4) 关闭数据库: SHUTDOWN IMMEDIATE; 5) 对数据库做一个全库的冷备份。 6) 利用操作系统命令将原来的控制文件移走。 7) 在SQLPLUS中以SYS用户运行刚刚保存的那个脚本。 8) 打开数据库。 2.在STANDBY方式下,如果主数据库增加了表空间或者数据文件,而从数据库中没有手工增加的话也会出现ORA-01157的错误。 3.RMAN恢复会在ALERT.LOG中产生‘FAKE’引起ORA-01157的错误。 在RMAN的恢复操作中,在ALERT.LOG中会产生以下的错误: ORA-01157: cannot identify/lock data file N - see DBWR trace file ORA-01110: data file N: '' ORA-27037: unable to obtain file status SVR4 Error: 2: No such file or directory 产生这种错误的原因主要是因为在RMAN恢复之前数据文件已经被删除
阅读(2460) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。您所在的位置: &
一个ORA-604错误的分析
一个ORA-604错误的分析
盖国强 杨廷琨等
电子工业出版社
《Oracle DBA手记――数据库诊断案例与性能优化实践》包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及Oracle典型错误的分析和诊断,各种SQL优化方法(包括调整索引,处理表碎片,优化分页查询,改善执行计划等),以及优化系统性能的经验。第2篇Yangtingkun的DBA工作手记。本节说的是一个ORA-604错误的分析。
一个ORA-604错误的分析
同事遇到一个ORA-604错误,分析一下感觉还比较有趣。
出错的SQL大致如下:SQL&&&&&CREATE&TABLE&T_604&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&FROM&DBA_OBJECTS &&&4&&&&&GROUP&BY&OBJECT_TYPE &&&5&&&&&ORDER&BY&2&DESC) &&&6&&&&&WHERE&ROWNUM&&&10; &(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'')& &FROM&DBA_OBJECTS &&*&
第 3 行出现错误:
ORA-00604: 递归 SQL 层 1 出现错误
ORA-01401: 插入的值对于列过大
由于同事并不是DBA,因此对这个错误比较困惑,不清楚为什么SELECT语句直接执行没有任何的问题,而根据SELECT的查询结果去创建表却出现了错误,因此同事认为可能是空间分配上出现了问题。SQL&&&&&SELECT&*&FROM& &&&2&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&FROM&DBA_OBJECTS &&&3&&&&&GROUP&BY&OBJECT_TYPE &&&4&&&&&ORDER&BY&2&DESC) &&&5&&&&&WHERE&ROWNUM&&&10; &OBJECT_TYPE&&&&&&&&&TO_CHAR(AVG&&DATABASE&LINK &MATERIALIZED&VIEW&&&&&&& &RULE&SET&&&&&&&&&&&&&&&& &DIMENSION&&&&&&&&&&&&&&& &DIRECTORY&&&&&&&&&&&&&&& &EVALUATION&CONTEXT&&&&&& &XML&SCHEMA&&&&&&&&&&&&&& &TRIGGER&&&&&&&&&&&&&&&&& &INDEXTYPE&&&&&&&&&&&&&&&&
已选择9行。
一般来说,ORA-604错误很少直接出现在用户调用的SQL中。对于本例的情况,后面的那个错误信息才是真正引发错误的原因。也就是说真正的错误是后面的那个ORA-1401错误。这个ORA-1401错误很好理解:插入的值比表中列的定义值要大。
不过CREATE TABLE AS SELECT语句没有为创建表的列指定数据类型和长度限制,数据类型和长度都由SELECT语句的查询结果来确定。按道理讲不应该出现这种错误。
其实问题很简单,导致错误的真正原因是列名长度太长了,因此只需将上面的CREATE TABLE语句改变一下写法就可以顺利执行了:SQL&&&&&CREATE&TABLE&T_604&(OBJECT_TYPE,&AVG_OBJECT_ID)&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID), &&&&'')&FROM&DBA_OBJECTS &&&4&&&&&GROUP&BY&OBJECT_TYPE &&&5&&&&&ORDER&BY&2&DESC) &&&6&&&&&WHERE&ROWNUM&&&10; &表已创建。 &SQL&&DROP&TABLE&T_604; &表已删除。 &SQL&&&&&CREATE&TABLE&T_604&AS&&&2&&&&&SELECT&*&FROM& &&&3&&&&&(SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),& &&&'')&AVG_OBJECT_ID &&&4&&&&&FROM&DBA_OBJECTS &&&5&&&&&GROUP&BY&OBJECT_TYPE &&&6&&&&&ORDER&BY&2&DESC) &&&7&&&&&WHERE&ROWNUM&&&10;&
表已创建。
当用户执行ddl操作时,Oracle通过大量的递归调用来维护数据字典。比如这个CREATE TABLE语句,Oracle就会插入或更新TAB$、COL$等表。这些操作都是递归调用操作,而在递归调用过程中出现的错误就会报错ORA-604。
出错的SQL语句由于没有指定别名,Oracle会将查询语句中的字段名称作为CREATE TABLE语句的列名。也就是说,Oracle试图将TO_CHAR(AVG(OBJECT_ID), '')作为列名,而这个列名的长度显然超过了列长度30个字符的限制,因此Oracle在插入数据字典表时出现ORA-1401错误。
而上面可以成功执行的两个SQL,一个是在CREATE TABLE时就指定了列名;而另一个是在SELECT时为超长的列指定了别名。因此这两个SQL都不会出现列名超长的问题。
当然这个错误的产生还有一定的条件:如果是TO_CHAR(AVG(OBJECT_ID), '')直接出现在SELECT的外层,在CREATE TABLE的时候,Oracle会明确要求用户提供别名。SQL&&CREATE&TABLE&T_604&AS&&&2&&SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'')& &&&3&&FROM&DBA_OBJECTS &&&4&&GROUP&BY&OBJECT_TYPE &&&5&&ORDER&BY&2&DESC; &SELECT&OBJECT_TYPE,&TO_CHAR(AVG(OBJECT_ID),&'') &&&&&&&&&&&&&&&&&&&&&*&
第 2 行出现错误:
ORA-00998: 必须使用列别名命名此表达式
而这个错误就要比前面的ORA-604和ORA-1401错误直观多了。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&&&的更多文章
本书由麦思博(北京)软件技术有限公司主编,由著名Oracle专家和
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 13人学习过讲师: 9人学习过讲师: 11人学习过
《Excel 2016表格应用》用于帮助读者真正提高Excel表
ES6(又名 ES2105)是 JavaScript 语言的新标准,2015
《21天学通Visual Basic(第4版)》是Visual Basic 6.
SQL Server 2005微软官方权威参考手册。
是Inside Microsoft SQL Server 2005系列书中的第一本,SQL Server类的顶尖之作。
51CTO旗下网站

我要回帖

更多关于 ora 12592产生原因 的文章

 

随机推荐