當前位置:首頁 » 存儲配置 » oracle存儲過程異常回滾

oracle存儲過程異常回滾

發布時間: 2022-03-05 23:31:00

❶ 如何在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 存儲過程中出現異常的處理

異常是執行這個存儲過程出的異常吧,那就是說只有執行一次這個存儲過程才會拋一次異常么?如果這樣我建議你可以再寫個存儲過程來調用你這個存儲過程,這樣來記錄異常的次數。然後再進行處理!

熱點內容
怎樣編程選股 發布:2025-02-02 08:22:02 瀏覽:415
電腦web應用伺服器 發布:2025-02-02 08:05:31 瀏覽:811
電腦存儲內存多少合適 發布:2025-02-02 08:00:15 瀏覽:110
登錄界面android 發布:2025-02-02 07:53:23 瀏覽:841
編譯時註解與運行時註解 發布:2025-02-02 07:53:14 瀏覽:818
怎樣登陸ftp 發布:2025-02-02 07:44:44 瀏覽:637
瘋狂點擊腳本 發布:2025-02-02 07:38:10 瀏覽:73
pss演算法 發布:2025-02-02 07:30:55 瀏覽:748
發信息腳本 發布:2025-02-02 07:03:07 瀏覽:741
l2l3緩存 發布:2025-02-02 06:56:47 瀏覽:524