вывод данных из all_tab_columns - PullRequest
       36

вывод данных из all_tab_columns

0 голосов
/ 14 октября 2019

У меня есть тест таблицы со многими столбцами-заполнителями, значения которых на самом деле являются именами столбцов из некоторых таблиц в базе данных. я хочу создать запрос, который возвращает владельца, имя_таблицы, имя_столбца для всех столбцов-заполнителей

DROP TABLE TEST;
create  table test (cat varchar2(10) , filler_1 varchar2(10), filler_2 varchar2(10));

INSERT INTO TEST
SELECT 
'A',    'DOB','BIRTH_DT' FROM DUAL
UNION ALL
SELECT 'B', 'GENDER'    ,'T_GENDER' FROM DUAL
UNION ALL
SELECT 'C', 'ACT_ID',   'ACT_NO' FROM DUAL;
COMMIT;

ожидаемый результат:

CAT      OWNER       TABLE_NAME     COLUMN_NM
A       SCOTT        ABC            DOB
A       SCOTT        XXX            BIRTH_DT
B       HR           AAA            GENDER
B       HR           BBB            T_GENDER
C       SCOTT        CCC            ACT_ID
C       HR           DDD            ACT_NO

как мне добиться этого, используя all_tab_columns, как естьмного колонок наполнителя такого рода. Спасибо

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Вы можете просто использовать следующий запрос:

Select t.cat, c.owner, c.table_name, c.column_name
from all_tab_columns c
Join test t
On (c.column_name in (t.filler_1, filler_2))

Примечание: all_tab_columns представления предоставят все таблицы, на которые у вашего пользователя есть права, а user_tab_columns представления предоставят все таблицы вашего собственного пользователя. .

Ура !!

0 голосов
/ 14 октября 2019

Вот опция скрипта, использующая динамически создаваемое представление. Будет ли это работать?

DECLARE
  sql_string VARCHAR2(4000);

  CURSOR columns_cur IS
    SELECT column_name
    FROM   all_tab_columns
    WHERE  table_name = 'TEST'
    AND    column_name LIKE 'FILLER\_%' ESCAPE '\';
BEGIN
  sql_string := 'CREATE OR REPLACE VIEW test_v AS ';

  FOR r IN columns_cur LOOP
    sql_string := sql_string||' SELECT cat, '||r.column_name||' filler FROM test UNION ';
  END LOOP;

  sql_string := SUBSTR(sql_string, 1, LENGTH(sql_string) - 6);

  EXECUTE IMMEDIATE sql_string;
END;
/

SELECT b.cat, a.owner, a.table_name, a.column_name column_nm
FROM   all_tab_columns a,
       test_v b
WHERE  a.column_name = b.filler
AND    a.column_name IN (
  SELECT filler
  FROM   test_v);

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

...