Как найти основной столбец и имя таблицы для представления Oracle? - PullRequest
2 голосов
/ 23 июня 2010

Звучит так, будто это должно быть просто, но не так!Я не могу найти ни одного представления Oracle (метаданных), которое бы давало базовый столбец и имя таблицы для столбца представления Oracle.Единственный способ сделать это - проанализировать исходный SQL-код (что далеко от точной науки).

Просто чтобы объяснить, чего я хочу, рассмотрим следующий пример представления, который я создал в схеме SCOTT.:

<code>CREATE OR REPLACE VIEW EMP_DEP
(
   EMPLOYEE_NAME,
   DEPARTMENT_NAME
)
AS
SELECT 
   ENAME,
   DNAME 
FROM
   emp a,
   dept b
WHERE
   a.deptno= b.deptno
/

Теперь, учитывая имя и имя столбца EMP_DEP.DEPARTMENT_NAME, я хотел бы получить базовую таблицу и имя столбца, используемое представлением, которое является DEPT.DNAME,Кто-нибудь знает способ получить эту информацию, которая не включает в себя анализ SQL представления?

Ответы [ 7 ]

2 голосов
/ 04 декабря 2013

Поскольку запрашивающая сторона ищет любой экземпляр своей таблицы, а не в отношении конкретного представления, я бы порекомендовала:

SELECT *
  FROM DBA_DEPENDENCIES
 WHERE TYPE = 'VIEW'
   AND REFERENCED_TYPE = 'TABLE'
   AND REFERENCED_NAME = '<TABLE_NAME>'
2 голосов
/ 20 сентября 2013

Таблицы, использованные для создания представления, можно выбрать с помощью запроса:

select 
  name , 
  type , 
  referenced_name , 
  referenced_type
from 
  user_dependencies 
where 
  name = 'VIEW_NAME' and 
  type = 'VIEW' and  
  referenced_type = 'TABLE';

Если столбцы представления имеют одинаковое имя столбца столбца таблицы, попробуйте следующий запрос:

select 
  distinct table_name, column_name 
from 
  all_tab_columns 
where table_name in (select
                        referenced_name
                      from 
                        user_dependencies 
                      where 
                        name = 'VIEW_NAME' and 
                        type = 'VIEW' and  
                        referenced_type = 'TABLE') 
 and column_name in (select 
                        column_name 
                     from 
                        all_tab_columns 
                     where 
                        table_name = 'VIEW_NAME');
1 голос
/ 23 июня 2010

связанные процедуры могут быть полезны для определения зависимостей

Представление DBA_DEPENDENCIES предоставит вам список таблиц, на которых основано представление:

SELECT *
  FROM DBA_DEPENDENCIES
 WHERE OWNER = <Schema>
   AND NAME = <View_Name>
   AND TYPE = 'VIEW'
1 голос
/ 23 июня 2010

В 11g Oracle представила более точное отслеживание зависимостей .Таким образом, база данных знает, от каких столбцов таблицы зависит представление или тело пакета.Тем не менее, они, кажется, не выставили эти данные в виде.Но могут быть таблицы x $ с информацией.

1 голос
/ 23 июня 2010

sql, который определил представление, можно найти в all_views

set long 9999 
select TEXT from all_views where VIEW_NAME='MYVIEW';

Это единственный способ получить доступ к базовым таблицам и столбцам.

1 голос
/ 23 июня 2010

Нет способа, потому что определение каждого столбца представления - это выражение , а не (в общем случае) просто столбец таблицы. Например, SQL вашего представления может быть:

SELECT 
   UPPER(ENAME) || 'xxx',
   myfunction(DNAME)
FROM
   emp a,
   dept b
WHERE
   a.deptno= b.deptno

или, возможно,

SELECT ename || 'xxx', dname
FROM (
  SELECT 
     UPPER(ENAME) AS ename,
     myfunction(DNAME) AS dname
  FROM
     emp a,
     dept b
  WHERE
     a.deptno= b.deptno
)

Что вы ожидаете увидеть для "нижележащих столбцов" в этом примере?

0 голосов
/ 05 июня 2019

Это хорошо работает, если вам нужны таблицы представлений и зависимости столбцов:

WITH view_dependencies (view_name, table_name) AS (
    SELECT CONNECT_BY_ROOT d.name AS view_name, d.referenced_name AS table_name
    FROM all_dependencies d
    WHERE d.referenced_type IN ('TABLE', 'VIEW')
    START WITH d.name = UPPER('jtf_rs_resource_extns_vl') AND d.type = 'VIEW'
    CONNECT BY PRIOR d.referenced_name = d.name AND PRIOR d.referenced_type = d.type
)
SELECT deps.view_name, deps.table_name, tbl.table_id, cols.column_id, 
       cols.column_name  
FROM view_dependencies deps
    LEFT JOIN FND_TABLES tbl ON tbl.table_name = deps.table_name
    LEFT JOIN FND_COLUMNS cols ON tbl.table_id = cols.table_id
ORDER BY deps.view_name,  deps.table_name, cols.column_sequence;

Выходы

VIEW_NAME                   TABLE_NAME            TABLE_ID COLUMN_ID COLUMN_NAME
=======================================================================================
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563724  RESOURCE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563712  CREATED_BY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563713  CREATION_DATE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563718  LAST_UPDATED_BY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563719  LAST_UPDATE_DATE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563720  LAST_UPDATE_LOGIN
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563704  CATEGORY
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563725  RESOURCE_NUMBER
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563729  SOURCE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563686  ADDRESS_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563709  CONTACT_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563721  MANAGING_EMPLOYEE_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563730  START_DATE_ACTIVE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563714  END_DATE_ACTIVE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563732  TIME_ZONE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563711  COST_PER_HR
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563723  PRIMARY_LANGUAGE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563726  SECONDARY_LANGUAGE
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563717  IES_AGENT_LOGIN
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563728  SERVER_GROUP_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563687  ASSIGNED_TO_GROUP_ID
JTF_RS_RESOURCE_EXTNS_VL    JTF_RS_RESOURCE_EXTNS   80056   563710  COST_CENTER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...