【问题标题】:output data from all_tab_columns从 all_tab_columns 输出数据
【发布时间】:2019-10-14 19:09:05
【问题描述】:

我有一个表测试,其中包含许多填充列,其值实际上是数据库中某些表的列名。我想构建一个查询,该查询返回所有填充列的所有者、表名、列名

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 来实现这一点,因为这种类型的填充列有很多。 谢谢

【问题讨论】:

    标签: oracle plsql oracle12c


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但是有 30 个填充列,所以 30 个选择语句对我来说并不好。
    • “填充”列是否有模式?它们都是以“filler_”开头的吗?
    • 是的,所有列都以filler_开头,cat除外
    • 是否可以选择使用 PL/SQL?如果是这样,您可能可以使用流水线表实现您的目标。
    • 是的,任何选项都可以。
    【解决方案2】:

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

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

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2018-05-23
      • 2021-09-20
      • 1970-01-01
      相关资源
      最近更新 更多