2014-04-01 41 views
0

我真的需要這個幫助,它適用於我的大學項目,而且我卡住了。PostgreSQL和Libpq - 當需求不滿足時創建打印行的觸發器

最大的想法是在表上創建一個觸發器,如果​​未滿足值要求,它將向用戶輸出一條消息,並且不允許插入語句繼續。

我已經有一個doSQL(conn,「query」)函數將查詢發送到數據庫並打印任何結果(如果有的話)。任何SELECT,UPDATE或INSERT都可以正常工作,但是,我有多行查詢的問題。

例如這樣的:

doSQL(conn, "CREATE OR REPLACE FUNCTION najnizsza_krajowa() RETURNS trigger AS $$ BEGIN IF NEW.pensja<1500 THEN SELECT 'Pensja poniżej najniższej krajowej'; END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql' "); 

返回一個錯誤說ERROR: syntax error at or near "END"指示在END IF;(不是後END)。這之後,我有一個創建觸發器聲明

doSQL(conn, "CREATE TRIGGER pensja_check BEFORE INSERT ON pracownik FOR EACH ROW EXECUTE PROCEDURE najnizsza_krajowa();"); 

我猜應該工作,但我保持搞亂我的函數的東西它只是說功能缺失。我該做什麼錯誤的功能?

編輯:doSQL功能,如要求:

void doSQL(PGconn *polaczenie, char *komenda){ 
PGresult *rez; 

printf("%s\n", komenda); 

rez = PQexec(polaczenie, komenda); 
printf("Status: %s\n", PQresStatus(PQresultStatus(rez))); 
printf("Komunikaty: %s\n", PQresultErrorMessage(rez)); 

switch(PQresultStatus(rez)) { 
case PGRES_TUPLES_OK: 
printTuples(rez); 
break; 
case PGRES_FATAL_ERROR: 
printf("Coś nie tak!"); 
break; 
} 
PQclear(rez); 
} 

對不起,一些波蘭的名字,希望這沒有多大關係。 在此先感謝您的幫助,這對我來說非常重要。

+0

是否有任何理由不能使用psql或PgAdmin來提交您的創建語句? – Kuberchaun

+0

是的,這是我的項目所必需的。我知道,有點愚蠢,但我無能爲力。 – Asunez

+0

當我在PgAdmin中運行你的創建函數時,只刪除起始雙引號和結束雙引號,它創建時沒有錯誤。您需要爲doSQL提供源代碼。 – Kuberchaun

回答

0

您檢測到的unescaped single quotes不是的問題。你不能在沒有目標的plpgsql函數中使用SELECT。你會使用PERFORM,但這仍然不是你想要的。 RAISE an EXCEPTION

要做到這一點:

打印一條消息給用戶,並不允許插入語句進行。

使用,而不是:

CREATE OR REPLACE FUNCTION najnizsza_krajowa() 
    RETURNS trigger AS 
$$ 
BEGIN 
IF NEW.pensja < 1500 THEN 
    RAISE EXCEPTION 'Pensja poniżej najniższej krajowej'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql 

或者你可以RAISE一個WARNINGRETURN NULL;避免回滾。

並且不要引用語言名稱: 'plpgsql' 。這是一個標識符,而不是一個字符串。