Это не может быть сделано просто, но это возможно, используя словарь данных Oracle и некоторые динамические значения c 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 ' || 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
, потому что table_name
не агрегируется LISTAGG).
Вы можете использовать SQL в некотором коде PL / SQL для заполнения переменной v_sql
, а затем использовать СУБД_ SQL пакет для ее запуска. Но это сложный топи c сам по себе, и я не буду go в него здесь.