В этом случае вам не следует использовать синтаксис:
var := (SELECT ..).
Предпочтительным должно быть SELECT INTO
:
SELECT * INTO curProd FROM ...
Синтаксис SELECT tabname FROM tabname
является проприетарным для PostgreSQL, и хотя онработает хорошо, лучше не использовать, из-за нечитаемости для всех без более глубокого знания PostgreSQL.
Поскольку PL / pgSQL не чувствителен к регистру, верблюжий случай не рекомендуется (лучше использовать случай змеи).
Если это возможно, не используйте стиль ISAM:
FOR _id IN
SELECT id FROM tab1
LOOP
SELECT * INTO r FROM tab2 WHERE tab2.id = _id
Это значительно медленнее, чем соединение (для большего количества итераций)
FOR r IN
SELECT tab2.*
FROM tab1 JOIN tab2 ON tab1.id = tab2.id
LOOP
..
Циклы ухудшают производительность.Эта часть не очень приятна:
FOR row_STab IN
(
SELECT *
FROM "SearchTable"
)
LOOP
INSERT INTO "PurchasedKeys"(sk_id, purchase_id, price)
VALUES (row_STab.sk_id, returnedPID, row_STab.price);
UPDATE "SerialKeys"
SET "SerialKeys".user_id = buyer_id
WHERE row_STab.sk_id = "SerialKeys".sk_id;
END LOOP;
Возможные решения:
Вместо этого используйте групповые команды:
INSERT INTO "PurchasedKeys"(sk_id, purchase_id, price)
SELECT sk_id, returnedPID, price
FROM "SearchTable"; -- using case sensitive identifiers is way to hell
UPDATE "SerialKeys"
SET "SerialKeys".user_id = buyer_id
FROM "SearchTable"
WHERE "SearchTable".sk_id = "SerialKeys".sk_id;
Меньшая производительность стиля ISAM зависит от количества итераций,Для низкой итерации это не важно, для более высокого числа это смерть.