这不能简单地完成,但是可以使用Oracle数据字典和一些动态SQL。
要找出奇数列,您需要查看ALL_TAB_COLUMNS视图。列COLUMN_ID对列1,2,3进行排序。因此,这将在SCOTT.EMP表中找到所有奇数列:select column_name, column_id
from all_tab_columns
where owner = 'SCOTT'
and table_name = 'EMP'
and mod(column_id,2) = 1
order by column_id;
这将返回类似:COLUMN_NAME COLUMN_ID
----------- ---------
EMPNO 1
JOB 3
HIREDATE 5
COMM 7
我们可以使用LISTAGG函数将其制成逗号分隔的列表:select listagg(column_name,',') within group (order by column_id) as result
from user_tab_columns
where table_name = 'EMP'
and mod(column_id,2) = 1;
RESULT
------
EMPNO,JOB,HIREDATE,COMM
现在我们可以添加到该SQL以生成所需的select语句:select 'select ' || listagg(column_name,',') within group (order by column_id) || ' from ' || table_name as sql
from user_tab_columns
where table_name = 'EMP'
and mod(column_id,2) = 1
group by table_name;
SQL
---
select EMPNO,JOB,HIREDATE,COMM from EMP
((请注意,我必须添加group by子句,因为LISTAGG不会聚合table_name)。
您可以在某些PL / SQL代码中使用该SQL来填充变量v_sql,然后使用DBMS_SQL package运行它。但这本身就是一个复杂的主题,我在这里不再赘述。