2012-03-14 4 views
1

У меня есть два файла, которые отлично работают при их исполнении в Postgres.Объединение нескольких сценариев 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 $$ 

Однако, если я просто положить их вместе в один файл, он терпит неудачу с

ERROR: syntax error at or near "DO"
LINE 6: DO $$ BEGIN

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

+0

'Do' действительна только в pgplsql. Вы можете опустить это. Просто конкатенируйте фрагменты (возможно, каждый оператор заканчивается точкой с запятой. Синтаксис 'IF NOT EXISTS' недействителен: вместо этого используйте предложение WHERE. – wildplasser

+0

Оператор' IF NOT EXISTS' отлично работает при выполнении второго файла в postgres без конкатенации. Должен ли я запускать полный скрипт в pgplsql? –

+0

Да, вы можете даже перенаправить stdin для psql и использовать канал или '<', чтобы отправить весь файл сценария. Ehh: no, вам не нужно pgplsql, чтобы отправить код sql. просто исполняемый файл psql «terminal». – wildplasser

ответ

3

Необходимо положить конец вашему блоку 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 (сделать блок):

psql (9.1.3) 
Type "help" for help. 

postgres=> \i f1.sql 
CREATE TABLE 
postgres=> \i f2.sql 
DO 
postgres=> 
2

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

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') 
    ; 

EDIT: убрано ИНЕК (она даже не действует здесь) рк ограничение на столе будет избежать несколько инициализацых в любом случае.

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

-- Master script. 

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

-- EOF 
+0

Я понимаю, что могу избавиться от него, опуская pgplsql, но у меня есть более сложные скрипты, которые требуют работы в этом режиме. –

+0

Я не думаю, что pgplsql действителен вне процедур/функций. конечно, не захочет. – wildplasser

+0

@wildplasser: он, безусловно, действителен в блоке 'DO' –

Смежные вопросы