Postgresql &引用;“功能不存在”;创建包含更多参数的函数时出错

Postgresql &引用;“功能不存在”;创建包含更多参数的函数时出错,postgresql,plpgsql,postgresql-9.3,Postgresql,Plpgsql,Postgresql 9.3,我删除了一个PL/pgSQL函数,并尝试用一个以上的参数(默认值)重新创建它。但我有一个奇怪的错误: ERROR: function vytvor_kod_sj(text, integer, integer) does not exist SQL state: 42883 在删除或调用函数时,而不是在创建函数时,我可能会遇到这样的错误。我确保错误完全是在尝试创建它时发生的,而不是在我从同一个sql文件创建的任何其他函数或触发器中 我做了一个没有最后一个参数的伪函数,现在它可以工作了,但它肯定不

我删除了一个PL/pgSQL函数,并尝试用一个以上的参数(默认值)重新创建它。但我有一个奇怪的错误:

ERROR: function vytvor_kod_sj(text, integer, integer) does not exist
SQL state: 42883
在删除或调用函数时,而不是在创建函数时,我可能会遇到这样的错误。我确保错误完全是在尝试创建它时发生的,而不是在我从同一个sql文件创建的任何其他函数或触发器中

我做了一个没有最后一个参数的伪函数,现在它可以工作了,但它肯定不是我想要的-不仅我不再需要没有最后一个参数的函数,我通常只调用前两个或三个参数的函数,所以我需要在创建新版本的函数后删除它,以避免不匹配。幸运的是,执行此操作时没有错误,但这并不是最佳解决方案

有人知道如何解决这个神秘的问题吗

我有Windows32上的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
变量,而不是作为参数,并且没有测试它是否为null。否则,我不会更改任何内容。

在发布问题后,我注意到问题的原因:

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

它试图改变旧的功能。

一个提出得很好的问题,即使它被证明是一个疏忽。