2010-09-30 115 views
5

因此,我們有一些開發人員開心一點。所以現在我們有了引用視圖和廣告的觀點。在Oracle中查看擴展

所以,爲了幫助我進行調整,我想要擴展這些視圖。

我想要一個接受一個字符串並返回一個字符串的函數。輸入字符串是查詢,輸出字符串是沒有視圖的相同查詢。

CREATE OR REPLACE VIEW myView AS 
SELECT * FROM emp 

使用函數/存儲過程 「F」:

F('SELECT * FROM myView') 

...將返回:

SELECT * FROM (SELECT * FROM emp) 

  1. 有一個Oracle包呢?
  2. 是否有人在代碼:
    1. SQL或PL/SQL
    2. 在別的
+0

是否有一個視圖命名約定與瘋狂? – 2010-09-30 19:23:28

+0

'SELECT dv.TEXT_LENGTH FROM DBA_VIEWS dv WHERE dv.view_name ='myview''將返回視圖定義。有趣的部分是知道什麼是視圖,什麼不在查詢中,在它可能發生的各個位置。 – 2010-09-30 19:27:14

+0

命名約定,是的,但嚴格遵循no。 – 2010-09-30 22:12:39

回答

3

人跟你提議什麼問題是,通常有多種方式可以重寫涉及視圖的查詢,因此,簡單地擴展視圖的文本並不一定會告訴你很多關於查詢是如何執行的。

因爲你的目的是調整,我建議,對於查詢執行計劃將可能給你真正需要的信息。這不會顯示重寫的查詢,但會顯示所有實際的表以及它們在執行查詢時的引用方式。

我知道要查看的實際執行計劃的最好方法是:

SELECT /*+ gather_plan_statistics */ * FROM myView 

select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')) 
+0

你不理解。我不在乎檢索執行計劃......我想要實際的SQL ......並且只有一種方法來編寫視圖。這不是多選擇... CREATE VIEW myView AS SELECT * FROM表。如果我在myView中傳遞,我希望「SELECT * FROM table」作爲返回值。 – 2010-10-14 23:58:12

+0

我明白我沒有直接回答你的問題。既然有人已經指出你的具體問題的答案只是「不」,我試圖提出一個可能有用的替代方案。我關於重寫的觀點是,如果您的興趣在於調整查詢,我的經驗是,簡單地擴展視圖文本的效用是有限的,理解查詢的實際執行更加有用。 – 2010-10-15 14:11:16

1

有一些方法來擴大意見,但輸出是如此的醜陋也未必有用。

12c有一個名爲DBMS_UTILITY.EXPAND_SQL_TEXT的新程序。

11g有一個未公開的程序dbms_sql2.expand_sql_text

下面是一個簡單的例子。輸出可能對優化器有幫助,但如果您需要可讀的SQL語句,則可能沒有多大用處。

create or replace view view1 as select 1 a, 2 b from dual; 
create or replace view view2 as select a from view1; 

declare 
    v_output clob; 
begin 
    dbms_utility.expand_sql_text('select * from view2', v_output); 
    dbms_output.put_line(v_output); 
end; 
/

Output: 
SELECT "A1"."A" "A" FROM (SELECT "A2"."A" "A" FROM (SELECT 1 "A",2 "B" FROM "SYS"."DUAL" "A3") "A2") "A1" 
+0

你打我吧:) – 2013-07-03 01:44:23