Oracle 19c:在UDT体内获取类型名称,有无更优替代方案?
在Oracle UDT内部获取类型名称的更优实现
你当前通过SYS.ANYDATA转换SELF来获取类型名的方案虽然可行,但确实存在冗余——仅为获取类型元数据而依赖ANYDATA组件,开销不必要。
以下两种更"自然"的实现方式,无需ANYDATA转换:
方法一:通过TYPEID关联数据字典视图
利用SYS.TYPEID(self)获取当前UDT的唯一类型标识符,直接查询USER_TYPES视图获取类型名:
not final instantiable member function get_type_name return varchar2 is l_type_name varchar2(200); begin select type_name into l_type_name from user_types where typeid = sys.typeid(self); return l_type_name; end;
该方法直接从数据字典读取元数据,轻量且直观,默认情况下当前用户对USER_TYPES拥有访问权限。
方法二:使用DBMS_TYPES内置函数
调用DBMS_TYPES.GET_TYPE_NAME函数,传入SELF的TYPEID即可直接返回类型名:
not final instantiable member function get_type_name return varchar2 is begin return dbms_types.get_type_name(sys.typeid(self)); end;
此方式代码更简洁,GET_TYPE_NAME会自动解析TYPEID对应的类型名称。若返回结果包含模式前缀,可按需用REPLACE或正则表达式移除(不过当前用户下的类型通常仅返回纯类型名)。
这两种方案均避免了ANYDATA的转换开销,更贴合UDT内部获取自身类型信息的场景。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

