我是 PL/pgSQL 的新手,不知道如何在 SELECT
语句中引用变量。
在下面这个函数中,SELECT INTO
总是返回 NULL
:
$body$
DECLARE
r RECORD;
c CURSOR FOR select name from t_people;
nb_bills integer;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN NOT FOUND;
RAISE NOTICE 'name found: %', r.name;
SELECT count(bill_id) INTO nb_bills from t_bills where name = r.name;
END LOOP;
END;
$body$
RAISE NOTICE
允许我验证我的 CURSOR
是否正常工作:名称已正确检索,但由于某些我仍然不知道的原因,没有正确传递给 SELECT INTO
语句。
出于调试目的,我尝试用常量值替换 SELECT INTO
中的变量,结果成功了:
SELECT count( bill_id) INTO nb_bills from t_bills where name = 'joe';
我不知道如何在 SELECT INTO
语句中引用 r.name
。
我试过 r.name
,我试图创建另一个包含引号的变量,它总是返回 NULL
。
我卡住了。如果有人知道...
最佳答案
the
SELECT INTO
always returns NULL
not properly passed to the
SELECT INTO
statement.
it is always returning NULL.
这些都说不通。
SELECT
语句本身在 PL/pgSQL 中不返回任何东西。您必须将结果分配给变量或使用可用的 RETURN
变体之一显式返回结果。
SELECT INTO
仅用于变量赋值,也不返回任何内容。不要与普通 SQL 中的 SELECT INTO
混淆——通常不鼓励这样做:
不清楚您的示例中应该返回什么。您没有透露函数的返回类型,也没有实际返回任何东西。
首先阅读章节 Returning From a Function在手册中。 以下是一些带有示例的相关答案:
- Can I make a plpgsql function return an integer without using a variable?
- Return a query from a function?
- How to return multiple rows from PL/pgSQL function?
- Return setof record (virtual table) from function
并且可能与参数名称存在命名冲突。除非您发布完整的函数定义,否则我们无法判断。
更好的方法
也就是说,显式游标实际上只在极少数情况下才需要。通常,FOR
循环的隐式游标更易于处理且成本更低:
大多数情况下,您甚至根本不需要任何游标或循环。基于集合的解决方案通常更简单、更快速。
关于postgresql - plpgsql : how to reference variable in sql statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098527/