ora-00942错误主因是schema不匹配、表名大小写敏感、同义词失效或权限缺失,需依次验证current_schema、真实表名(含引号)、同义词有效性及select权限(含角色在pl/sql中是否启用)。

ORA-00942 或 ORA-08103 报“对象不存在”不是表真丢了
这类错误在 .NET 里几乎从不表示数据库崩了或表被删光,而是 SQL 发过去后 Oracle 没认出你要查的东西。最常见原因是大小写和 schema 前缀不匹配——比如你在代码里写 SELECT * FROM QueryHistory,但 Oracle 里实际是 QUERYHISTORY(全大写)或 "QueryHistory"(带双引号、大小写敏感)。Oracle 默认把无引号标识符全转成大写,一旦建表时用了双引号,后续所有引用都必须原样带引号、大小写一致。
- 查真实表名:连数据库执行
SELECT table_name FROM all_tables WHERE owner = 'YOUR_SCHEMA' AND UPPER(table_name) LIKE '%QUERY%',看返回的是QUERYHISTORY还是"QueryHistory" - 补 schema 前缀:如果表属于
REPORTS用户,SQL 必须写成SELECT * FROM REPORTS.QUERYHISTORY或SELECT * FROM REPORTS."QueryHistory" - 权限不是“能连上就行”:
APP_USER可能没被显式授予SELECT ON REPORTS.QueryHistory,角色权限(如 CONNECT/RESOURCE)在 .NET 驱动的 PL/SQL 上下文中不生效
存储过程内部报 ORA-08103:问题在过程体里,不在 .NET 调用层
如果错误发生在存储过程执行过程中(比如过程里有 SELECT * FROM xxx),那说明过程体里引用的对象不可见——可能是表没加 schema、依赖对象被删、或者过程编译后状态变成 INVALID。这个错误不会在 .NET 侧抛出连接异常,而是在 Execute() 或 Query() 执行时由 Oracle 返回。
- 检查过程状态:
SELECT status FROM all_objects WHERE object_name = 'YOUR_PROCEDURE_NAME',如果是INVALID,需手动ALTER PROCEDURE YOUR_PROCEDURE_NAME COMPILE - 过程里所有表/视图引用,必须带 schema,不能依赖当前用户默认 schema;例如写
SELECT * FROM REPORTS.LOG_TABLE,别只写LOG_TABLE - 过程依赖的 UDT 或 Table Type 必须已存在且状态为
VALID;先建CREATE OR REPLACE TYPE student_obj_type AS OBJECT(...),再建CREATE OR REPLACE TYPE student_table_type AS TABLE OF student_obj_type
PLS-00905:存储过程本身找不着,不是参数或结果集的问题
PLS-00905 明确告诉你:Oracle 根本没找到这个过程名。它和 ORA-00942 不同,不是对象内容访问失败,而是名字解析阶段就失败了。原因很窄,但容易忽略。
- 过程名拼写大小写不一致:调用
CALL GetUserInfo(),但实际创建的是GETUSERINFO或"GetUserInfo",必须完全匹配 - 过程不在当前用户 schema 下:调用前没加 schema,比如该过程属于
HR用户,就得写HR.GetUserInfo - 过程编译失败后残留无效对象:
CREATE OR REPLACE PROCEDURE执行报错后,对象仍存在于ALL_OBJECTS中但状态为INVALID,此时调用会直接触发 PLS-00905 - 权限不足:即使过程存在,调用者没有
EXECUTE权限也会报这个错,不是 ORA 错误而是 PLS 错误
Ref Cursor 拿不到结果?先确认是不是根本没走到“打开游标”这步
如果你用 Dapper 调用带 REF CURSOR 输出参数的存储过程,但 Query<t>()</t> 返回空或抛类型转换异常,大概率不是 .NET 代码写错了,而是存储过程体里压根没执行 OPEN output_cursor FOR SELECT ...。Oracle 不会自动帮你开游标,必须显式打开,否则 OracleDynamicParameters 拿到的还是 null。
- 驱动必须是
Oracle.ManagedDataAccess(23.x+ 推荐),禁用Oracle.DataAccess和已废弃的System.Data.OracleClient - 参数封装必须用
Dapper.Oracle.OracleDynamicParameters,不是Dapper.DynamicParameters;Add()时只设dbType: OracleDbType.RefCursor,别设size - 调用必须用
connection.Query<t>(sql, parameters)</t>或QueryMultiple();Execute()和ExecuteNonQuery()不读取游标,返回后parameters.Get<object>("cursorName")</object>仍是 null
复杂点在于:这些错误现象高度相似,但根因分散在数据库元数据、权限模型、PL/SQL 编译状态、.NET 驱动选型、甚至大小写处理规则里。少查一步,就可能在错误日志里反复打转。











