oracle 12c 创建数据库错误:ORA-48173,ORA-48187

博客围绕Oracle创建数据库时出现的错误展开。创建数据库提示ORA - 48173、ORA - 48187等错误,点击忽略又提示ORA - 01034。分析得知,安装Oracle软件前未创建专属操作系统用户可能导致此问题。解决办法是删除自动创建的账户,重新创建Windows账户并分配所属组。

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

问题描述:

创建数据库时提示错误:
ORA-48173:error checking directory existence during ADR initialization[…]
ORA-48187:specified directory does not exist
点击忽略,提示错误:
ORA-01034:ORACLE not available。

问题分析:

安装oracle软件前,需要创建oracle专属操作系统用户(建议命名:oracle),用于安装软件;
如果安装oracle软件时,选择创建的操作系统账户,可能导致上述问题;

解决办法:

需要删除由oracle软件自动创建的账户,并重新创建windows账户,然后分配所属组;

1、手工删除由oracle创建的用户:在这里插入图片描述

2、创建windos账户

在这里插入图片描述

3、分配用户组

在这里插入图片描述

<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、付费专栏及课程。

余额充值