我查看了与我的主题相匹配的其他问题,但就我而言,我认为歧义来自于与列同名的变量。
这是我尝试创建的函数的简化版本:
CREATE OR REPLACE FUNCTION get_user_id(username TEXT)
RETURNS INTEGER AS $$
DECLARE
user_id BIGINT;
other_param TEXT;
BEGIN
SELECT INTO user_id user_id FROM users WHERE users.username = get_user_id.username;
SELECT INTO other_param users.value FROM users WHERE users.user_id = user_id;
RETURN user_id;
END
$$ LANGUAGE PLPGSQL
问题是user_id
在右侧WHERE
被视为对该列的引用。
我绝对需要user_id
在局部变量中,因为它将被用于UPDATE
and DELETE
沿着函数进一步操作,但我不会将其作为参数传递,而只会传递用户名。
经过一些阅读并且之前也遇到过一些参数问题,我意识到我可以使用get_user_id.username
但它仅适用于参数,不适用于局部变量(如果我将它与变量一起使用,则查询会失败,因为没有 FROM 子句get_user_id
).
因此,我是否遗漏了关于在函数内的查询中使用变量的一些(不太)明显的内容?
--- edit
抱歉,我过于简化了该功能,当然,有一个获取 user_id 的第一个查询,并且该部分工作正常。
任何局部变量都可以通过块标签限定
create table foo(a integer);
insert into foo values(10);
do $$
<<mylabel>>
declare
a int default 5;
r record;
begin
select foo.a into r
from foo
where foo.a = mylabel.a + 5;
raise notice '%', r.a;
end;
$$;
NOTICE: 10
DO
通常所有可能发生冲突的局部变量都有前缀 - 常见的前缀是_
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)