Этого еще не может быть сделано со 100% родным SQL. Обычно эти чрезмерно динамические ситуации лучше всего избегать; немного дополнительной типизации, как правило, лучше, чем добавление сложного кода.
Если у вас действительно есть исключительный случай и готовы заплатить цену is способ сделать это. Он не использует 100% естественный SQL, но его можно считать «чистым» SQL, так как он использует структуру Data Data Cartridge для расширения базы данных.
Вы можете использовать мой проект с открытым исходным кодом Method4 для запуска динамического SQL в SQL. Следуйте инструкциям Github, чтобы загрузить и установить объекты. Код мучительно сложный, но, к счастью, вам не нужно будет разбираться в большей части этого. Для начала настройки имен столбцов необходимы только простые изменения.
Method4 Изменения
Создать переменную для хранения имя нового столбца. Добавьте его в раздел объявления функции ODCITableDescribe, в строке 12 файла METHOD4_OT.TPB.
v_new_column_name varchar2(32);
Создайте инструкцию SQL, чтобы сопоставить старый столбец с новым столбцом. Добавьте это в строку 31, где она будет запущена для каждого столбца.
--Get mapped column name if it exists. If none, use the existing name.
select nvl(max(target_column_name), r_sql.description(i).col_name)
into v_new_column_name
from column_names
where source_column_name = r_sql.description(i).col_name;
Изменение линии 42 для обозначения нового имени переменной:
substr(v_new_column_name, 1, 30),
Mapping Таблица
drop table column_names;
create table column_names
(
source_column_name varchar2(30),
target_column_name varchar2(30),
constraint column_names_pk primary key(source_column_name)
);
insert into column_names values('A1234', 'BETTER_COLUMN_NAME');
insert into column_names values('B4321', 'Case sensitive column name.');
Запрос Пример
Теперь имена столбцов из любого дие ry может волшебным образом изменить любые значения, которые вы хотите. И это не просто использует замену текста; также меняются столбцы от *
.
SQL> select * from table(method4.query('select 1 a1234, 2 b4321, 3 c from dual'));
BETTER_COLUMN_NAME Case sensitive column name. C
------------------ --------------------------- ----------
1 2 3
Предупреждения
Oracle SQL чудовищно сложный и любая попытка построить слой на вершине, если он имеет много потенциальных проблем. Например, производительность, безусловно, будет медленнее. Хотя я создал много модульных тестов, я уверен, что есть некоторые странные типы данных, которые не будут работать корректно. (Но если вы их найдете, создайте вопрос Github, чтобы я мог исправить его.)
По моему опыту, когда люди просят такого типа динамического поведения, это обычно не стоит затрат. Иногда небольшая дополнительная набраковка - лучшее решение.
Спасибо Jon! Я благодарен вам за то, что уделил время времени, чтобы ответить и даст этот шанс. Причина, по которой я ищу динамическое решение, заключается в том, что каждый раз, когда мне нужно запускать этот запрос, и это часто - это против новых таблиц с новыми именами столбцов. –