PL / pgSQL:如何将表的列分配给声明的参数?

时间:2016-05-01 07:16:17

标签: postgresql variable-assignment plpgsql

看看这个简单的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有很多值。< / p>

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

2 个答案:

答案 0 :(得分:0)

您可以使用以下几种选项:

  • 您可以在一个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 :(得分:0)

您需要 循环

多行

如果“多个值”应该表示 多行 ,我建议使用隐式游标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变量,而不是参数。后一项是指在调用中传递给函数的变量。

阵列

如果“很多值”应该是指 数组 ,我建议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;