在表格中插入多行的功能

时间:2018-11-24 13:13:54

标签: postgresql postgresql-9.1 postgresql-9.2 postgresql-9.5

所以我有下表。

             G
__________________________
id_musician  |    id_album
--------------------------
1            |    51
3            |    52
2            |    53
3            |    54
1            |    55
3            |    56

            C
__________________________
id_album    |      year
--------------------------
51          |    1990
52          |    2001
53          |    1990
54          |    2001
55          |    1945
56          |    1945

我创建了以下功能:

CREATE OR REPLACE FUNCTION test2 (year1 INTEGER, p_type VARCHAR(1))
RETURNS SETOF test2 AS $$
DECLARE
output test2;
BEGIN
IF p_type='S' THEN
FOR output IN SELECT g.id_artist, c.year, COUNT(c.id_album) AS albums
FROM G g, C c
WHERE g.id_album = c.id_album AND
c.year = year1
GROUP BY c.year, g.id_musician
LOOP
RETURN NEXT output;
END LOOP;
END IF
RETURN;
END;
$$LANGUAGE plpgsql;

test2是我创建的一种输出类型:

CREATE TYPE test2 AS(
        id smallint,
        year smallint,
        total_albums integer)

该函数接受perfomer的年份和类型。对于每个表演者和表演者(在本例中为吉他手,“ G”),它返回的是表演者每年参加的唱片数量。

我想要的功能是将该输出插入到我创建的表中,而不仅仅是显示输出:

CREATE TABLE TEST2_TABLE (
id smallint,
year smallint,
total_albums integer );

1 个答案:

答案 0 :(得分:1)

功能如下:

weibull_max.pdf(speeds, 2.5, 0, 30)

因此,签名和输出与原始功能相同。主要区别在于:

  • 无需使用循环并一次读取/返回一行。您可以直接返回查询结果。这样快很多。
  • 要完成插入表和返回相同结果的过程,它使用CTE,该CTE将数据插入表中并返回所插入的所有内容,然后从该CTE中选择作为返回输出。

我也删除了别名。除非使用双引号,否则postgres中的所有标识符均为小写。由于CREATE OR REPLACE FUNCTION test2 (year1 INTEGER, p_type VARCHAR(1)) RETURNS SETOF test2 AS $BODY$ BEGIN IF p_type='S' THEN RETURN QUERY ( WITH inserted AS ( INSERT INTO test2_table SELECT g.id_musician, c.year, COUNT(c.id_album)::INTEGER AS albums FROM g, c WHERE g.id_album = c.id_album AND c.year = year1 GROUP BY c.year, g.id_musician RETURNING * ) SELECT * FROM inserted ); ELSE RETURN; END IF; END $BODY$ LANGUAGE plpgsql; G不在引号中,因此表名实际上分别是Cg。所以我只使用实际的小写表名。

相关问题