Хранимая процедура обновления записей на основе значений других таблиц в цикле - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть две таблицы.

Таблица A

   -------------------------------------------
    id    | date      | shiftId | activityId |
    -------------------------------------------
    1      2018-09-09     1          100
    2      2018-09-09     1          101

Таблица B

        ------------------------------------------------------------------
        id    | reading   | resourceId   |date  | shiftId | activityId 
        ------------------------------------------------------------------
        1        10.0            10       2018-09-09     1 
        2        11.0            11       2018-09-09     1

Теперь,Я хочу обновить ActivityId таблицы B из таблицы A, запрашивая таблицу A для shifttid и shiftDate .

Как написать хранимую процедуру для обновления таблицы B в цикле?

Я попробовал запрос ниже.

create or replace FUNCTION Update_TableB_ActivityId()
Returns Void as $$
Declare 
rec RECORD;
query text;
activityId integer;
BEGIN
query := 'select * from TableB where "activityId" is null;
FOR rec IN execute query
LOOP
execute 'select "activityId" from TableB where "date"=rec."date"' into activityId;
execute 'Update TableB set "activityId"=activityId where "id"=rec."id"';
END LOOP;

END;
$$ LANGUAGE plpgsql;

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018
This is POSTGRESQL STORED PROCEDURE

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>    CREATE OR REPLACE FUNCTION schemaName.updateactivityid()
      RETURNS text AS
    $BODY$
    declare
    c_shiftId   int;
    c_activityId int;
    c_date       date;
_curs cursor FOR select distinct shiftId,activityId,date from schemaName.TableA; ----Cursor
    BEGIN
    OPEN _curs ;	--- Opening Cursor

    LOOP
    FETCH _curs INTO c_shiftId,c_activityId,c_date;  
                                                  --- Fetching Cursor Data into Variables

    EXIT WHEN NOT FOUND;
    RAISE NOTICE 'shiftid %%%',c_shiftId;
    RAISE NOTICE 'activityid %%%',c_activityId;
    RAISE NOTICE 'date%%%',c_date;

   
Update table schemaName.TableB SET  TableB.activityId=c_activityId where TableB.date=c_date and TableB.shiftId=c_shiftId;   ---Update Statement
    
    END LOOP;
    Close _curs;
Return 'Y';
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION schemaName.updateactivityid()
      OWNER TO postgres;
0 голосов
/ 19 сентября 2018

Использовать обновление с объединением, поэтому не требуется хранимая процедура для цикла

Для mysql:

UPDATE tableb
    JOIN tablea on tablea.shiftid=tableb.shiftid and 
tablea.date=tableb.date
SET tableb.activityid=tablea.activityid

Для postgres:

UPDATE tableB
SET tableb.activityid=tablea.activityid
FROM tableA
WHERE tableA.shiftid=tableB.shiftid and 
    tableA.date=tableB.date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...