从 all_tab_columns 输出数据

output data from all_tab_columns

我有一个 table 测试,其中包含许多填充列,其值实际上是数据库中某些 table 的列名。我想构建一个查询,其中 returns 所有者,table_name,column_name 用于所有填充列

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 实现此目的,因为有许多此类填充列。 谢谢

这是一个使用动态创建视图的脚本选项。那行得通吗?

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);

您显然可以扩展此技术以在一个视图中包含所有内容。

您可以简单地使用以下查询:

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 视图将提供您自己用户的所有表。

干杯!!