[数据库]报错:ORA-06550

本文解决了一个数据库中存储过程报错的问题,原因在于字段修改后存储过程未同步更新,导致9i正常运行而10g出现ORA-06575错误。通过debugServer发现无法找到'struts.multipart.saveDir'属性设置,最终成功定位并修复问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:向数据库插入数据是报错:

ORA-06550: line 1, column 7: PLS-00905: object TEST.USERINFO_INSERT is invalid

ORA-06550: line 1, column 7: PL/SQL: Statement ignored

解决:

debug Server,发现报错:

Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir

该错误的解决:http://hi.baidu.com/fgfd0/blog/item/ed1b1c388bb4a6f4b311c721.html

直接在数据库上执行存储过程,9i正常,10g报错:ORA-06575 Package or function is in an invalid state

在oracle sql developer 中dependencies发现,PROCEDURE_INSERTDE的状态是invalid

看数据库的procedures项,发现很多存储过程是有错误的。

原来这个问题的错误原因是:改了表中字段,存储过程并没有跟着一起改,所以存储过程出错啦!

这个数据库表是师兄用PD建的,建了之后,用一个工具自动生成了一些存储过程,这个工具默认生成sql server的,师兄又处理成了oracle的。

呵呵 下面要改存储过程啦。之前几乎没接触过存储过程呢!

 

转载于:https://www.cnblogs.com/gracexiao/archive/2012/03/19/2406307.html

<think>我们正在讨论的是Oracle数据库ORA-00904错误。根据引用资料,我们并没有直接给出ORA-00904的解决方案,因为用户提供的引用内容是关于ORA-28547、ORA-12520、ORA-01102和ORA-27101的。但是,我们可以根据对ORA-00904错误的了解,结合一般解决Oracle错误的方法来提供解答。ORA-00904错误通常表示“标识符无效”(invalididentifier)。这通常发生在SQL语句中引用了不存在的列名、表名或其他对象名,或者可能是大小写不匹配、拼写错误等原因。解决方案步骤:1.**检查SQL语句中的标识符**:仔细检查SQL语句中使用的所有列名、表名、别名等。确保它们都存在于数据库中,并且拼写完全正确(包括大小写,因为Oracle默认是大小写不敏感的,但如果你使用了双引号创建了大小写敏感的对象名,则必须严格匹配)。2.**检查对象的存在性和权限**:确保你引用的表或视图存在,并且当前用户有权限访问它们。可以通过查询数据字典视图(如`ALL_TAB_COLUMNS`)来确认列是否存在。例如,检查某个表(例如`EMPLOYEES`)的列是否存在:```sqlSELECTCOLUMN_NAMEFROMALL_TAB_COLUMNSWHERETABLE_NAME='EMPLOYEES';```3.**注意保留字**:避免使用Oracle的保留字作为标识符。如果必须使用,需要用双引号括起来。但请注意,使用双引号后标识符将变为大小写敏感。4.**检查别名使用**:如果在SQL语句中使用了别名,确保在引用别名的地方使用了正确的别名。例如,在SELECT子句中定义了别名,在ORDERBY子句中只能使用该别名。5.**检查数据库对象名的大小写**:如果数据库对象名在创建时使用了双引号(例如:`CREATETABLE"MyTable"(...)`),那么在引用时必须使用相同的双引号和相同的大小写。通常建议不使用双引号,这样对象名都是大写的,查询时不区分大小写。6.**检查数据库链接**:如果使用了数据库链接,确保在远程表上引用的列也存在。7.**检查视图和复杂查询**:如果是在视图中出现这个错误,需要检查视图定义中所引用的对象是否存在。8.**使用工具辅助**:使用像OracleSQLDeveloper这样的工具,它可以自动补全和验证对象名,减少输入错误。示例:假设我们有一个表`EMPLOYEES`,其中包含列`EMP_ID`、`NAME`等。如果执行以下语句:```sqlSELECTemp_id,firstnameFROMemployees;```而实际上列名是`FIRST_NAME`,那么就会报ORA-00904:"FIRSTNAME":标识符无效。因此,正确的语句应为:```sqlSELECTemp_id,first_nameFROMemployees;```通过以上步骤,通常可以定位并解决ORA-00904错误。相关问题:1.Oracle数据库ORA-00904错误的具体原因有哪些?2.如何避免在编写SQL语句时出现ORA-00904错误?3.如果ORA-00904错误是由权限问题引起的,该如何解决?</think> 根据您提供的引用内容以及您询问的ORA-00904错误,以下是完整的解决方案和排查步骤: ### ORA-00904: 无效标识符 解决方案 该错误通常表示SQL语句中引用了不存在的列名、函数或别名。以下是系统性的排查流程: 1. **检查列名/别名拼写**(最常见原因): - 验证SQL中所有列名的大小写和拼写是否与表结构完全一致 ```sql -- 查看表结构确认列名 DESC 表名; ``` - Oracle默认不区分大小写,但如果创建时使用了双引号(如`"Salary"`),引用时也必须使用双引号 2. **验证对象存在性**: - 检查引用的表/视图是否存在: ```sql SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = '表名大写'; ``` - 检查函数是否存在(如使用自定义函数) 3. **别名作用域问题**: - 在JOIN语句中确保正确使用表别名 ```sql -- 错误示例(别名作用域错误) SELECT orders.id, customer.name -- customer未声明别名 FROM orders o, customers c; ``` 4. **权限检查**: - 确认当前用户有对应对象的查询权限: ```sql SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = '表名'; ``` 5. **保留字冲突**: - 避免使用Oracle保留字作为列名(如DATE, LEVEL等) - 如需使用保留字,必须用双引号括起: ```sql SELECT "LEVEL" FROM employee; -- 正确 ``` 6. **版本兼容性问题**: - 新版本新增的列/函数在旧版本中不可用(如12c的`JSON_VALUE`函数在11g中无效) 7. **DDL变更未同步**: - 当表结构修改后,可能旧会话仍缓存旧元数据 ```sql ALTER SYSTEM FLUSH SHARED_POOL; -- DBA操作 ``` > **实际案例**:某用户执行`SELECT total_salary FROM employees;`报错ORA-00904,经检查发现实际列名为`TOTAL_SALARY`(下划线位置错误)[^1]。 ### 高级排查工具 ```sql -- 查询无效标识符的详细元数据 SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = '你的表名大写' AND COLUMN_NAME = '疑似列名大写'; ``` ### 预防措施 1. 使用SQL开发工具(如Oracle SQL Developer)自动补全列名 2. 对表结构变更进行版本控制 3. 启用SQL审计: ```sql AUDIT SELECT TABLE BY ACCESS; -- 跟踪无效SQL ``` --- **注意**:若上述方法仍无法解决,请提供具体的SQL语句和环境版本(Oracle 11g/12c/19c等)以便进一步分析[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值