使用SQL游标更新
我需要sql脚本的帮助 Inventory是一个包含orderunit、location、siteid和itemnum的表。此更新旨在通过以下方式更改同一项(itemnum)的所有“orderunit=NULL”:使用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
%_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;