2014-07-10 82 views
1

我放棄了PL/pgSQL函數,並試圖用一個參數(具有默認值)重新創建它。但我得到一個奇怪的錯誤:使用更多參數創建函數時出現「函數不存在」錯誤

ERROR: function vytvor_kod_sj(text, integer, integer) does not exist 
SQL state: 42883 

我會期望這樣的錯誤,而不是在創建它時刪除或調用該函數。我確定錯誤發生時正好嘗試創建它,而不是在我從同一個sql文件創建的任何其他函數或觸發器中。

我做了一個沒有最後一個參數的虛擬函數,它現在可以工作,但它絕對不是我想要的 - 不僅我不需要沒有最後一個參數的函數,我通常只用函數調用函數前兩個或三個參數,所以我需要在創建我的函數的新版本後立即刪除它以避免不匹配。幸運的是,這樣做沒有錯誤,但它並不是最佳解決方案。

那麼有誰知道如何解決這個神祕的問題?

我在Windows 32上有PostgreSQL 9.3.4;我使用的pgAdmin 1.18.1

我的代碼:

CREATE OR REPLACE FUNCTION vytvor_kod_sj(_akce text, typ_sj integer, 
    podtyp integer DEFAULT 0, styl integer DEFAULT NULL) 
RETURNS text AS $$ 
DECLARE 
    --styl integer; 
    _nazev_seq text; 
    _min integer; 
    _max integer; 
    _nazev text; 
    _soucasna integer; 
BEGIN 
    IF styl IS NULL THEN 
    SELECT nomenklatura INTO styl FROM akce WHERE kod_akce = _akce; 
    END IF; 

    IF NOT EXISTS(SELECT id_nom FROM pro_nom_pravidlo_sj 
     WHERE id_nom = styl AND sj = typ_sj AND typ = podtyp) THEN 
    IF podtyp = 0 OR NOT EXISTS(SELECT id_nom FROM pro_nom_pravidlo_sj 
     WHERE id_nom = styl AND sj = typ_sj AND typ = 0) THEN 
     RAISE NOTICE 'Pro daný typ stratigrafické jednotky není vytvořeno žádné pravidlo!'; 
     RETURN NULL; 
    ELSE 
     podtyp := 0; 
    END IF; 
    END IF; 

    _nazev_seq := _akce || '_' || typ_sj || '_' || podtyp || '_seq'; 
    IF NOT EXISTS (SELECT 0 FROM pg_class where relname = _nazev_seq) THEN 
    SELECT min, max INTO _min, _max FROM pro_nom_pravidlo_sj 
     WHERE id_nom = styl AND sj = typ_sj AND typ = podtyp; 
    IF _max IS NOT NULL THEN 
     EXECUTE format('CREATE SEQUENCE %I MINVALUE %s MAXVALUE %s ', _nazev_seq, _min, _max); 
    ELSE 
     EXECUTE format('CREATE SEQUENCE %I MINVALUE %s ', _nazev_seq, _min); 
    END IF; 
    END IF; 

    --IF strict IS TRUE THEN 
    RETURN (
     SELECT predpona FROM pro_nom_pravidlo_sj 
     WHERE id_nom = styl AND sj = typ_sj AND typ = podtyp 
    ) || CAST(nextval(_nazev_seq) AS TEXT); 
    --END IF; 
END; 
$$ LANGUAGE plpgsql 
SECURITY DEFINER; 
ALTER FUNCTION vytvor_kod_sj(text, integer, integer) OWNER TO ins_daemon; 

老版曾styl變量聲明,而不是作爲一個參數,也沒有測試它是否爲空。否則,我沒有改變任何東西。

+0

一個很好的問題,即使它是一個疏忽。 –

回答

0

我注意到了問題的原因,只是張貼問題後:

ALTER FUNCTION vytvor_kod_sj(text, integer, integer) OWNER TO ins_daemon; 

它試圖改變舊的功能。