gpt4 book ai didi

postgresql - 创建具有更多参数的函数时出现 "Function does not exist"错误

转载 作者:行者123 更新时间:2023-11-29 12:27:24 24 4
gpt4 key购买 nike

我删除了一个 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变量,不是参数,也没有测试是否为null。否则我没有改变任何东西。

最佳答案

刚发完问题我就注意到了问题的原因:

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

它试图改变旧的功能。

关于postgresql - 创建具有更多参数的函数时出现 "Function does not exist"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com