【问题标题】:PL/pgSQL: How to assign a table's column to a declared parameter?PL/pgSQL:如何将表的列分配给声明的参数?
【发布时间】:2016-08-26 03:16:19
【问题描述】:

看看这个简单的 PL/pgSQL 函数:

create or replace function test() returns void()
as $$
declare 
a int;
begin
select more_than_one_value into a from my_table;
-- do some other job using a
end;
$$ 
language plpgsql;

调用此函数时,只选择一个行,因为select into 只将一个值传递给a,尽管more_than_one_value 列有很多值。

是否有任何便捷的方法可以从表中选择多个值,然后将它们分配给变量 a ?我知道create temp table as select 是一种方法。我正在寻找替代品。

【问题讨论】:

  • 您可以将它们存储在一个数组中。但是,如果您想将这些值插入到another_table 中,只需执行insert into another_table (col_1) select some_column from my_table 即可,无需循环并且快得多
  • 您可以在select a,b,c,d into a1,b1,c1,d1 from my_table limit 1; 定义任意数量的变量。
  • 我假设column more_than_one_value has many values 你的意思是表my_table 有很多行?顺便说一句,a 尚未在您的示例中声明,既不是参数也不是变量。

标签: postgresql variable-assignment plpgsql


【解决方案1】:

您可以使用几个选项:

  • 您可以在一个INTO 子句中使用多个变量:

    SELECT f1, f2, f3, f4 INTO v1, v2, v3, v4 FROM ...
  • 您可以使用记录类型:

    DECLARE
     a my_table%rowtype
    BEGIN
     SELECT * INTO a FROM my_table WHERE ...
     INSERT INTO another_table VALUES (a.*);
     ...
  • 或者完全忘记变量:

    INSERT INTO another_table
     SELECT * FROM my_table WHERE ...

【讨论】:

  • 首先,非常感谢。 1.多个变量是一个不错的选择,但是如果一个表有10000行,那么我必须定义10000个变量,所有的值都可以赋值。 2.即使使用了记录类型,也只会提取一条记录。好吧,我希望提取多行。 3. 我知道这是执行数据修改的正确方法,但问题不在于插入。
  • 您永远不会每行使用一个变量。相反,你得到一行,处理它并移动到下一行。您使用显式 CURSOR 或循环查询结果。这是plpgsql 的标准工作方式。
【解决方案2】:

为此,您需要一个 循环

多行

如果 "many values" 应该表示 多行,我建议使用带有隐式光标的 FOR loop

CREATE OR REPLACE FUNCTION test_rows()
  RETURNS void AS
$func$
DECLARE
   i int;  -- scalar variable
BEGIN
   FOR i IN  -- repeated assignment
      SELECT more_than_one_value FROM my_table
   LOOP
      -- do something with i
   END LOOP;
END
$func$  LANGUAGE plpgsql;

在许多情况下,有更好的基于集合的解决方案(纯 SQL)来代替循环。

more_than_one_value 列的数据类型必须与变量(或参数)的类型匹配,否则赋值时会出错。

i 在这里是一个变量,而不是一个参数。后一个术语是指在调用中传递给函数的变量。

数组

如果 "many values" 应该表示数组,我建议FOREACH:

CREATE OR REPLACE FUNCTION test_arr()
  RETURNS void AS
$func$
DECLARE
   i int[];   -- array variable
   elem int;  -- scalar variable
BEGIN
   SELECT INTO i more_than_one_value
   FROM my_table LIMIT 1; -- assign single array column

   FOREACH elem IN ARRAY i
   LOOP
      -- do something with elem
   END LOOP;

END
$func$  LANGUAGE plpgsql;

【讨论】:

  • 那么这意味着没有方便的方法来为一个变量分配多个值?因为我看到你的答案中使用了循环,一个控制结构。
  • @k.xf: multiple values to a variable - 这应该是什么意思?字段、变量或参数具有 一个 值。您是在谈论多行或数组还是您在谈论什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2015-12-31
  • 2012-08-08
  • 2021-11-11
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多