2016-12-26 33 views
0

如何改變這是一個從.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 
$$ 

我想,這樣當它是成功的,它返回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,所以我覺得你需要創建結束執行臨時函數返回文本:

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對齊:

psql -d widgets --quiet --no-align --tuples-only -f test.sql 

短版:

psql -d widgets -qAt -f test.sql 

PS:你並不需要顯式地創建序列。序列自動創建使用類型SERIAL

相關問題