我需要根据循环变量决定更新哪个字段。所以用PERIOD1,PERIOD2 ...... PERIOD100
之类的东西替换'PERIOD || v_weeks'declare
v_itemid varchar2(6) := '111111';
v_weeks integer;
begin
FOR v_weeks IN 1..106
loop
select sum(qty)
into v_qty
from table_one
where item = v_itemid
and startdate = (v_startdate + (v_weeks * 7))
update table_two
set PERIOD||v_weeks = v_qty
where item = v_itemid
end loop;
end;
答案 0 :(得分:4)
当列或表名称不同时,您需要使用动态SQL,它允许您将SQL语句构造为字符串值,然后请求Oracle执行它。在Oracle 8之前,这需要使用DBMS_SQL包(在某些情况下仍然有用,例如出于性能原因减少解析调用的数量);但现在可用的用户友好方法是使用EXECUTE IMMEDIATE:
EXECUTE IMMEDIATE 'UPDATE table_two SET PERIOD' || v_weeks || ' = :qty WHERE item = :item'
USING v_qty, v_itemid;
(我建议每周都有一个单独的列是一个值得怀疑的设计。如果你将它规范化为一个子表,每个句点都有一行,那么你就不需要使用动态SQL。但是这个更大设计问题。)