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
變量聲明,而不是作爲一個參數,也沒有測試它是否爲空。否則,我沒有改變任何東西。
一個很好的問題,即使它是一個疏忽。 –