Просмотр расширения в Oracle - PullRequest
5 голосов
/ 30 сентября 2010

Итак, у нас есть несколько разработчиков, которые немного порадовали.Так что теперь у нас есть представления, которые ссылаются на представления, ссылающиеся на представления, до тошноты.

Итак, чтобы помочь мне в настройке, расширить эти представления.

Мне нужна функция, которая принимает строку и возвращает строку.Входная строка - это запрос, выходная строка - это тот же запрос без представлений.

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. В чем-то еще

Ответы [ 3 ]

5 голосов
/ 01 октября 2010

Краткий ответ:

  1. Не в настоящее время

  2. Не знаю, что я знаю

ОБНОВЛЕНИЕ

Похоже, Oracle 12c имеет именно то, что вам нужно: DBMS_UTILITY.expand_sql_text

http://docs.oracle.com/cd/E16655_01/appdev.121/e17602/d_util.htm#ARPLS73973

3 голосов
/ 01 октября 2010

Одна проблема с тем, что вы предлагаете, состоит в том, что обычно существует несколько способов переписать запрос, включающий представления, поэтому простое расширение текста представлений не обязательно расскажет вам много о том, как выполняется запрос.

Поскольку ваша цель - настройка, я бы предположил, что планы выполнения запросов, вероятно, дадут вам информацию, которая вам действительно нужна.Это не покажет переписанный запрос, но покажет вам все действительные таблицы и то, как на них ссылаются при выполнении запроса.

Лучший способ, которым я знаю, для просмотра фактического плана выполнения:*

SELECT /*+ gather_plan_statistics */ * FROM myView

select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'))
1 голос
/ 28 июня 2013

Есть несколько методов для расширения представлений, но вывод настолько уродлив, что может оказаться бесполезным.

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"
...