Ако DELETE
не намира отговарящ на изискванията ред, неговият RETURNING
клаузата връща няма редове .
Заглавието изисква "условно АКТУАЛИЗИРАНЕ/ВМЪКВАНЕ след ИЗТРИВАНЕ" , но тялото се оплаква, че "се проваля, ако няма ред за изтриване" . Ако наличието на ред за изтриване не е условието, тогава какво е условието?
Излизайки на крайник, товаможе бъди това, което искаш:
CREATE FUNCTION updateoutfit(_id UUID, _title text DEFAULT NULL::text, _garments json)
RETURNS TABLE (id UUID, title text, garments json)
LANGUAGE sql AS
$func$
DELETE FROM outfit_garment WHERE outfit_id = _id; -- DELETE if exists
INSERT INTO outfit (id, title) -- UPSERT outfit
VALUES (_id, _title)
ON CONFLICT (id) DO UPDATE
SET title = EXCLUDED.title;
WITH ins AS ( -- INSERT new rows in outfit_garment
INSERT INTO outfit_garment (position_x, outfit_id)
SELECT "positionX", _id
FROM json_to_recordset(_garments) AS x("positionX" float) -- outfit_id UUID was unused!
RETURNING json_build_object('positionX', position_x) AS garments
)
SELECT _id, _title, json_agg(garments)
FROM ins
GROUP BY id, title;
$func$;
Той изтрива всички редове от таблицата outfit_garment
за дадения UUID, след това или вмъква, или актуализира ред в таблицата outfit
и накрая добавя нови редове с подробности в таблицата outfit_garment
. Всеки outfit_id
премина в _garments
се игнорират.
След това връща един ред с всички облекла, обединени в JSON стойност.