plpgsql:如何在sql语句中引用变量

时间:2016-03-19 06:11:42

标签: postgresql plpgsql

我是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语句。< / p>

出于调试目的,我尝试用SELECT INTO替换常量值中的变量并且它有效:

SELECT count( bill_id) INTO nb_bills from t_bills where name = 'joe';

我不知道如何在r.name声明中引用SELECT INTO。 我尝试了r.name,我尝试创建另一个包含引号的变量,它总是返回NULL 我被卡住了。如果有人知道......

1 个答案:

答案 0 :(得分:0)

  

SELECT INTO总是返回NULL

  

未正确传递给SELECT INTO语句。

  

总是返回NULL。

这一切都没有意义。

在PL / pgSQL中,

SELECT语句本身不会 返回 。您必须将结果分配给变量,或使用其中一个可用的RETURN变体显式返回结果。

SELECT INTO 用于变量赋值,也不返回任何内容。不要与普通SQL中的SELECT INTO混淆 - 通常不鼓励:

我们不清楚你的例子应该返回什么。您没有透露函数的返回类型,并且您实际上没有返回任何内容。

首先阅读手册中的Returning From a Function章节。 以下是一些相关答案和示例:

可能存在与参数名称的命名冲突。除非您发布完整的函数定义,否则我们无法判断。

更好的方法

也就是说,只有在极少数情况下才需要显式游标。通常,FOR循环的隐式游标更易于处理且更便宜:

大多数时候你根本不需要任何游标或循环。基于集合的解决方案通常更简单,更快捷。