postgresql - plpgsql : how to reference variable in sql statement

标签 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 语句。

出于调试目的,我尝试用常量值替换 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在手册中。 以下是一些带有示例的相关答案:

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

更好的方法

也就是说,显式游标实际上只在极少数情况下才需要。通常,FOR 循环的隐式游标更易于处理且成本更低:

大多数情况下,您甚至根本不需要任何游标或循环。基于集合的解决方案通常更简单、更快速。

关于postgresql - plpgsql : how to reference variable in sql statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36098527/

相关文章:

sql - 在 EXECUTE 上传递 ROWTYPE 参数

postgresql - 使用变量作为语句的一部分

php - 静态插入后的 Doctrine 增量 id

database - postgresql 9.更新不工作

postgresql - 创建一个方法,从可用作 View 的不同表中返回一组记录

postgresql - 将参数传递给 Postgres 中的存储函数

postgresql - 我可以在 PostgreSQL 触发器函数中迭代 NEW 吗?

postgresql - 如何在一个Docker容器中运行python应用程序和postgres?

Postgresql递归函数

ruby-on-rails - 设置列默认值是否会损害数据库空间?