使用SQL游标更新

使用SQL游标更新,sql,postgresql,cursor,psql,Sql,Postgresql,Cursor,Psql,我需要sql脚本的帮助 Inventory是一个包含orderunit、location、siteid和itemnum的表。此更新旨在通过以下方式更改同一项(itemnum)的所有“orderunit=NULL”: %_TAB => %_TD 及 我希望使用游标得到相同的结果: UPDATE INVENTORY A SET A.orderunit = (SELECT B.orderunit FROM INVENTORY B

我需要sql脚本的帮助

Inventory是一个包含orderunit、location、siteid和itemnum的表。此更新旨在通过以下方式更改同一项(itemnum)的所有“orderunit=NULL”:

%_TAB => %_TD 

我希望使用游标得到相同的结果:

UPDATE INVENTORY A 
SET A.orderunit = (SELECT B.orderunit 
                   FROM INVENTORY B 
                   WHERE B.location = A.siteid || '_TD' 
                     AND B.itemnum = A.itemnum) 
WHERE A.location = A.siteid || '_TAB' 
  AND A.orderunit IS NULL;

UPDATE INVENTORY A 
SET A.orderunit = (SELECT B.orderunit 
                   FROM INVENTORY B 
                   WHERE B.location = A.siteid || '_ACM' 
                     AND B.itemnum = A.itemnum) 
WHERE A.location = A.siteid || '_TD' 
  AND A.orderunit IS NULL;
我试着这样做,但似乎不起作用

DECLARE
    inv_itemnum INVENTORY.itemnum%TYPE
    inv_location INVENTORY.location%TYPE
    inv_siteid INVENTORY.siteid%TYPE
    inv_orderunit INVENTORY.orderunit%TYPE

    CURSOR c_inventory_tab IS
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TAB' AND orderunit IS NULL
        FOR UPDATE;
    CURSOR c_inventory_td IS
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TD' AND orderunit IS NULL
        FOR UPDATE;
    CURSOR c_inventory_tabB
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TD' AND itemnum = itemnum;
    CURSOR c_inventory_tdB
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_ACM' AND itemnum = itemnum;
BEGIN
    FOR i IN c_inventory_tab
    LOOP
    UPDATE INVENTORY
    SET orderunit = c_inventory_tabB;
    END LOOP;
END;

感谢您的帮助

是否有理由切换到游标?使用基于集合的处理的RDBMS更新通常要高效得多。这仅仅是一个学习练习,还是你期望绩效提升?这是一个学习练习,你需要说
UPDATE。。。其中c_库存_选项卡的当前值
。您还需要使用
FETCH
命令自己移动
c\u inventory\tabB
光标,直到两个光标指向相同的
itemnum
。如果对查询结果进行排序,则可以更有效地执行此操作。是否有理由切换到游标?使用基于集合的处理的RDBMS更新通常要高效得多。这仅仅是一个学习练习,还是你期望绩效提升?这是一个学习练习,你需要说
UPDATE。。。其中c_库存_选项卡的当前值
。您还需要使用
FETCH
命令自己移动
c\u inventory\tabB
光标,直到两个光标指向相同的
itemnum
。如果对查询结果进行排序,则可以更有效地执行此操作。
DECLARE
    inv_itemnum INVENTORY.itemnum%TYPE
    inv_location INVENTORY.location%TYPE
    inv_siteid INVENTORY.siteid%TYPE
    inv_orderunit INVENTORY.orderunit%TYPE

    CURSOR c_inventory_tab IS
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TAB' AND orderunit IS NULL
        FOR UPDATE;
    CURSOR c_inventory_td IS
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TD' AND orderunit IS NULL
        FOR UPDATE;
    CURSOR c_inventory_tabB
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_TD' AND itemnum = itemnum;
    CURSOR c_inventory_tdB
        SELECT orderunit FROM INVENTORY WHERE location = siteid || '_ACM' AND itemnum = itemnum;
BEGIN
    FOR i IN c_inventory_tab
    LOOP
    UPDATE INVENTORY
    SET orderunit = c_inventory_tabB;
    END LOOP;
END;