我怎样才能得到像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_ROLE
或 EXP_FULL_DATABASE
才能查看其他用户对象。
第二个问题(SQL 不完整)来自数据类型 LONG,根据 Oracle 的说法,不应再使用该数据类型。然而,它仍然被 Oracle 用于视图定义、默认值、约束文本等。因为它很难处理,视图 ALL_VIEWS
在 LONG
列中有原始文本和截断文本,主要是 text_vc
列中的前 4000 个字符,大概是 "text in varchar".
编辑:
我相信你使用的是 Oracle 12,因为你提到了列 text_vc
,它在 Oracle 11 中不可用。推测你正在使用容器化数据库。如果是这样,那么请看一下Data Dictionary Architecture in a CDB。显然,Oracle 提供的定义如视图和包仅在根容器中可见。叹息!!
我想获取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_ROLE
或 EXP_FULL_DATABASE
才能查看其他用户对象。
第二个问题(SQL 不完整)来自数据类型 LONG,根据 Oracle 的说法,不应再使用该数据类型。然而,它仍然被 Oracle 用于视图定义、默认值、约束文本等。因为它很难处理,视图 ALL_VIEWS
在 LONG
列中有原始文本和截断文本,主要是 text_vc
列中的前 4000 个字符,大概是 "text in varchar".
编辑:
我相信你使用的是 Oracle 12,因为你提到了列 text_vc
,它在 Oracle 11 中不可用。推测你正在使用容器化数据库。如果是这样,那么请看一下Data Dictionary Architecture in a CDB。显然,Oracle 提供的定义如视图和包仅在根容器中可见。叹息!!