Как переименовать несколько столбцов в oracle с помощью одного оператора Alter table?

#oracle #plsql #ddl #alter

#Oracle #plsql #ddl #изменить

Вопрос:

Единственное, что я нашел, это переименование одного столбца за раз:

 ALTER TABLE table_name
RENAME COLUMN old_name TO new_name;
 

Я прочитал документацию Oracle и не смог получить ответ для многих столбцов одновременно.

Ссылка: https://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqljrenamecolumnstatement.html

Комментарии:

1. Почему вы не можете просто выдать несколько операторов? Как вы выбираете, какие столбцы переименовывать и как их называть? (Вы ссылались на документы JavaDB; версия Oracle RDBMS находится здесь ; но вы все равно можете переименовать только один alter оператор.)

2. Стандарт SQL (а вместе с ним Oracle DB и, возможно, большинство, если не все другие диалекты SQL) не определяет оператор ALTER TABLE, в котором вы можете изменить несколько имен столбцов за один выстрел. Итак, вам придется написать свой собственный код (или найти код, уже написанный кем-то другим), если вам нужно автоматизировать этот тип действий. ХОТЯ почему? Почему вам нужно переименовывать так много столбцов, что выполнение их по одному для вас невозможно?

Ответ №1:

Начиная с Oracle 18c, переименовать несколько столбцов таблицы одной командой невозможно.

Справочник по языку Oracle 18c SQL включает приведенную ниже диаграмму, иллюстрирующую, как RENAME_COLUMN_CLAUSE ALTER TABLE работает команда. К сожалению, почти каждое свойство столбца может быть изменено в группах, за исключением переименования.

введите описание изображения здесь

Ответ №2:

Вы можете использовать user_tab_columns представление словаря в качестве источника данных внутри курсора для оператора цикла

 declare
  v_table_name varchar2(40):='mytable';
begin
  for c in ( select from user_tab_columns where table_name = upper(v_table_name) )
  loop
    execute immediate ('ALTER TABLE '||c.table_name||' RENAME COLUMN '||c.column_name
                                                   ||' TO new_'||c.column_name);
  end loop;
end;
 

Комментарии:

1. Я подозреваю, что «old_name» и «new_name» в сообщении OP были общими — он может захотеть переименовать «бейсбол» в «MLB» и «баскетбол» в «NBA», например (используя имена США). Предлагаемое вами решение может быть адаптировано для этого более общего понимания проблемы, но оно БУДЕТ более сложным.

2. @mathguy возможно, вы правы, но у нас недостаточно информации о стратегии переименования.