首页 > 解决方案 > 从 DUAL 中动态选择列数

问题描述

我有如下要求:

我每次都必须显示 10 列。

假设我从一个tab有 7 列的表中选择,我必须添加 3 个额外的列,如下所示:

select * from tab,(select 'dummy' d1 , 'dummy' d2 , 'dummy' d3 from dual);

如果表中的列数增加到 8,则:

select * from tab,(select 'dummy' d1 , 'dummy' d2  from dual);

有没有办法在不使用 PL/SQL的情况下在Oracle 11g中实现这一点?

标签: sqldatabaseoracle

解决方案


我认为这是做不到的。

我会用视图来解决它。您可以自动生成/更新视图,但只能使用违反您要求的 PL/SQL:

DECLARE
  a CONSTANT VARCHAR2(100) := 'CREATE OR REPLACE VIEW v AS SELECT ';
  b CONSTANT VARCHAR2(100) := ' FROM TAB';
  c VARCHAR2(3000);
  i NUMBER;
  max_cols CONSTANT NUMBER := 10;
BEGIN
  SELECT listagg(column_name,',') WITHIN GROUP (ORDER BY column_id) INTO c
    FROM user_tab_columns
   WHERE table_name = 'TAB';  
  SELECT count(*) INTO i 
    FROM user_tab_columns
   WHERE table_name = 'TAB';  
  WHILE (i < max_cols) LOOP
    i := i + 1;
    c := c || ', ''dummy'' AS col_'||i;
  END LOOP;
  c := a || c || b;
  DBMS_OUTPUT.PUT_LINE(C);
  EXECUTE IMMEDIATE c;
END;
/

结果是一个视图,它选择表的所有列tab并填充包含的列,dummy直到达到 10 列:

CREATE OR REPLACE VIEW v AS 
SELECT C1,C2,C3,C4,C5,C6,C7, 
       'dummy' AS col_8, 'dummy' AS col_9, 'dummy' AS col_10 
  FROM TAB;

下一个想法是使用流水线表函数来填充表的列,但这再次违反了您的无 PL/SQL 要求。

第三,我想到了多态表函数,但它们仅在 Oracle 18 中可用。


推荐阅读