0

我通过 sqlplus 与 sys 作为 sysdba 连接到 oracle 数据库 11.2.0.4 企业版。如果我运行查询:

   select DBMS_METADATA.GET_DDL ( 'TYPE' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ; 

我得到错误错误

     *ORA-31603: object "SYS_PLSQL_9131_DUMMY_1" of type TYPE not found in  schema "SYS"
      ORA-06512: at "SYS.DBMS_METADATA", line 5805
      ORA-06512: at "SYS.DBMS_METADATA", line 8344*

如果我运行,我也会遇到类似的错误

      select DBMS_METADATA.GET_DDL ( 'TYPE_BODY' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ;
      select DBMS_METADATA.GET_DDL ( 'TYPE_SPEC' , 'SYS_PLSQL_9131_DUMMY_1' , 'SYS' ) from dual ;

如果我查询DBA_OBJECTSor DBA_SOURCE,则 TYPE 类型的对象就在那里。

即使我在 SYS 模式中查询其他 TYPE 类型对象,我也会收到这些错误,但并非所有 TYPE 类型对象都会给我这个问题。

4

2 回答 2

1

为什么这会引发错误? 问题不在于权限或代码。问题是,有时 Oracle 对象并不是真正声称的对象类型。不是所有的“表”都是真实的表,也不是所有的“类型”都是真实的类型。Oracle 可以创建对象来支持其他对象,例如嵌套表和系统生成的集合类型。

我怎样才能提前知道什么会引发错误? 据我所知,没有官方文档或数据字典视图可以告诉您对象何时不是真实对象。最好的指南可能是这个答案中的条件。具体这部分:

    ...
   --These objects are included with other object types.
    and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION',
       'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION')
    --Ignore system-generated types that support collection processing.
    and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%')
    --Exclude nested tables, their DDL is part of their parent table.
    and (owner, object_name) not in (select owner, table_name from dba_nested_tables)
    --Exlclude overflow segments, their DDL is part of their parent table.
    and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW')

有些对象无法导出,需要忽略。

于 2017-02-28T03:38:15.493 回答
1

这些类型应该由包隐式创建。在 DBA_OBJECTS 中查询 object_id 9131(类型名称中的数字)。

它可能指的是一个包,该包具有一个函数,该函数返回一个具有包规范中定义的数据类型的值,而不是简单的 VARCHAR2 / NUMBER / DATE。

于 2017-02-27T04:09:16.210 回答