如何将复杂类型的数组插入表中

时间:2017-08-16 15:13:21

标签: postgresql

我有一个复杂的类型定义为:

create type TP_IdAndVer AS
(
    id  uuid,
    ver integer
);

我想将它们的数组插入临时表(所以我可以加入复合键)。

这是我到目前为止所做的,但它不起作用:

DO $$

declare fred TP_IdAndVer[];

BEGIN

drop table if exists tmpTable;

fred := array[ ('034892e4-6137-440c-bb62-b609b60575aa'::uuid, 1), ('034892e4-6137-440c-bb62-b609b60575aa'::uuid, 2) ];

create temporary table temptbl_ids_and_vers(id uuid, ver integer)
on commit drop;

-- I want to insert each row of fred as a row into my temp table. But how??
insert into temptbl_ids_and_vers(id, ver) values (fred);

CREATE TEMPORARY TABLE tmpTable AS
select * from temptbl_ids_and_vers;

END $$;

select  *
from    tmpTable;

我收到此错误:

ERROR:  INSERT has more target columns than expressions
LINE 1: insert into temptbl_ids_and_vers(id, ver) values (fred)
                                             ^
QUERY:  insert into temptbl_ids_and_vers(id, ver) values (fred)
CONTEXT:  PL/pgSQL function inline_code_block line 15 at SQL statement

********** Error **********

ERROR: INSERT has more target columns than expressions
SQL state: 42601
Context: PL/pgSQL function inline_code_block line 15 at SQL statement

如果有人能指出我正确的语法来使用它将是一个很大的帮助。我想我可以循环遍历每一行插入每一行的每个元素,但这感觉有点hacky。

或者,有没有办法将表传递给存储过程?这样可以解决我此刻想要实现的目标,因为我可以在不需要担心数组的情况下传递表格。

谢谢,

亚当。

2 个答案:

答案 0 :(得分:1)

INSERT INTO temptbl_ids_and_vers(id, ver)
SELECT *
FROM UNNEST(fred) AS q(id, ver)

答案 1 :(得分:0)

insert into temptbl_ids_and_vers(id, ver)
select id, ver
from unnest(fred) u