PostgreSQL - 具有局部变量的函数 - 列引用不明确

2024-05-08

我查看了与我的主题相匹配的其他问题,但就我而言,我认为歧义来自于与列同名的变量。

这是我尝试创建的函数的简化版本:

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(使用前将#替换为@)

PostgreSQL - 具有局部变量的函数 - 列引用不明确 的相关文章

随机推荐