我想使用函数在表中添加多行
但无法通过F1(thebook book[]
)。
如有任何解决方案,请提供帮助。
CREATE TABLE book
(
id smallint NOT NULL DEFAULT 0,
bname text,
btype text,
bprices numeric(11,2)[],
CONSTRAINT key PRIMARY KEY (id )
);
CREATE OR REPLACE FUNCTION save_book(thebook book)
RETURNS text AS
$BODY$
DECLARE
myoutput text :='Nothing has occured';
BEGIN
update book set
bname=thebook.bname,
btype=thebook.btype,bprices=thebook.bprices WHERE id=thebook.id;
IF FOUND THEN
myoutput:= 'Record with PK[' || thebook.id || '] successfully updated';
RETURN myoutput;
END IF;
BEGIN
INSERT INTO book values(thebook.id,thebook.bname,thebook.btype, thebook.bprices);
myoutput:= 'Record successfully added';
END;
RETURN myoutput;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
SELECT save_book(row(111,'the art of living','ABC', array[190,220])::book);
答案 0 :(得分:0)
最多100行,为方便起见,请使用VARIADIC
参数。这样,您可以列出单个行,但没有弄清楚行数组的复杂语法。该参数仍然作为函数内的数组可见。详细说明:
在Postgres中使用新的UPSERT实施 9.5 + INSERT ... ON CONFLICT UPDATE
:
使用unnest()
CREATE OR REPLACE FUNCTION save_book(VARIADIC thebook book[])
RETURNS void AS
$func$
BEGIN
INSERT INTO book(id, bname, btype, bprices) -- spell out target columns!
SELECT *
FROM unnest(thebook) t
ON CONFLICT (id) DO UPDATE
SET bname = excluded.bname -- excluded key word!
, btype = excluded.btype
, bprices = excluded.bprices;
END
$func$ LANGUAGE plpgsql;
呼叫:
SELECT save_book('(111,"the art of living",ABCX, "{190,220}")'
, '(112,"the art of living",ABCY, "{190,220}")');
相关: