как изменить выходные данные, возвращаемые из .sql файл-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
$$

Я хотел бы изменить этот код так, чтобы при успешном выполнении он возвращал ОК. Если есть какие-то сбои, я хочу «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

Похоже, что он успешно тестирует условия «существует», но мне нужно предотвратить всю многословность и просто вернуть вещь типа OK / FAIL.
Любые советы будут оценены.

1 ответ

  1. Поскольку оператор 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 --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