我怎样才能得到像user_objects这样的系统视图的完整定义(sql)?

How can I get the complete definition (sql) of system views like user_objects?

我想获取USER_OBJECTS等系统视图的完整SQL代码。但是,当我执行下面的查询时,它 returns 显示在 SYS 模式中找不到视图的错误。

select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

当我执行下面的查询时,它 returns text_vc 列中的一些代码,但不是完整的代码。我看不到表格和 where 子句等

select * from ALL_VIEWS where VIEW_NAME  = 'USER_OBJECTS';

但是通过这个查询,我可以看到它在具有该名称的 SYS 架构中。 那么,我看不到整个查询的原因是什么?有没有办法看到这一切?

在 SQL*Plus 中,您 set long(我缩短了输出):

SQL> set pagesize 0
SQL> set long 10000
SQL>
SQL> select text from all_views where view_name = 'USER_OBJECTS';
select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>
from sys."_CURRENT_EDITION_OBJ" o
where o.owner# = userenv('SCHEMAID')
  and o.linkname is null
  and (o.type# not in (1  /* INDEX - handled below */,
                      10 /* NON-EXISTENT */)
       or
<snip>
union all
select l.name, NULL, to_number(null), to_number(null),
       'DATABASE LINK',
       l.ctime, to_date(null), NULL, 'VALID', 'N', 'N', 'N', NULL, NULL
from sys.link$ l
where l.owner# = userenv('SCHEMAID')


SQL>

此外,您的第一个查询在我的数据库 (11g XE) 中有效 if 我连接为 SYS:

SQL> show user
USER is "SYS"
SQL> select dbms_metadata.get_ddl('VIEW', 'USER_OBJECTS', 'SYS') from dual;

DBMS_METADATA.GET_DDL('VIEW','USER_OBJECTS','SYS')
--------------------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."USER_OBJECTS" ("OBJECT_NAME", "SUBOBJECT_N
AME", "OBJECT_ID", "DATA_OBJECT_ID", "OBJECT_TYPE", "CREATED", "LAST_DDL_TIME",
"TIMESTAMP", "STATUS", "TEMPORARY", "GENERATED", "SECONDARY", "NAMESPACE", "EDIT
ION_NAME") AS
  select o.name, o.subname, o.obj#, o.dataobj#,
       decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                      4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                      7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                      11, 'PACKAGE BODY', 12, 'TRIGGER',
<snip>

+1 查看系统视图的定义!

第一个问题(DBMS_METADATA空)是权限问题。根据 documentation,普通用户只会看到自己的对象。您需要角色 SELECT_CATALOG_ROLEEXP_FULL_DATABASE 才能查看其他用户对象。

第二个问题(SQL 不完整)来自数据类型 LONG,根据 Oracle 的说法,不应再使用该数据类型。然而,它仍然被 Oracle 用于视图定义、默认值、约束文本等。因为它很难处理,视图 ALL_VIEWSLONG 列中有原始文本和截断文本,主要是 text_vc 列中的前 4000 个字符,大概是 "text in varchar".

编辑:

我相信你使用的是 Oracle 12,因为你提到了列 text_vc,它在 Oracle 11 中不可用。推测你正在使用容器化数据库。如果是这样,那么请看一下Data Dictionary Architecture in a CDB。显然,Oracle 提供的定义如视图和包仅在根容器中可见。叹息!!