開發環境: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返回的個數一樣...