【问题标题】:Stored Procedure to Update Records by based on the values of other table in loop基于循环中其他表的值更新记录的存储过程
【发布时间】:2018-09-19 10:07:18
【问题描述】:

我有两张桌子。

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

现在,我想从表 A 更新表 B activityId,在 shiftidshiftDate 上查询表 A。

如何编写存储过程循环更新表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;

【问题讨论】:

  • Mysql 还是 postgresql ?到目前为止,您尝试了什么?
  • 向我们展示您当前的存储过程尝试。

标签: mysql sql postgresql


【解决方案1】:

将更新与连接一起使用,因此循环不需要存储过程

对于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;

【讨论】:

    【解决方案2】:
    This is POSTGRESQL STORED PROCEDURE
    
    
        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;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 2016-06-21
      • 2022-11-27
      • 1970-01-01
      相关资源
      最近更新 更多