【发布时间】:2018-05-30 21:03:32
【问题描述】:
我查看了与我的主题相匹配的其他问题,但在我的情况下,我相信歧义来自与列同名的变量。
这是我正在尝试创建的函数的简化版本:
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,因为它将在函数中进一步的UPDATE 和DELETE 操作中使用,但我不会将它作为参数传递,只有用户名。
经过一些阅读并且以前在参数方面也遇到了一些问题,我意识到我可以使用get_user_id.username,但它仅适用于参数,而不适用于局部变量(如果我将它与变量一起使用,则查询失败,因为没有 FROM- get_user_id 的子句)。
因此,关于在函数内部的查询中使用变量,我是否遗漏了一些(不那么)明显的东西?
--- 编辑
抱歉,我过于简化了函数,当然有一个获取 user_id 的第一个查询,并且该部分工作正常。
【问题讨论】:
-
你不是说
WHERE users.username = username -
抱歉,我过度简化了我的功能。我相信现在更有意义
-
我认为您可以通过为变量选择不同的名称来回避这个问题,即不是
user_id。此外,如果 user_id 在功能上依赖于用户名,则您真的不需要存储 user_id,无论在何处使用 user_id,都可以将其替换为用户名(如果需要,通过连接用户表) -
是的,最终我可能不得不这样做,但我也想知道这是否是设计使然,或者我缺少一些关于使用变量的知识
标签: postgresql plpgsql postgresql-9.5