ORA-00904: "DROP_SEGMENTS": invalid identifier 解决方法

 

 

 

之前按用户imp了一个9i的数据库,今天发现Job 执行失败,alert log 显示:

ORA-00904: "DROP_SEGMENTS": invalid identifier

 

 

 

上网搜了一下, 摘抄如下, 说是要执行下catpatch.sql 脚本。

 

 

 

Oracle 9.2.0.5 added the DROP_SEGMENTS column to the DBA_TAB_MODIFICATIONS view. Internally, the dollar table sys.mon_mods$ received the new drop_segments column. Guess who's responsible for adding this new column during the patch process?

Yup, it's catpatch.sql. Oh, joy!

 

If you don't run catpatch when patching to 9.2.0.5, a few things will happen with regards to the drop_segments column:

SMON will complain profusely in alert.log whenever it tries to update sys.mon_mods$. That means you get this error message every 15 minutes, or sooner:

 

 

        Thu Nov 25 17:21:05 2004

        Errors in file /u01/app/oracle/admin/mydb/bdump/mydb_smon_8201.trc:

        ORA-00904: "DROP_SEGMENTS": invalid identifier

 

 

DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO will fail.

According to Metalink Note 285315.1, you'll also get the ORA-00904 error in the alert.log on DROP TABLE and TRUNCATE TABLE.

You will get the ORA-00904 error when you try to update statistics with "GATHER STALE".

If you can't update statistics, you will have bad optimizer plans.

 

 

 

解决方法如下:

1. shutdown database

2. startup migrate

3. @?/rdbms/admin/catpatch.sql --升级数据字典

4. @?/rdbms/admin/catalog.sql  --创建系统常用的数据字典视图和同义词

5. @?/rdbms/admin/utlrp.sql    --编译存储过程

6. 重启数据库

 

 

 

SQL> describe sys.mon_mods$;        

                          

  Name             Null?   Type                               

  ----------------- -------- ------------                       

  OBJ#                      NUMBER                             

  INSERTS                   NUMBER                             

  UPDATES                   NUMBER                             

  DELETES                   NUMBER                             

  TIMESTAMP                 DATE                               

  FLAGS                     NUMBER                             

  DROP_SEGMENTS             NUMBER    <==出现了该字段

 

 ------------------------------------------------------------------------------
QQ: 492913789
Email: ahdba@qq.com
Blog: http://www.cndba.cn/dave
网上资源: http://tianlesoftware.download.youkuaiyun.com
相关视频:http://blog.youkuaiyun.com/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(满);   DBA2 群:62697977(满)   DBA3 群:62697850(满)  
DBA 超级群:63306533(满);  DBA4 群: 83829929  DBA5群: 142216823   
DBA6 群:158654907  聊天 群:40132017   聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

 

<think>我们正在解决ORA-00904错误,具体涉及无效标识符'yjtxrq'。根据引用内容,这个错误通常表示: 1. 字段在表中不存在 2. 创建表时最后一个字段后面多了一个逗号 3. 创建字段时使用了双引号(例如:"yjtxrq"),而引用时没有使用双引号或者大小写不匹配(因为Oracle默认将标识符转换为大写,除非使用双引号) 4. 引用了未定义的变量 针对'yjtxrq'这个标识符,我们需要检查以下几个方面: ### 步骤1: 确认表结构中是否存在该字段 首先,我们需要确认在SQL语句中引用的表是否包含名为'yjtxrq'的字段。由于Oracle默认将标识符转换为大写,所以通常我们创建表时如果不使用双引号,字段名会被存储为大写。因此,在SQL语句中应该使用大写(如YJTXRQ)或者不区分大小写(但实际存储为大写)。但是,如果在创建表时使用了双引号(例如:"yjtxrq"),那么字段名就是小写的,这时在SQL语句中引用也必须使用双引号和小写,否则会报错。 执行以下SQL查询(将`<表名>`替换为实际的表名): ```sql SELECT column_name FROM all_tab_columns WHERE table_name = '<表名>' AND column_name = 'YJTXRQ'; ``` 或者,如果表在另一个用户下,可能需要使用`owner`条件: ```sql SELECT column_name FROM all_tab_columns WHERE owner = '<所有者>' AND table_name = '<表名>' AND column_name = 'YJTXRQ'; ``` 如果上述查询没有返回结果,可以尝试用小写查询(如果创建时用了双引号): ```sql SELECT column_name FROM all_tab_columns WHERE table_name = '<表名>' AND column_name = 'yjtxrq'; ``` ### 步骤2: 检查SQL语句 检查引发错误的SQL语句,确保: - 字段名拼写正确(包括大小写) - 如果创建表时使用了双引号(即字段名是大小写敏感的),那么在查询时也必须使用双引号括起来,并且大小写一致。例如:`SELECT "yjtxrq" FROM ...` - 确保表别名(如果有)正确,并且字段名前缀了正确的表别名(如果SQL中使用了表别名) ### 步骤3: 检查DDL语句 如果这个错误发生在创建表或修改表的时候,检查DDL语句: - 最后一个字段后面不能有逗号 - 如果创建字段时使用了双引号,那么后续引用也必须一致 ### 步骤4: 检查变量或列别名 如果在PL/SQL中使用了变量,确保变量已经声明。如果在SQL语句中使用了列别名,确保在后续引用(比如ORDER BY)中使用的别名正确。 ### 实际案例 假设我们有一个表创建语句: ```sql CREATE TABLE test_table ( id NUMBER, "yjtxrq" DATE -- 注意这里使用了双引号,所以字段名是小写的 ); ``` 那么,在查询时,以下语句会报错: ```sql SELECT yjtxrq FROM test_table; -- 错误,因为Oracle默认会转换成大写YJTXRQ,但表中是小写的yjtxrq ``` 正确的查询应该是: ```sql SELECT "yjtxrq" FROM test_table; ``` ### 总结 针对错误`ORA-00904: "yjtxrq": invalid identifier`,请按照上述步骤检查。通常,这个错误是由于字段名不存在或者大小写不匹配(特别是创建时使用了双引号)引起的。 §§相关问题§§ 1. 如何避免Oracle中的ORA-00904错误? 2. 在Oracle中,使用双引号创建字段名有哪些注意事项? 3. 如何查询Oracle数据库中的表结构?</think>### ORA-00904: "YJTXRQ"无效标识符的解决方案 根据您提供的错误信息和引用内容,`ORA-00904: "YJTXRQ" invalid identifier` 通常由以下原因引起: #### 常见原因及解决方案: 1. **字段在表中不存在** - ✅ 验证表结构中是否存在`YJTXRQ`字段: ```sql -- 检查字段是否存在(注意大小写) SELECT column_name FROM all_tab_columns WHERE table_name = '您的表名' AND column_name = 'YJTXRQ'; -- 或 'yjtxrq'(如果创建时使用双引号) ``` - 若查询无结果,说明字段不存在,需修改SQL语句或添加字段 2. **大小写敏感问题**(最常见原因)[^1][^3] - 如果字段创建时使用双引号:`CREATE TABLE t ("yjtxrq" DATE)` - ✅ 查询时必须严格匹配大小写: ```sql -- 正确写法(带双引号和小写) SELECT "yjtxrq" FROM your_table; ``` - ❌ 错误写法(会被Oracle转为大写): ```sql SELECT YJTXRQ FROM your_table; -- 报错 ORA-00904 ``` 3. **SQL语法错误** - ✅ 检查SQL语句: - 最后一个字段后是否有多余逗号(如:`SELECT col1, col2, FROM ...`) - 表别名是否正确:`SELECT a.yjtxrq FROM tableA a`(若别名错误则报错) - 确保`YJTXRQ`不是未定义的变量 4. **对象权限问题** - ✅ 确认当前用户有访问权限: ```sql SELECT * FROM all_tab_privs WHERE table_name = '您的表名' AND grantee = '当前用户名'; ``` #### 排查流程图: ```mermaid graph TD A[报错ORA-00904] --> B{检查字段是否存在} B -->|不存在| C[修改SQL或添加字段] B -->|存在| D{是否使用双引号创建?} D -->|是| E[SQL中严格使用\"yjtxrq\"] D -->|否| F[检查SQL语法和权限] F --> G[验证表别名/逗号/权限] G --> H[问题解决] ``` ### 典型修复案例 **场景**:开发人员在创建表时使用了双引号: ```sql CREATE TABLE orders ( "order_id" NUMBER, "yjtxrq" DATE -- 带双引号创建 ); ``` **错误查询**: ```sql SELECT order_id, yjtxrq FROM orders; --ORA-00904 ``` **正确写法**: ```sql SELECT "order_id", "yjtxrq" FROM orders; -- 严格匹配大小写 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值