Объединение нескольких скриптов postgres в один файл - PullRequest
1 голос
/ 14 марта 2012

У меня есть два файла, которые хорошо работают при выполнении их в Postgres.

Файл 1

CREATE TABLE ContractStatusEnum (
    id              SERIAL PRIMARY KEY,
    description         VARCHAR(4000) NOT NULL
);

* Файл 2

DO $$ BEGIN

    IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
    INSERT INTO ContractStatusEnum (id, description) VALUES
        (1, 'Ordered'),
        (2, 'Active'),
        (3, 'Stopped'),
        (4, 'Canceled'),
        (10, 'Inactive');
    END IF;
END $$

Однако, если я просто соберу их в один файл, произойдет сбой с

ОШИБКА: синтаксическая ошибка в или около "DO"
ЛИНИЯ 6: НАЧАТЬ $$ НАЧАТЬ

В MS SQL я могу решить эту проблему, создав новый контекст, поместив оператор GO между двумя сценариями. Любая подсказка, как это сделать в Postgres 9?

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Вам необходимо завершить свой блок DO точкой с запятой.

У меня работает следующее:

DO $$ BEGIN

    IF NOT EXISTS (SELECT * FROM ContractStatusEnum WHERE id = 1) THEN
    INSERT INTO ContractStatusEnum (id, description) VALUES
        (1, 'Ordered'),
        (2, 'Active'),
        (3, 'Stopped'),
        (4, 'Canceled'),
        (10, 'Inactive');
    END IF;
END $$
;

Я сохранил операторы в f1.sql (создать таблицу) и f2.sql (do block):

psql (9.1.3)
Type "help" for help.

postgres=> \i f1.sql
CREATE TABLE
postgres=> \i f2.sql
DO
postgres=> 
2 голосов
/ 14 марта 2012

Просто объедините фрагменты. Нет / или GO не требуется. (в интерактивном режиме для psql a \ g может потребоваться )

CREATE TABLE ContractStatusEnum (
    id              SERIAL PRIMARY KEY,
    description         VARCHAR(4000) NOT NULL
);

    -- File 2

 INSERT INTO ContractStatusEnum (id, description) VALUES 
     (1, 'Ordered'),
     (2, 'Active'),
     (3, 'Stopped'),
     (4, 'Canceled'),
     (10, 'Inactive')
  ;

РЕДАКТИРОВАТЬ: удалено предложение WHERE (здесь оно даже недопустимо). Ограничение PK для таблицы в любом случае позволит избежать множественной инициализации.

Другим способом объединения является включение . Вы можете создать «основной» сценарий и включить оттуда фрагменты. Удобно, когда вы хотите «закомментировать» целые порции.

-- Master script.

\i tables_create.sql
\i procedures_and_functions.sql
\i populate_the_tables.sql
\i do_some_checks.sql

-- EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...