oracle存儲過程更新
⑴ Oracle存儲過程,更新大量數據,如何循環分批次提交
可通過以下方法:
以100條數據為例,如果海量數據可參考。
如test表中有如下數據:
sql">declare
iint;--定義變數
v_countint;--定義變數
v_loopint;--定義變數
begin
selectcount(*)intov_countfromtest;--計算表內數據總數
selectceil(v_count/10)intov_loopfromal;--計算需要循環次數
i:=1;--為i賦值
whilei<=v_looploop--循環退出條件
updatetestsetbegintime=<=10;--執行更新
commit;--提交
i:=i+1;--i依次加1
endloop;--結束循環
end;
⑵ ORACLE中,寫一個存儲過程來更新表中的某個欄位值
給你思路, 首先查出表中總數 ,保存總數, 然後定義一個當前條數,從0開始,每次調用給它加5000。update語句執行則用rownum,跟你保存的當前條數作為條件判斷.
⑶ oracle 更新的存儲過程怎麼寫
UPDATETESTOPT1
SETDEVICE_NO=
(SELECTRN
FROM(SELECTNAME,ROWNUMRN
FROM(SELECTDISTINCTNAMEFROMTESTOP))T2
WHERET1.NAME=T2.NAME);
COMMIT;
⑷ ORACLE存儲過程中更新變數值的語句
oracle的pl/sql採用的是類似pascal的語法,所以賦值語句為:=
r_LoseID_Flag 是變數嗎?那應該這樣:
r_LoseID_Flag:='N';
⑸ oracle 存儲過程插入或更新數據
create or replace trigger ggxx_s_update
BEFORE update on up_org_station
for each row
declare
-- local variables here
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
update up_org_station_tmp
SET 欄位1= :NEW.欄位1,
--********
-- 剩下的欄位你自己寫 up_org_station_tmp 表結構與up_org_station一致
WHERE up_org_station_tmp.id = :OLD.id
COMMIT;
GGXX; --存儲過程中 up_org_station 改為 up_org_station_tmp
COMMIT;
end ggxx_s_update;
⑹ Oracle批量更新在存儲過程中執行很慢,但單獨執行很快
檢查被更新欄位和條件欄位是否添加索引
重建索引
檢查資料庫臨時表空間是否已滿,已滿手動清空(新建臨時表空間,然後重新綁定,然後刪除原臨時表空間)
⑺ oracle 包中的存儲過程 能否實現 單個的更新或者添加
這不可能,更新編譯package時,需要在這整個包上申請鎖,如果是正在運行的package,你可能申請不到這個鎖。如果這是一個被頻繁調用的package,可能你就完不成這個任務。為了保證一致性,oracle不允許你這么做
⑻ Oracle存儲過程的更新插入問題。
--向TESTSQL插入TESTSQL不存在的數據
INSERTINTOTESTSQL
(ID,NAME)
SELECTID,NAME
FROMTEST@SQLLINKAA
WHERENOTEXISTS(SELECTIDFROMTESTSQLBBWHEREBB.ID=AA.ID);
--修改TESTSQL
UPDATETESTSQLAA
SETAA.NAME=
([email protected]=AA.ID);
我覺得有點沒必要寫存儲過程,上面兩條sql完全可以實現你的需求,如果非要寫成存儲過程,按照上面兩條sql改寫就可以了
⑼ oracle存儲過程更新一段時間的數據,給定一個時間,更新這個時間之後的一段時間的表中一些欄位的數據
CREATE OR REPLACE PROCEDURE test_xh(vi_date IN VARCHAR2,vi_rc IN NUMBER)
IS
v_date VARCHAR2(8);
e_date VARCHAR2(8);
b_date VARCHAR2(8);
BEGIN
v_date := vi_date;
b_date := substr(v_date,1,6)||'01';
e_date := '20130210';
--更新指定日期的日產量
UPDATE test_1 a SET a.rc = vi_rc WHERE a.reportdate = v_date;
COMMIT;
--循環開始,判斷當前日期大於截止日期時跳出,小於時更新月累計
LOOP
IF v_date>e_date THEN
EXIT;
END IF;
UPDATE test_1 a SET a.ycl=(
SELECT SUM(b.rc) from test_1 b WHERE b.reportdate>=b_date AND b.reportdate<=v_date )
WHERE a.reportdate = v_date;
COMMIT;
v_date:=to_char(to_date(v_date,'YYYYMMDD')+1,'YYYYMMDD') ;
END LOOP;
END;
⑽ oracle利用存儲過程更新數據,怎麼優化
大數據量表盡量要避免全表掃描,全部掃描會按順序每條記錄掃描,對於>100萬數據表影響很大。
Oracle中通過RowID訪問數據是最快的方式
對欄位進行函數轉換,或者前模糊查詢都會導致無法應用索引而進行全表掃描
對Oracle共享池和緩沖區中的Sql必須要大小寫都完全用上才能夠匹配上!