2016-05-11 190 views
-1

我遇到了問題。oracle sql更新不能正常工作

在這裏我的表。

--tableA-- 

id | number | step | limit | last_update 
------------------------------------------------------- 
1 | 0  | 0  | 5  | 10-05-2016 08:00:00 


--tableB-- 

id | number | step | last_update 
-------------------------------------------- 
1 | 1  | 1  | 10-05-2016 08:00:00 

在這裏我的代碼。

for cur in 
(
     select id,number,step,limit,last_update 
     from 
      tableA 
) 
loop 
     if cur.number < cur.limit then 

      cur.number := mod(cur.number,3) + 1; --calculator cur.number increase from 1 -> 3 

      insert into tableB(id,number,step,last_update) -- INSERT OK 
      values (cur.id,cur.number,cur.step + 1,cur.last_update); 
      commit; 

      cur.step := cur.step + trunc(cur.number/3); --calculator cur.step increase by cur.number 
      -- here : cur.number = 1 and cur.step = 1 

      update tableA 
      set 
        number = cur.number  -- not update 
        ,step = cur.step  -- not update 
        ,last_update = sysdate -- update ok 
      where id = cur.id 
      commit; 

     end if; 
end loop; 

cur.number = 1個cur.step = 1之前運行更新命令

爲什麼TABLEA與ID = 1只更新LAST_UPDATE,數量和步驟不會更新。

更新表A後:數= 0,步長= 0

更新代碼

for cur in 
(
     select id,number,step,limit,last_update 
     from tableA 
) 
loop 
     if cur.number < cur.limit then 

      cur.number := mod(cur.number,3) + 1; --calculator cur.number increase from 1 -> 3 

      insert into tableB(number,step,last_update) -- INSERT OK 
      values (cur.number,cur.step + 1,cur.last_update); 
      commit; 

      -- cur.step := cur.step + trunc(cur.number/3); --calculator cur.step increase by cur.number 
      -- here : cur.number = 1 and cur.step = 1 

      select number,step into temp_number,temp_step 
      from tableB where id = cur.id; 

      update tableA 
      set 
        number = temp_number -- not update 
        ,step = (temp_step - 1) + trunc(temp_number/3) -- not update 
        ,last_update = sysdate -- update ok 
      where id = cur.id 
      commit; 

     end if; 
end loop; 

請幫助我。

謝謝大家。

+0

您無法更新遊標的值。你需要把新的值賦給一個變量。 :) –

+0

爲什麼插入成功tableA與cur.number = 1和cur.step = 1 ?. – user2964569

+0

問題是更新的權利? –

回答

0

讓我們看看以下步驟:

我,你有一個CURSOR,你會開什麼第一

II,之後你插入一行:

 insert into tableB(number,step,last_update) -- INSERT OK 
     values (cur.number,cur.step + 1,cur.last_update); 
     commit; 

III,還有一個不必要SELECT INTO:

 select number,step into temp_number,temp_step 
     from tableB where id = cur.id; 

iv,最後是UPDATE:

 update tableA 
     set 
       number = temp_number -- not update 
       ,step = (temp_step - 1) + trunc(temp_number/3) -- not update 
       ,last_update = sysdate -- update ok 
     where id = cur.id 
     commit; 

SELECT INTO是不必要的,因爲步驟iii中的值相同,並且步驟iv, 您正在更新當前ID的相同值。

CURSOR在過程中是一個常量結果集,它在插入後不會更改

+0

如果我把遊標值存儲並執行更新命令。 TableA會更新? – user2964569

+0

是的,表會被更新,但是在那個時候遊標已經在更新之前得到結果集,所以它不會包含更新的值 – Thomas