Да, это можно сделать через один запрос с использованием транзакций. Для этого можно использовать оператор UPDATE с формулами в качестве новых значений для столбцов.
Примерно так:
BEGIN;
UPDATE table1
SET stock2 = array.st,
sumStock = stock + stock2,
price = array.pr
FROM (VALUES ('art1', 'st1', 'pr1'), ('art2', 'st2', 'pr2'), ...) AS array(art, st, pr)
WHERE table1.article = array.art;
COMMIT;
В этом запросе сначала начинается транзакция с командой BEGIN. Затем обновляется таблица table1 с использованием оператора UPDATE. В качестве новых значений указываются формулы, которые берут значения из массива с помощью FROM и VALUES. С помощью условия WHERE задается, что строки в таблице table1 должны быть обновлены только для тех строк, у которых article совпадает с art из массива. В конце транзакция завершается командой COMMIT.