Получить ответ от EXECUTE в PLPGSQL

#postgresql #azure-sql-database #azure-postgresql

Вопрос:

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

 DO
$
DECLARE
    _table varchar[];
    loop_item text;
BEGIN
    SELECT array_agg(table_name::TEXT) FROM information_schema.tables 
    INTO _table
    WHERE table_schema = 'public';

FOREACH loop_item IN ARRAY "_table" 
LOOP
    IF loop_item != 'test' THEN     
        EXECUTE format('ALTER TABLE %s
        ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
    END IF;
END LOOP;
END;
$
 

Если инструкция EXECUTE не выполняется, печатается уведомление. Но я также хотел бы знать, когда он был успешно выполнен.
Как я могу захватить и ВЫЗВАТЬ ответное сообщение инструкции EXECUTE?

Информация: Я использую базу данных Azure для Postgres и не имею доступа к файлам конфигурации.

Ответ №1:

Поднимите NOTICE :

 IF loop_item != 'test' THEN     
    EXECUTE format('ALTER TABLE %I
        ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
    RAISE NOTICE 'Table %s altered', loop_item;
END IF;
 

Ваш исходный код уязвим для внедрения SQL, и вам следует использовать этот %I формат.

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

1. Мой вопрос был неточным. Это работает для ALTER TABLE, но мне интересно, можно ли захватить вывод, например, SELECT или INSERT, а затем поднять его? Таким образом, я могу удобно выполнять один запрос по многим таблицам.

2. EXECUTE 'SELECT ...' INTO record_var; RAISE '%', to_json(record_var);