oracle存儲過程異常回滾
❶ 如何在ORACLE 存儲過程中設置回滾斷點
學習存儲過程中使用斷點回滾事務時,發現目前網路上存在一個問題,那就是使用斷點回滾後,都忘記了一個很重要的事情,提交事務。雖然使用了斷點回滾,但是斷點回滾不像rollBack或commit一樣結束當前事務,而使用斷點回滾只會回滾到聲明斷點的地方,之前的產生的事務仍需要提交的,如果不提交,事務一直在資料庫中緩存.
Demo:
procere doSomeThing(p_number out number) as
begin
insert into t_test_user_mingming(id,loginname,password,realname,type)
values(se_test_user_mingming_id.nextval,'xiaoming','1234','小明',1);
p_number := 1;
savepoint ps;--- 設置斷點 ps
insert into t_test_info_mingming(id,pal,type,create_time,note)
values(se_test_info_id.nextval,'我想買台thinkPad 可以俺莫有錢',1,sysdate,'ceshi');
p_number := 2;
savepoint sp;----設置斷點 sp
insert into t_test_agent(agent_id) values(1);---我這里此行會拋出異常 ORA-01400 可以替換為下句 手動拋出一個異常
-----RAISE_APPLICATION_ERROR (-20004,'拋出的異常玩玩');
commit;
exception --捕獲異常
when others then
rollback to ps; ---- 如果產生異常,回滾到斷點 ps
p_number :=0;
commit; --- 提交事務
end doSomeThing;
這里本人做了實驗,如果在異常中不加 commit 語句,使用PL/sql測試時,異常在緩存,t_test_user_mingming 表中沒有數據記錄。
存儲過程里的事務操作:
create or replace procere pr_mypro2(p_a in varchar2,p_b in varchar2,p_count out number)
temp varchar2(1000); /*定義臨時變數*/
is
begin
select code into p_count from table1 where a=p_a; /*查詢並返回值*/
temp := p_count; /*將返回值賦給臨時變數*/
savepoint point1; /*保存點*/
insert into table2(a,b)values(temp,p_b); /*將臨時變數值添加到新表的欄位*/
savepoint point2;
insert into
exception
when others then
rollback to savepoint point1; /*異常處理,保存點下面的操作都不會被執行*/
return;
end;
保存點(SAVEPOINT)是事務處理過程中的一個標志,與回滾命令(ROLLBACK)結合使用,主要的用途是允許用戶將某一段處理回滾而不必回滾整個事務。
如果定義了多個savepoint,當指定回滾到某個savepoint時,那麼回滾操作將回滾這個savepoint後面的所有操作(即使後面可能標記了N個savepoint)。
例如,在一段處理中定義了五個savepoint,從第三個savepoint回滾,後面的第四、第五個標記的操作都將被回滾,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,將會滾整個事務處理。
❷ Oracle 存儲過程怎麼拋出異常
你說的異常是什麼意思?如果是,執行中的錯誤,那麼可以用「調試」,不過需要有一個系統許可權的擁護才能調試,許可權好象是什麼debug XXXXX。
如果說的是有時執行因為這樣那樣的數據問題出現的異常,那麼一般都是通過exception來拋出異常的,這樣的拋出的異常,你可以自己編代碼,然後輸入一張表內,這樣就可以捕獲異常了。如果1表示沒有主鍵,2表示數據超長等等。具體的寫法網上很多,這里就不寫了。
❸ oracle創建修改類型存儲過程,若不成功回滾
createorreplaceproceremy_update(vempnoinnumber,vsalinnumber)
as
vintstu.sal%type:=vsal;
my_exceptionexception;
rintstu.sal%type;
begin
updatestusetsal=vintwhereempno=vempno;
=vempno;
ifrint<>0
thenraisemy_exception;
endif;
exception
whenmy_exception
then
rollback;
dbms_output.put_line('表1更新數據失敗!');
end;
//上面有欄位不同,還有表名,你自己修改一下吧。Oracle資料庫的
❹ oracle 存儲過程更改了怎麼回滾
create or replace procere my_update(vempno in number,vsal in number)as vint stu.sal%type:=vsal; my_exception exception; rint stu.sal%type;begin update stu set sal = vint where empno = vempno; select sal into rint from stu where empno = vempno; if rint<>0 then raise my_exception; end if; exception when my_exception then rollback;
❺ Oracle 存儲過程的異常請教
大體思路沒問題,只是裡面沒有commit,還有就是具體的邏輯有冗餘,我修改了下:
CREATE OR REPLACE PROCEDURE AddOperator
(
p_en IN INTEGER,
p_firstname IN NVARCHAR2 DEFAULT NULL,
p_lastname IN NVARCHAR2 DEFAULT NULL,
p_active IN INTEGER DEFAULT 1,
p_id OUT INTEGER
)
AS
topid INTEGER;
newid INTEGER;
BEGIN
SELECT nvl(sum(OPERATORID),0) INTO topid FROM OPERATOR WHERE FIRSTNAME = p_firstname AND EN=p_en;
IF topid=0 THEN
--GET NEXT OPERATORID
SELECT OPERATOR_seq.nextval INTO newid FROM al;
--INSERT OPERATOR
INSERT INTO OPERATOR (OPERATORID,EN,FIRSTNAME,LASTNAME, ACTIVE) VALUES (newid,p_en, p_firstname,p_lastname,
p_active);
COMMIT;
RETURNING newid INTO p_id;
ELSE
p_id:=topid;
END IF;
END AddOperator;
❻ oracle存儲過程出現異常後可以繼續執行嗎
這個要看異常捕捉處理程序放在哪,從出現異常到異常處理之間的程序應該是不執行的
❼ 急急:我要實現在oracle存儲過程中,如果前面的DML執行成功,就提交,如果前面的有異常就全部回滾。
begin
sql語句;
exceptions when others then
rollback;
end;
就這樣可以了,執行成功的會提交的
❽ oracle 存儲過程發生異常錯誤執行的exception有日誌記錄么
一般我們會創建一張表用於記錄所有異常信息,再寫一個過程來處理(截取部分信息)並存儲異常信息(包括發生異常的過程、觸發器名稱、異常信息、發生時間等),然後在整個資料庫開發中,所有異常處理中調用該過程。這樣可以隨時查看那裡出了問題。
❾ oracle 存儲過程異常處理
先建一個錯誤跟蹤表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在過程的例外里向跟蹤表寫入錯誤信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--記錄錯誤信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,『day_task』);
end;
❿ oracle 存儲過程中出現異常的處理
異常是執行這個存儲過程出的異常吧,那就是說只有執行一次這個存儲過程才會拋一次異常么?如果這樣我建議你可以再寫個存儲過程來調用你這個存儲過程,這樣來記錄異常的次數。然後再進行處理!