2016-12-26 4 views
0

私は次のコードを持っている:- 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を返すように、このコードを変更したいと思います。失敗があれば、私は「偽」または他の一言を欲しい。

今私は、コマンドラインを通じて初めてから実行したときに、それが返されます。

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

DO文はvoidを返すことができますので、私はあなたがテキストを返す一時的関数の実行終了を作成する必要があると思うので:あなたはpsqlのオプション--tuples-only--quietを必要とする冗長性を排除するために

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 -d widgets --quiet --no-align --tuples-only -f test.sql 

ショートバージョン:

psql -d widgets -qAt -f test.sql 

PS:出力を簡単に解析するために、あなたはまた、--no-ALIGNを使用することができますが、明示的シーケンスを作成する必要はありません。シーケンスは、タイプSERIAL

を使用して自動的に作成されます。
関連する問題