作為關係型資料庫市場的老大,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存放資料查詢結果集的記憶體中,它可以指向結果集中的任意記錄,初始是...