Postgresql 如何更改';从.sql文件-plpgsql返回的

Postgresql 如何更改';从.sql文件-plpgsql返回的,postgresql,plpgsql,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 cha

我有以下代码:

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类型的东西。
任何提示都将不胜感激。

因为DO语句只能返回void,所以我认为您需要创建end-execute临时函数,该函数返回文本:

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选项
--仅元组
--安静
。为了更方便地解析输出,还可以使用--no align:

psql -d widgets --quiet --no-align --tuples-only -f test.sql 
简短版本:

psql -d widgets -qAt -f test.sql
PS:您不需要显式地创建序列。序列是使用类型自动创建的