Добавляйте столбец в таблицу firebird, только если он не существует, в противном случае игнорируйте инструкцию ALTER

Мне нужно добавить столбец, если он не существует в таблице Firebird. Согласно официальной документации Как добавить столбец, если его нет в таблице:

EXECUTE block as
BEGIN
    if (not exists(
        select 1 from RDB$RELATION_FIELDS rf
        where rf.RDB$RELATION_NAME = 'TABLE_NAME' and rf.RDB$FIELD_NAME = 'COLUMN_NAME'))
then
execute statement 'ALTER TABLE TABLE_NAME ADD COLUMN_NAME DECIMAL(6,6);';
END

Этот код отлично работает при первом выполнении (если столбец не существует - он создается). Но когда этот код запускается во второй раз (когда столбец уже существует) - выдается ошибка:

Мой код JavaScript перехватывает эту ошибку, и программа прекращает выполнение. Что мне нужно: если столбец уже существует - просто игнорировать этот блок.

Поймать ошибку и игнорировать ее. Это оператор WHEN в PSQL и оператор try-catch в JavaScript.

user13964273 15.11.2022 23:37

К вашему сведению, сайт firebirdfaq.org не является «официальной документацией».

Mark Rotteveel 16.11.2022 11:11

Предоставьте минимальный воспроизводимый пример и укажите точную версию Firebird, которую вы используете.

Mark Rotteveel 16.11.2022 11:14

Firebird версии 2.5

Yurii 16.11.2022 11:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил эту задачу по-другому: сначала — проверить, существует ли столбец:

SELECT RDB$FIELD_NAME AS FIELD_NAME
FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME='my_table_name'
AND RDB$FIELD_NAME = 'my_field_name';

В результате я получаю массив. Если массив содержит FIELD_NAME - просто продолжайте выполнять другой код. Если массив пуст (что означает, что столбца my_field_name там нет) - я запускаю оператор ALTER:

ALTER TABLE my_table_name ADD my_field_name DECIMAL(6,6);

Не забывайте, что идентификаторы без разделителей в системных таблицах пишутся в верхнем регистре.

user13964273 16.11.2022 13:56

Другие вопросы по теме