Мое приложение использует базу данных PostgreSQL 9.1.Мы находимся в нашей бета-фазе и иногда находим ошибки в нашей схеме PostgreSQL.У нас есть инсталлятор, написанный и работающий, но теперь мы находимся в точке, где есть установки, которые нужно будет обновить, когда мы сделаем наш следующий выпуск.
Я разместил здесь более ранний вопрос, спрашиваякак заставить мой сценарий принимать решения.Ответ, с которым я пошел, состоял в том, чтобы использовать утверждение DO.Это прекрасно работает, но я столкнулся с проблемой.
Мы добавили в нашу базу данных таблицу, которая отслеживает последнюю установленную версию.Мой скрипт выглядит так:
DO $$$
BEGIN
IF NOT EXISTS ( SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2 ) THEN
-- Schema update statements go here
END IF;
END;
$$$ LANGUAGE plpgSQL;
Большинство операторов являются простыми, например, CREATE или DROP.Но одна из вещей, которые я должен сделать в следующем выпуске, - применить изменение кода к хранимой функции.Функция также написана на plpgSQL.Я использовал три (3) символа $$$ в приведенном выше коде, потому что эта хранимая процедура использует два (2) символа $$, потому что я подумал, что это заставит вложенный plpgSQL выглядеть по-другому и не заставит второй набор знаков доллара завершать первый.
Все же я получаю сообщение об ошибке, когда PostgreSQL нажимает на оператор DECLARE в моей хранимой процедуре.Он не видит текст функции как кавычки.
Как правильно это сделать?Должен ли я просто поместить хранимую процедуру за пределы этого блока DO и использовать состояние CREATE OR REPLACE для ее объявления?Или есть способ, которым я могу сохранить код в условии?
Тони