postgreSQL 中不存在函数.. 为啥?
Posted
技术标签:
【中文标题】postgreSQL 中不存在函数.. 为啥?【英文标题】:function does not exists in postgreSQL .. Why ?postgreSQL 中不存在函数.. 为什么? 【发布时间】:2018-10-22 06:39:48 【问题描述】:需要你的帮助,不明白为什么会出现以下错误,我不是专业的 postgresql 开发人员..
如您所见,函数已创建,那么为什么函数不存在呢?
create or replace function loginAttempt (u_email character varying, u_password character varying, date_time timestamptz, OUT attempt smallint) returns smallint AS $$
BEGIN
INSERT INTO login_attempts (typed_password, date_time, attempt_nu, email) VALUES (u_password, date_time, attempt_nu, email);
IF attempt = 3 THEN INSERT INTO warnings (u_email,u_password) VALUES (u_email,u_password);
END IF;
END;
$$ LANGUAGE plpgsql;
select loginattempt ('Jon.Jones88@gmail.com','+_@kjhfdb987', now(), 1);
错误:函数登录尝试(未知,未知,带时区的时间戳,整数)不存在 第 1 行:选择登录尝试 ('Jon.Jones88@gmail.com','+_@kjhfdb987',... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 SQL 状态:42883 字符:8
【问题讨论】:
你的 Postgres 版本是多少(select version();
会告诉你)
PostgreSQL 10.5,由 Visual C++ build 1800 编译,64 位
【参考方案1】:
您已将最后一个参数定义为 OUT 参数,这意味着您不能为其传递值。
你需要使用:
select loginattempt ('Jon.Jones88@gmail.com','+_@kjhfdb987', now());
由于您没有写入参数attempts
,因此我认为没有理由将其定义为一开始的输出参数。如果需要,您可以简单地返回该值:
create or replace function loginAttempt (u_email character varying, u_password character varying, u_date_time timestamptz, u_attempt smallint)
returns smallint
AS $$
BEGIN
INSERT INTO login_attempts (typed_password, date_time, attempt_nu, email)
VALUES (u_password, u_date_time, u_attempt, u_email);
IF u_attempt = 3 THEN
INSERT INTO warnings (u_email,u_password) VALUES (u_email,u_password);
END IF;
return u_attempt;
END;
$$ LANGUAGE plpgsql;
由于1
的值被假定为整数,因此您需要在调用函数时强制转换该值:
select loginattempt ('Jon.Jones88@gmail.com','+_@kjhfdb987', now(), 1::smallint);
在线示例:https://rextester.com/YNIQ55561
【讨论】:
为什么我的函数 loginattempt 中有 2 个未知参数类型,正如您从错误消息中看到的那样? @Maks.Burkov:您需要将1
转换为 smallint。并且您还应该确保您的函数参数与列的名称不同,以避免混淆以上是关于postgreSQL 中不存在函数.. 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中,调用 PostgreSQL 函数,为啥我收到一个错误,通知该函数不存在?
表中不存在键,但它是 | Postgresql, timescaledb