繁体   English   中英

SELECT 动态来自 DUAL 的列数

[英]SELECT no of columns dynamically from DUAL

我有如下要求:

我每次都必须显示 10 列。

假设我从一个有 7 列的表格tab中进行选择,我必须添加 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中实现这一点?

我认为这是做不到的。

我会用视图来解决它。 您可以自动生成/更新视图,但只能使用违反您要求的 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;
/

结果是一个视图,它选择 table 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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM