2008-09-26 67 views
3

在Oracle中,是否有一種簡單的方法來完全打開視圖?例如:如果我有一個視圖由更多視圖上的選擇組成,是否有一些方法可以將它解開直接在實際表上選擇?完全打開視圖

回答

2
  1. 獲取您的視圖的查詢文本。

    SELECT text FROM dba_views 
    WHERE owner = 'the-owner' AND view_name = 'the-view-name'; 
    
  2. 解析。在查詢文本中搜索視圖名稱。

  3. 獲取找到的每個視圖名稱的查詢文本。 (請參閱項目1.)

  4. 將查詢中的每個視圖名稱替換爲相關的查詢文本。

  5. 以遞歸方式執行此操作,直至找不到更多視圖。

簡單嗎?

編輯:上述指示並不做所有要求。想想這個多一點,它變得毛茸茸的,長腿,也許是另一隻手臂。查找可能是精心設計的函數和子查詢的列名稱和列名稱。將它們全部與連接和子句重新組合在一起。結果查詢可能看起來非常難看。

Oracle中的某處可能有些東西實際上是展開視圖。我不知道。我很高興我沒有在Oracle中使用太多的觀點。

2

in-line views的概念可以用來做到這一點。假設有這些2次:

create or replace view london_dept as 
select * from dept 
where loc = 'LONDON'; 

create or replace view london_mgr as 
select * from emp 
where job='MANAGER' 
and deptno in (select deptno from london_dept); 

在第二視圖的SQL中,參考以查看london_dept可以通過使用SQL從london_dept視圖定義的在線視圖來代替如下:

select * from emp 
where job='MANAGER' 
and deptno in (select deptno from (select * from dept 
where loc = 'LONDON')); 

當然,你現在可以看到,過於冗長,可以簡化爲:

select * from emp 
where job='MANAGER' 
and deptno in (select deptno from dept where loc = 'LONDON'); 

最後,湯姆凱特創造views of views

0

直到甲骨文12.1的優點和缺點一些建議的正確答案是否定的,有沒有簡單的方法。現在,在12.1中有DBMS_UTILITY.EXPAND_SQL_TEXT:在Oracle Database 12c第1版(12.1)中將SQL引用擴展爲視圖就是這樣做的。查看documentation of dbms_utility