看看这个简单的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
是一种方法。我正在寻找替代方案。
答案 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;