基于变量值更新某个字段

时间:2014-08-13 15:41:29

标签: sql oracle plsql

我需要根据循环变量决定更新哪个字段。所以用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;

1 个答案:

答案 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。但是这个更大设计问题。)