Oracle資料庫游標在儲存過程中的使用

2021-09-06 01:29:06 字數 4106 閱讀 1636

作為關係型資料庫市場的老大,oracla占有舉足輕重的地位。雖然在操作上不如sqlserver那樣方便,但是他的強大的功能

還是吸引來大批大批的追隨著。本人作為oracle菜鳥,在工作當中也偶爾使用oracle。以下記錄的上由於工作需要寫的oracle的

使用游標的儲存過程,個人覺得比較有代表性。希望給初學者一定的幫助,也給自己加深一下印象。

在oracle中,他以乙個語句塊為乙個預設的事務。也就是說,如果你就單單只執行一段oracle的語句塊,他預設是以事務的形式執行的。

create or replace procedure sp_editinlayout(

fid number, --修改記錄的id t_inlayout表的主鍵

inlayboxids varchar2, --修改的記錄

boxcount number, --裝箱數量

storeuserid varchar2, --庫管編號

confirmstate char, --確認狀態

existstate char, --存在狀態

strerr out varchar2 --儲存過程執行結果。成功返回空,失敗返回錯誤原因)as

--定義變數

v_now date;

v_now2 date;

v_logid number;

v_chipid number;

v_sql varchar2(2000);

begin

--記錄日誌

,f_existstate, f_modifyid, f_modifytime, f_modifyuserid )

,fid,sysdate,storeuserid from t_inlayout where f_id=fid));

--取剛插入記錄的id

select seq_t_inlayout_log.currval into v_logid from dual;

--定義游標

declare cursor mycusor is select f_id from t_chip where f_inlayboxid in (select f_id from

t_inlaybox where f_inlayoutid = fid);

--開始使用游標取資料

begin

open mycusor;

loop

fetch mycusor into v_chipid;

--游標取不到資料則退出

exit when mycusor%notfound;

select min(f_currenttime) into v_now from t_chipstatehistory where

(f_historystate = 'confirm_inlayin') and f_chipid = v_chipid;

--改變晶元表的狀態

updatet_chip set f_state = 'confirm_inlayin',f_comparetime = v_now where f_id = v_chipid;

--儲存晶元狀態歷史記錄

insert into t_chipstatehistory(f_chipid, f_historystate,f_tableid,f_currenttime,f_tablename)

values

(v_chipid,'confirm_inlayin',v_logid,sysdate,'t_inlayout_log');

end loop;

close mycusor;

end;

--選擇最近晶元狀態變更時間

--select min(f_currenttime) into v_now from t_chipstatehistory where f_historystate = 20

and f_chipid in (select f_id from t_chip where f_inlayboxid=(select f_id from t_inlaybox

where f_inlayoutid=fid));

--將晶元表中晶元狀態更新到以前狀態

--update t_chip set f_state=20,f_comparetime=v_now where f_inlayboxid in (select f_id from

t_inlaybox where f_inlayoutid =fid);

--記錄晶元狀態變更日誌

--insert into t_chipstatehistory (f_chipid,f_historystate,f_tableid,f_currenttime,f_tablename)values

--((select f_id from t_chip where f_inlayboxid=(select f_id from t_inlaybox where f_inlayoutid=fid)),

20,v_logid,sysdate,'t_inlayout_log');

--將inlay出庫箱表中以前的資料更新到以前狀態

update t_inlaybox set f_state=2,f_inlayoutid=null where f_inlayoutid =fid;

--編輯時將新的inlay出庫資訊更新

f_storeuserid=storeuserid,f_confirmstate=confirmstate,f_existstate=existstate,f_confirmtime=null

where f_id=fid;

--更新t_inlaybox 新的狀態

--update t_inlaybox set f_state=3,f_inlayoutid=fid where f_id in (inlayboxids);

v_sql := 'update t_inlaybox set f_state=3,f_inlayoutid='||fid||' where f_id in ('||inlayboxids||')';

--立即執行v_sql

execute immediate v_sql;

select sysdate into v_now2 from dual;

--更新晶元表狀態

update t_chip set f_state='no_confirm_inlayout',f_comparetime=v_now2 where f_inlayboxid in

(select f_id from t_inlaybox where f_inlayoutid=fid);

--記錄當前操作日誌

insert into t_chipstatehistory (f_chipid,f_historystate,f_tableid,f_currenttime,f_tablename)

select f_id,'no_confirm_inlayout',v_logid,v_now2,'t_inlayout_log' from t_chip where f_inlayboxid in

(select f_id from t_inlaybox where f_inlayoutid=fid);

--提交

commit;

--發生異常時返回錯誤碼

exception

when others then

strerr := substr(sqlerrm,1,100);

rollback;

end sp_editinlayout;

但是在sqlserver中,除非你將所有的t-sql語句塊以顯示的方式【begin transaction ....end transaction】申明在事務中,否則sqlserver會將語句塊中的每一句作為乙個單獨的預設事務執行。

此外,游標是一種比較佔i/o資源的操作,使用完後應該及時關閉,以釋放系統資源。  

資料庫游標(Oracle)

游標是sql的乙個記憶體工作區,由系統或使用者以變數形式定義。游標的作用是用於臨時儲存從資料庫中提取的資料塊。為什麼要用游標?資料庫的資料是存放在磁碟中的,游標是把資料從磁碟中調到計算機記憶體中進行處理,最後將處理結果顯示出來或者最終寫回資料庫,這樣可以提高資料處理的效率,因為頻繁的磁碟資料交換會降...

Oracle資料庫之游標

一 準備表和資料 1 建立表 create table emp empno varchar2 32 ename varchar2 32 job varchar2 32 sal varchar2 32 2 新增資料 insert into emp empno,ename,job,sal values ...

Oracle資料庫 八 游標

游標 資料的快取區 什麼是游標 游標的使用可以讓使用者想運算元組一樣操作查詢出來的資料集,實際上,它提供了一種從集合性質的結果中提取單挑記錄的手段。游標 cursor 形象地看出乙個變動的游標。它實際上是乙個指標,它在一段oracle存放資料查詢結果集的記憶體中,它可以指向結果集中的任意記錄,初始是...