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:您不需要显式地创建序列。序列是使用类型自动创建的