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

Mos*_*eyi 6 postgresql plpgsql postgresql-9.5

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

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

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 
Run Code Online (Sandbox Code Playgroud)

问题在于user_id右侧的WHERE被视为对该列的引用。

我肯定需要user_id一个局部变量,因为它将在函数中进一步使用UPDATEDELETE操作,但我不会将其作为参数传递,而仅将用户名传递。

经过一些阅读并且之前也遇到过一些参数问题,我意识到我可以使用,get_user_id.username但它仅适用于参数,而不适用于局部变量(如果我将它与变量一起使用,则查询会失败,因为没有 FROM 子句get_user_id)。

因此,我是否遗漏了关于在函数内的查询中使用变量的一些(不太)明显的内容?

- - 编辑

抱歉,我过于简化了该功能,当然,有一个获取 user_id 的第一个查询,并且该部分工作正常。

Pav*_*ule 8

任何局部变量都可以通过块标签限定

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
Run Code Online (Sandbox Code Playgroud)

通常所有可能发生冲突的局部变量都有前缀——公共前缀是_


Gor*_*off 6

我为参数和变量添加前缀,这样它们就不太可能与列名冲突:

CREATE OR REPLACE FUNCTION get_user_id (in_username TEXT) 
RETURNS INTEGER AS $$
  DECLARE
    v_user_id BIGINT;
  BEGIN
    SELECT u.user_id  INTO v_user_id FROM users u WHERE u.user_id = in_user_id;

    RETURN v_user_id;
  END
$$ LANGUAGE PLPGSQL 
Run Code Online (Sandbox Code Playgroud)

不过,您大概想比较用户名:

    SELECT u.user_id  INTO v_user_id FROM users u WHERE u.username = in_username;
Run Code Online (Sandbox Code Playgroud)