如何检索用于在 Oracle 中创建视图的 SQL?

Posted

技术标签:

【中文标题】如何检索用于在 Oracle 中创建视图的 SQL?【英文标题】:How to retrieve the SQL used to create a view in Oracle? 【发布时间】:2014-04-25 11:45:21 【问题描述】:

在 Oracle 中,要检索用于创建函数、包等的 SQL,可以查询 user_source 视图。但是,视图不包含在此视图中——它们也不存在于底层sys.source$ 中。要访问视图的文本,可以使用 user_views.text 列,但这并不准确,因为 Oracle 会重写查询的某些部分,例如它会进行全局扩展。

如何在不进行全局扩展的情况下,完全按照输入的方式检索用于创建视图的 SQL?

【问题讨论】:

什么是“全局扩展”? @a_horse_with_no_name 。 . .在 SQL 中,我认为这指的是扩展 * 以包含所有列。该术语来自在 Unix 路径中使用通配符。 由于这个问题可以很容易地用谷歌搜索解决在 LONG 类型的视图源中搜索标识符的问题,我链接了适当的 SO 问题:***.com/q/27523530/653539 【参考方案1】:

您可以使用以下查询:

SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;

或者您可以使用 ALL_VIEWS,如

SELECT VIEW_NAME, TEXT 
FROM ALL_VIEWS;

参考文献

ALL_VIEWS on Oracle® Database Reference

【讨论】:

不完全是 OP 问题的答案,但无论如何,这就是人们搜索的内容,所以感谢您的回复! :)【参考方案2】:

我使用dbms_metadata.get_ddl如下:

select
dbms_metadata.get_ddl('VIEW', 'VIEW_NAME', 'VIEW_OWNER') 
from
dual;

参数如下:

DBMS_METADATA.GET_DDL (
object_type     IN VARCHAR2,
name            IN VARCHAR2,
schema          IN VARCHAR2 DEFAULT NULL,
version         IN VARCHAR2 DEFAULT 'COMPATIBLE',
model           IN VARCHAR2 DEFAULT 'ORACLE',
transform       IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;

它有一个公开的同义词。对于不属于用户的对象,可以获得系统权限SELECT_CATALOG_ROLE,并且可以查看所有对象的所有DDL。

在 Oracle SQL Developer 中,可以在查询结果窗口中看到 clob(许多人也创建了转换 clob 的实用程序)。

大多数 SQL IDE 工具都有一些 DDL 查看机制,尽管 DBMS_METADATA 是 Oracle 数据库功能的种子(不需要一些花哨、昂贵的工具)。

【讨论】:

【参考方案3】:

我认为原文丢失了:

create table t1(id number)
/
create view t1_vw as select * from t1
/
alter table t1 add val varchar2(20)
/
alter view t1_vw compile
/
select * from t1_vw
/

将只返回 id 列。 有趣,但对于物化视图,原始文本会被保留。

【讨论】:

你是对的——我猜你好像做不到。您的回答还指出,我试图做的事情无论如何都行不通。谢谢。 好吧,您仍然可以合理猜测 * 之前的位置。【参考方案4】:

我认为作为开发人员,视图的兴趣在于“选择”,这使其有效且可运行,编辑视图的最简单方法是使用其他应用程序,如 pl/sql Developer 或 TOAD。

只用sqlplus.exe这样的文本编辑器编辑oracle数据库中的任何对象,对于简单的任务需要很长时间,而且这样做很头疼。

【讨论】:

【参考方案5】:

您可以使用数据字典视图(V$SQL、V$SQLTEXT)查看输入的实际 SQL。

请参阅this related question。

【讨论】:

这些视图不包括 DDL,只有 DML - 共享 SQL。

以上是关于如何检索用于在 Oracle 中创建视图的 SQL?的主要内容,如果未能解决你的问题,请参考以下文章

在oracle中创建表,如何写sql语句才能保证表不重复创建,也就是说,如何让他不提示表或视图已存在

如何查看用于在 phpMyAdmin 或其他程序中创建视图的原始 MySQL?

oracle

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

从文件加载 sql 并在 oracle 中创建它的视图

如何在存储过程中创建视图