Переход от циклов FOR в plpgsql к командам SQL на основе множеств
У меня довольно тяжелый запрос сFOR
цикл переписать и хотел бы сделать это проще, используя больше SQL вместо конструкций plpgsql. Запрос выглядит так:
FOR big_xml IN SELECT unnest(xpath('//TAG1', my_xml)) LOOP
str_xml = unnest(xpath('/TAG2/TYPE/text()', big_xml));
FOR single_xml IN SELECT unnest(xpath('/TAG2/single', big_xml)) LOOP
CASE str_xml::INT
WHEN 1
THEN
INSERT INTO tab1(id, xml) VALUES (1, single_xml);
WHEN 2
THEN
INSERT INTO tab2(id, xml) VALUES (1, single_xml);
WHEN 3
[...]
WHEN 11
[...]
ELSE
RAISE EXCEPTION 'something'
END CASE;
END LOOP;
END LOOP;
RETURN xmlelement(NAME "out", xmlforest(1 AS out));
Я начал переписывать его для лучшей производительности с:
INSERT INTO tab1(id, xml)
SELECT 1, unnest(xpath('/TAG2/single', (SELECT unnest(xpath('//TAG1', my_xml))));
Но я не уверен, как бороться с этимиCASE ... INSERT
заявления. Есть идеи? Или, может быть, мой подход совершенно не так?
отредактировано 25.02.14: PostgreSQL 9.3.1