sql - 从 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中实现这一点?
解决方案
我认为这是做不到的。
我会用视图来解决它。您可以自动生成/更新视图,但只能使用违反您要求的 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 中可用。
推荐阅读
- javascript - Firebase Admin SDK 或客户端是否应该处理令牌刷新?
- powershell - 如何声明具有空值的日期时间变量
- python-3.x - Python中的地板或天花板远离零
- python - DataTable 和 Map 组件并排或相互水平
- pandas - 转换 Spark DF 太 Pandas DF 和其他方式 - 性能
- oracle - Oracle 高级队列 - 丢失消息和最佳调试方法
- python - 如何从表单中获取数据并在 django 的下拉列表中显示
- javascript - 如何将鼠标悬停事件添加到图像
- workflow - 为什么气流没有像拖放这样的 UI 构建 dag 和任务的功能?
- php - Eloquent - 使用带有关系的闭包