在一个文件中组合多个postgres脚本

时间:2012-03-14 11:11:30

标签: postgresql

我有两个文件在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行:DO $$ BEGIN

在MS SQL上,我可以通过在两个脚本之间放置GO语句来创建新的上下文来解决这个问题。任何线索如何在Postgres 9中做到这一点?

2 个答案:

答案 0 :(得分: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(do block)中:

psql (9.1.3)
Type "help" for help.

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

答案 1 :(得分: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')
  ;

编辑:删除了WHERE子句(这里它甚至没有效果)表上的PK约束无论如何都会避免多次初始化。

另一种连接方式是通过包含。您可以创建“主”脚本,并从中包含片段。当你想“评论”整个部分时,它会派上用场。

-- Master script.

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

-- EOF