[英]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.