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一个局部变量,因为它将在函数中进一步使用UPDATE和DELETE操作,但我不会将其作为参数传递,而仅将用户名传递。
经过一些阅读并且之前也遇到过一些参数问题,我意识到我可以使用,get_user_id.username但它仅适用于参数,而不适用于局部变量(如果我将它与变量一起使用,则查询会失败,因为没有 FROM 子句get_user_id)。
因此,我是否遗漏了关于在函数内的查询中使用变量的一些(不太)明显的内容?
- - 编辑
抱歉,我过于简化了该功能,当然,有一个获取 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
Run Code Online (Sandbox Code Playgroud)
通常所有可能发生冲突的局部变量都有前缀——公共前缀是_。
我为参数和变量添加前缀,这样它们就不太可能与列名冲突:
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)
| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |