2016-01-22 3 views
1

У меня есть процедура, которая в какой-то момент делает копию строки из tableA + несколько полей tableB так:порядок Oracle столбец (динамически?)

INSERT INTO tableB 
SELECT a.*, 'field1', 'field2' 
FROM tableA a 
WHERE a.id = myId 

Проблема возникла, когда я должен был добавить новая колонка до tableA. Если я добавлю столбец в tableA, он будет добавлен в качестве последнего столбца, что сделает эту процедуру недействительной, потому что число столбцов не совпадает. Чтобы этот сценарий имел смысл, я должен добавить новый столбец от tableA до tableB. Я могу написать все столбцы вручную, но есть много столбцов, и я ищу что-то более пригодное для обслуживания

Есть ли способ добавить новый столбец в tableB в определенном положении? Если это невозможно, есть ли способ выбрать каждый столбец из tableA, кроме нового (поэтому я могу выбрать его как последний для tableB)? А если нет, то как я могу автоматизировать выбор/вставку столбцов?

Благодаря

+0

Пожалуйста, добавьте скрипты в таблицу с этими вопросами. –

+2

В SQL, о котором я знаю, нет никакого способа, который позволит вам выбрать каждый столбец, кроме указанных. Рассмотрите возможность использования триггеров событий для автоматического создания столбца в 'tableB'. Если вы хотите, чтобы работа по техническому обслуживанию выполнялась вручную, создайте список столбцов «tableA» один раз и поместите их в свою обработку процедур, добавив новый столбец в «tableB», когда будут сделаны некоторые изменения в структуре «tableA» –

+0

@Md. ShamimAlMamun Извините, это код с работы, я не могу добавить определения таблиц. Полезна ли какая-то конкретная часть скриптов таблицы? –

ответ

3

Это одна из причин select * часто рассматривается плохая идея в чем-либо, кроме специальных запросов (а иногда подзапросов и шарниров). Если структура таблицы меняется, вы немного застреваете.

You cannot select all but some columns. Вы также не можете добавить новый столбец в таблицу в определенной позиции. Вы могли бы recreate the table, но это делает недействительным все, что относится к нему, и может быть слишком медленным или использовать слишком много хранилища. Вы можете использовать the DBMS_REDEFINITION package, чтобы сделать это менее болезненным и видимым, если ваш стол подходит. Но вы, вероятно, не хотите этого делать каждый раз, когда структура меняется.

Другим вариантом, который я бы не рекомендовал, является вставка динамического оператора SQL с именами столбцов, сгенерированными во время выполнения от user_tab_columns. Но у этого есть свои проблемы, не в последнюю очередь, что вы также не можете проверять инструкцию insert до выполнения, и вам все равно нужно выяснить, как выравниваются столбцы в двух таблицах.

Разумная вещь - сделать одноразовый удар взрывающегося * в вашем коде. Вам не нужно вручную вводить все имена столбцов; you can generate them from a query against user_tab_columns и вырезать-вставить в вашу процедуру. Затем обслуживание требует не добавлять новые запросы к запросу, если они необходимы. Вы могли бы частично скомпоновать это, например. вы можете создать триггер, который заполняет таблицу истории, но, вероятно, не подходит в середине процедуры.


Как отметил Джастин Кейв, Oracle 12c introduced invisible columns, который поможет вам здесь, но обратите внимание, что статья Тома Kytes описывает это как обходной путь для «код приложения (ожидание будет исправлено!)», Так что вы должны еще в любом случае исправьте ссылку * - это просто дает вам пространство, чтобы обойти ее.

+0

Ну, это было то, чего я боялся.Но 'user_tab_columns' сделает задачу немного легче. Большое спасибо –

+1

Поскольку вы подробно описали параметры, вы можете включить трюк 12.1, чтобы сделать столбцы невидимыми, а затем снова увидеть, чтобы изменить порядок столбцов в таблице. Http://www.oracle.com/technetwork/ вопрос-архив/2014/14-май/o34asktom-2162246.html. –

+0

@ JustinCave - спасибо; Я не уверен, что смогу сделать это правосудие (я все еще не использовал 12c, позорно, и я не видел упомянутых ранее изменений). но я полагаю, что я бы поднял ответ, объяснив это, если этой ссылки недостаточно. (Мне нравится ссылка на «плохо закодированные приложения»!) –

Смежные вопросы