如何更改从.sql文件 - plpgsql返回的输出

时间:2016-12-26 18:16:26

标签: postgresql plpgsql

我有以下代码:

DO $$
BEGIN   
        CREATE TABLE IF NOT EXISTS widget_changes (
            change_id integer NOT NULL,
            change_date date NOT NULL default CURRENT_DATE,
            change_file character varying(255),
            description character varying(255)
        );


        IF NOT EXISTS (SELECT 0 FROM pg_class where relname = 'widget_changes_change_id_seq' )
        THEN
            CREATE SEQUENCE widget_changes_change_id_seq
                START WITH 1
                INCREMENT BY 1
                NO MINVALUE
                NO MAXVALUE
                CACHE 1
                USING local;
                ALTER TABLE ONLY widget_changes ALTER COLUMN change_id SET DEFAULT nextval('widget_changes_change_id_seq'::regclass);
                INSERT INTO widget_changes VALUES (DEFAULT,DEFAULT, 'test.sql', 'test description');

        END IF;

END
$$

我想更改此代码,以便在成功时返回OK。如果有任何失败,我想要" FALSE"或其他一些单词。

现在,当我从命令行运行时,第一次返回:

testbox:/tmp/ss# psql -U postgres -d widgets -f test.sql
DO

然后当我再次运行它时,它返回:

psql:test.sql:26: NOTICE:  relation "widget_changes" already exists, skipping
CONTEXT:  SQL statement "CREATE TABLE IF NOT EXISTS widget_changes (
            change_id integer NOT NULL,
            change_date date NOT NULL default CURRENT_DATE,
            change_file character varying(255),
            description character varying(255)
        )"

PL/pgSQL function inline_code_block line 3 at SQL statement
DO

看起来它成功地测试了" EXISTS"条件,但我需要防止所有的冗长,只需返回一个OK / FAIL类型的东西。 任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

因为DO语句只能返回void,所以我认为你需要创建一个结束执行一个返回文本的临时函数:

CREATE OR REPLACE function create_table() RETURNS TEXT AS $$
DECLARE output TEXT;
BEGIN
  IF NOT EXISTS (select 1 from pg_tables where tablename = 'widget_changes') THEN
    CREATE TABLE widget_changes (
            change_id SERIAL NOT NULL,
            change_date date NOT NULL default CURRENT_DATE,
            change_file character varying(255),
            description character varying(255)
        );
    output = 'OK';    
  ELSE
    output = 'FALSE'; 
  END IF;
  INSERT INTO widget_changes VALUES (DEFAULT,DEFAULT, 'test.sql', 'test description');
  RETURN output;
END
$$ language plpgsql;

SELECT create_table();
DROP FUNCTION create_table();

为了消除冗长,您需要psql选项--tuples-only--quiet。为了更容易解析输出,您还可以使用--no-align:

psql -d widgets --quiet --no-align --tuples-only -f test.sql 

简短版本:

psql -d widgets -qAt -f test.sql

PS:您不需要明确创建序列。使用类型SERIAL

自动创建序列