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

标签 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 

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

我确实需要在局部变量中使用 user_id,因为它会在函数中的 UPDATEDELETE 操作中使用,但我赢了'获取它作为参数传递,只有用户名。

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

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

---编辑

抱歉我过度简化了函数,当然有第一个查询获取 user_id,那部分工作正常。

最佳答案

任何局部变量都可以用 block 标签限定

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

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

关于PostgreSQL - 具有局部变量的函数 - 列引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613331/

相关文章:

postgresql - 从 Postgresql 迁移到 Postgres-XL : distributed tables design

postgresql - 如何在postgresql函数中连接两个字符串?

sql - 从匿名 block 中的变量创建带密码的用户

postgresql - 如何在带有 where 子句的 sequelize 中使用嵌套包含?

arrays - 在 PostgreSQL 9.5+ 中追加(推送)和从 JSON 数组中删除

sql - 错误 INSERT 命令后 Postgres SERIAL 添加值

sql - 仅当它是数字时如何选择列? PostgreSQL

ruby-on-rails - 验证有条件时数据库中的唯一性验证

postgresql - 如何在触发器函数中选择多个变量?

sql - PostgreSQL 撤销列的权限