当前位置:首页 » 存储配置 » 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 存储过程中出现异常的处理

异常是执行这个存储过程出的异常吧,那就是说只有执行一次这个存储过程才会抛一次异常么?如果这样我建议你可以再写个存储过程来调用你这个存储过程,这样来记录异常的次数。然后再进行处理!

热点内容
pythonif比较 发布:2025-02-02 05:24:03 浏览:259
已连接的无线网如何知道密码 发布:2025-02-02 04:53:51 浏览:634
android编程入门经典pdf 发布:2025-02-02 04:46:19 浏览:57
安卓什么软件测试手机电池 发布:2025-02-02 04:28:52 浏览:996
手机上传快 发布:2025-02-02 04:27:46 浏览:308
电脑配置详解图解都有哪些 发布:2025-02-02 04:26:27 浏览:716
景区应该有什么配置 发布:2025-02-02 04:09:08 浏览:120
c语言与java工作 发布:2025-02-02 03:59:57 浏览:283
qq买什么不要支付密码 发布:2025-02-02 03:50:29 浏览:495
android读取视频 发布:2025-02-02 03:46:57 浏览:826