Я удалил функцию PL/pgSQL и пытаюсь воссоздать ее с еще одним параметром (со значением по умолчанию). Но я получаю странную ошибку:
ERROR: function vytvor_kod_sj(text, integer, integer) does not exist
SQL state: 42883
Я бы ожидал такой ошибки при удалении или вызове функции, а не при ее создании. Я убедился, что ошибка возникает именно при попытке ее создания, а не в каких-либо других функциях или триггерах, которые я создал из того же файла sql.
Я сделал фиктивную функцию без последнего параметра и теперь она работает, но это определенно не то, что я хочу - мало того, что мне больше не нужна функция без последнего параметра, я обычно вызываю функцию только с первыми двумя или тремя параметр, поэтому мне нужно удалить его сразу после создания новой версии моей функции, чтобы избежать несоответствий. К счастью, ошибок при этом не возникает, но вряд ли это оптимальное решение.
Так кто-нибудь знает, как решить эту загадочную проблему?
У меня есть PostgreSQL 9.3.4 в Windows 32; Я использую 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
, а не параметр, и не было проверки, является ли она нулевой. В остальном я ничего не менял.