我有以下代码:
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类型的东西。 任何提示将不胜感激。
答案 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
自动创建序列