Простой пример цикла pg / plsql - PullRequest
7 голосов
/ 25 февраля 2011

Мы перерабатываем схему таблицы в postgres. Раньше имелась таблица связывания с двумя таблицами partner и advertiser с именем partner_advertiser, поскольку мы предполагали много-многократные отношения между партнером и рекламодателем. Изменение сделано таким образом, что advertiser должен иметь только один partner, поэтому partner будет иметь отношение «один-май» к advertiser.

Как мне внести изменения, не потеряв предыдущую информацию? Данные таблицы компоновщика должны использоваться для заполнения отображения нового проекта схемы. Вот мой исходный код:

BEGIN

FOR r IN SELECT partnerid, advertiserid from partner_advertiser
    LOOP
    NEXT r;
    UPDATE advertiser SET partnerid = r.partnerid WHERE id = r.advertiserid 
    END LOOP;

END

Кстати, я сам не делал pg / plsql. Так что, если есть какие-то основные шаги, которые я должен сделать, пожалуйста, сообщите мне.

Ответы [ 3 ]

12 голосов
/ 25 февраля 2011

Вы можете использовать:

UPDATE advertiser a SET partnerid = r.partnerid
FROM partner_advertiser r
WHERE a.id = r.advertiserid

Как правило, простые реляционные преобразования, подобные этим, никогда не нуждаются в цикле. Если вам действительно это нужно, посмотрите на http://www.postgresql.org/docs/9.0/interactive/plpgsql-control-structures.html

Еще одно замечание: любое преобразование, очевидно, приведет к потере данных, если рекламодатель еще не является уникальным, поэтому сначала нужно выполнить что-то вроде

SELECT count(*), advertiserid FROM partner_advertiser
GROUP BY advertiserid HAVING COUNT(*) > 1

Если при этом будут возвращены какие-либо строки, вы можете исправить это вручную.

6 голосов
/ 25 февраля 2011

Это тоже работает.Используя простой plpgsql фрагмент:

CREATE OR REPLACE FUNCTIOn migratePartnerAdvertiser() RETURNS int4 AS '
DECLARE r RECORD;

BEGIN
    FOR r IN SELECT * from partner_advertiser LOOP
            UPDATE advertiser SET partnerId = r.partnerId WHERE id = r.advertiserId; 
    END LOOP;
return 1;
END;
' LANGUAGE plpgsql;


SELECT migratePartnerAdvertiser() as output;
0 голосов
/ 09 августа 2016
DECLARE id integer;
r record;
BEGIN<BR>
INSERT INTO tabla1(campo1, campo2) VALUES(UPPER(d1),UPPER(d2));<BR>
id = (SELECT LASTVAL());<BR>
FOR r IN SELECT mi_campo FROM tabla2 LOOP<BR>
    INSERT INTO tabla3(campo1, campo2, campo3)<BR>
    VALUES(0, id, r.mi_campo);<BR>
END LOOP;<BR>
END;
...