Oracle中OBJECT_ID的等效函数是什么?调用时提示ORA-00904错误
问题原因
Oracle 数据库没有内置名为 OBJECT_ID 的函数,该函数是 SQL Server 的内置方法,你收到ORA-00904: "OBJECT_ID": invalid identifier报错的直接原因就是调用了不存在的内置函数。另外原代码还存在一处语法错误:SQL查询语句中的CASE表达式结尾只需要写END,不需要加CASE关键字,END CASE是PL/SQL过程块中分支语句的结尾写法,放在SQL中会触发编译错误。
等效功能实现方式
Oracle 中判断指定名称、指定类型的对象是否存在,直接查询系统数据字典视图即可,和SQL ServerOBJECT_ID功能完全等效:
- 仅判断当前用户Schema下的对象:查询
USER_OBJECTS视图 - 判断当前用户有权限访问的所有Schema下的对象:查询
ALL_OBJECTS视图 - 判断全库所有对象(需要DBA权限):查询
DBA_OBJECTS视图
视图中OBJECT_TYPE='TABLE'的记录就对应用户表,和你传入的类型标识'U'的匹配逻辑一致。
修正后的可运行代码
CREATE OR REPLACE PROCEDURE OMEGA."IPO_GET" (cur OUT SYS_REFCURSOR)IS BEGIN OPEN cur FOR SELECT i.* , CASE WHEN EXISTS ( SELECT 1 FROM USER_OBJECTS obj WHERE obj.OBJECT_NAME = UPPER(i.ipo_code || '_exchange_data') AND obj.OBJECT_TYPE = 'TABLE' ) THEN 1 ELSE 0 END AS exchange_data_exists FROM IPO_MASTER i ORDER BY start_date DESC; END; /
注意事项
- Oracle默认创建的表、字段等对象名会自动转为大写存储在数据字典中,上述代码用
UPPER()处理拼接后的表名,避免大小写匹配失败;如果你的目标表是加双引号创建的大小写敏感命名表,去掉UPPER()函数,严格匹配建表时的名称即可。 - 如果要判断的表不属于OMEGA用户,只需要把代码里的
USER_OBJECTS替换为ALL_OBJECTS即可。 - 原代码中调用
DBMS_ASSERT.ENQUOTE_LITERAL是逻辑错误,该函数的作用是给字符串包裹单引号,用于动态SQL拼接字面量值,查询数据字典匹配对象名时不需要给对象名单引号包裹,因此无需调用该函数。
内容的提问来源于stack exchange,提问作者LIONHEART
相关产品推荐
相关产品推荐

