Oracle儲存過程裡的Update疑似失效的原因

2021-10-01 07:06:02 字數 2605 閱讀 5154

開發環境:oracle 11g r2 , pl/sql

今天工作中遇到了乙個很驚奇的問題,用儲存過程更新乙個表裡的字段時,就是無法正常更新進去。在sql script裡手動update後就能正常更新,詢問了乙個大神,找到了原因–就是用for迴圈游標一條一條更新,之前的殘餘資料不會被清除,特此記錄下,執行更新前一定要清理歷史資料。

--建立表test_zl_1和test_zl_1,test_zl_1插入5條資料,test_zl_2插入6條資料

--test_zl_2第六條模擬歷史資料

create

table test_zl_1

(id number,

name varchar2(20)

);insert

into test_zl_1 values(1

,'a');

insert

into test_zl_1 values(2

,'b');

insert

into test_zl_1 values(3

,'c');

insert

into test_zl_1 values(4

,'d');

insert

into test_zl_1 values(5

,'e');

commit

;create

table test_zl_2 as

select

*from test_zl_1 where1=

2;insert

into test_zl_2 values(1

,'a');

insert

into test_zl_2 values(2

,'a');

insert

into test_zl_2 values(3

,'a');

insert

into test_zl_2 values(4

,'a');

insert

into test_zl_2 values(5

,'a');

insert

into test_zl_2 values(6

,'a');

commit

;

--建立儲存過程,將test_zl_1根據id號更新進test_zl_2中

create

orreplace

procedure pro_test_zl_2

asbegin

for aa in

(select a.id,a.name from test_zl_1 a

)loop

update test_zl_2 b set b.name=aa.name where b.id=aa.id;

commit

;end

loop

;end pro_test_zl_2;

--執行儲存過程

call pro_test_zl_2();

--檢視test_zl_2表

第六條資料就是歷史資料沒有被更新,導致更新失敗,就是因為之前沒清除資料

可以換手工更新進行,首先將表還原回原來資料

create

table test_zl_2_bak as

select

*from test_zl_2 as

oftimestamp to_timestamp(

'2019-12-05 22:49:00'

,'yyyy-mm-dd hh24:mi:ss');

--時間戳操作查詢語句

--select * from v$sql where sql_text like '%update test_zl_2%'

delete test_zl_2 where1=

1;commit

;insert

into test_zl_2 select

*from test_zl_2_bak;

commit

;

此時,test_zl_2表已經恢復到剛開始建表的時候的資料

再在外用update操作

也就是說,在外用update更新時,它會根據關聯條件(a.id=b.id)進行更新,關聯不到的,就賦預設值null!!!

Oracle的儲存過程。

近日,因為工作需要,時間投入到寫儲存過程的中。下面貼上儲存過程。進行分析,以便自己記憶,和朋友分享儲存過程的寫法。曾幾何時,認為儲存過程很難,現在看來也並非如此。此儲存過程乃是我們用到遞迴刪除。宣告乙個帶引數的儲存過程,引數都是varchar型,如果帶有輸出引數的話,引數後面跟的型別必須有個out ...

oracle的儲存過程

以前一直對oracle的儲存過程概念很模糊,今天來複習一下 第一步 開啟輸出 set serveroutput on 第二步 建立表空間 create tablespace test data logging datafile d test.dbf size 50m autoextend on ne...

Oracle儲存過程呼叫儲存過程

oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...