Функция не существует ошибка при создании функции с большим количеством параметров

Я удалил функцию 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, а не параметр, и не было проверки, является ли она нулевой. В остальном я ничего не менял.


person Pavel V.    schedule 10.07.2014    source источник
comment
Хорошо поставленный вопрос, даже если он оказался недосмотром.   -  person Erwin Brandstetter    schedule 12.07.2014


Ответы (1)


Я заметил причину проблемы сразу после публикации вопроса:

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

Он пытается изменить старую функцию.

person Pavel V.    schedule 10.07.2014