INSERT INTO id_tbl VALUES(1,r_type,sysdate); ^^^^^^ r_type没有定义。
有以下不太理解,搂主是否能告知: insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); if sqlcode<>0 then rollback to b; else commit; end if; 我觉得如果insert出错程序会直接跳出的吧,rollback to b应该是走不到的。 不过没试过,我也不太清楚。
我的意思是如果insert失败的话,全部rollback!这样不能回滚吗??
我通常是这么写的: insert ... except when other then rollback; ...
为什么不用异常处理 exception when others then rollback; end;
现在我稍微盖了一下,你看看我应该在哪些方面作一些改进?? create or replace procedure recp_pro( r_type varchar2, recp_name varchar2, location varchar2, recp_print number, recp_worker varchar2, memo varchar2) as recp_id varchar2(10); newid number;function func_lock return boolean is res boolean;BEGIN res:=true;savepoint a; update id_tbl set id=id+1 where to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd'); dbms_output.put_line(to_char(sqlcode)||'first'); dbms_output.put_line(sqlerrm); if sqlcode=0 then if sql%rowcount=0 then INSERT INTO id_tbl VALUES(1,r_type,sysdate); dbms_output.put_line(to_char(sqlcode)||'second'); dbms_output.put_line(sqlerrm); IF SQLCode <> 0 THEN ROLLBACK to a; res:=false; else newid:=1; END IF; ELSE SELECT id INTO newid FROM id_tbl WHERE to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd'); dbms_output.put_line(to_char(newid)); res:=true; dbms_output.put_line(to_char(sqlcode)||'third'); dbms_output.put_line(sqlerrm); END IF; ELSE ROLLBACK to a; res:=false; END IF; return res; end func_lock;beginsavepoint b;if func_lock then dbms_output.put_line('success'); recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000'); insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); if sqlcode<>0 then rollback to b; else commit; end if; else dbms_output.put_line('faise'); rollback to b; end if; end recp_pro; //////////////////// declare r_type varchar2(10); recp_name varchar2(20); location varchar2(40); recp_print number(1); recp_worker varchar2(20); memo varchar2(40); begin r_type:='A'; recp_name:='li'; location:='西湖'; recp_print:=0; recp_worker:='liha'; memo:='空白'; recp_pro(r_type,recp_name,location,recp_print,recp_worker,memo); end;
一、函数和过程分开,结构独立。 二、在函数中一般不要执行修改数据库的操作,不是太好,否则,改用过程。 三、注意语句的缩进,使结构化明显。 四、单独的pl/sql块有单独的异常处理模块,靠sqlcode=0是不行的,如果发生异常,你的过程已经挂起了。象你的这种简单结构,根本上用不到rollback to checkpoint。
哦,谢谢还有个问题: beginsavepoint b;if func_lock then dbms_output.put_line('success'); recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000'); insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); if sqlcode<>0 then rollback to b; else commit; end if; else dbms_output.put_line('faise'); rollback to b; end if; end recp_pro; 请看上面的代码,我不知道如果操作不成功,rollback to b能不能回滚到b,还有如果我不用savepoint,如果insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);执行不成功,用rollback的话回滚到哪里为止??能回滚到b这里吗?因为我还有func_lock函数
begin recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000'); --这里oracle开启一个事务(第一个dml语句) insert into recpt_tbl values (recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); --如果没有错误,则提交,插入成功 commit; exception when others then --如果发生错误,回滚所有操作,即开启事务处,插入失败 rollback; end;
重新再问: 斑竹我指的是着段代码: begin savepoint b; if func_lock then dbms_output.put_line('success'); recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000'); insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); if sqlcode<>0 then rollback to b; 到这为止没有commit阿??我的目的是产生A021218001这样的id号,func_lock函数是一个锁定id_tbl序号表的行纪录,返回一个序号表的最大值,我不知道会不会出现func_lock=true(锁定成功,得到一个最大序号),但是insert另外一张表的时候不成功,碰到这样的情况,我想把所有的事务操作rollback?改怎么做啊,谢谢
一样啊,在异常中做。 begin savepoint b; if func_lock then dbms_output.put_line('success'); recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000'); insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo); exception when others then rollback to b; end;
^^^^^^
r_type没有定义。
insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
if sqlcode<>0 then
rollback to b;
else
commit;
end if;
我觉得如果insert出错程序会直接跳出的吧,rollback to b应该是走不到的。
不过没试过,我也不太清楚。
insert ...
except
when other then
rollback;
...
exception
when others then
rollback;
end;
-------------------------------------------
还有,你在oracle区发的8个帖子,如果已经解决的话,希望你能揭贴。
才揭贴1个,其它的还有什么问题吗?
create or replace procedure recp_pro(
r_type varchar2,
recp_name varchar2,
location varchar2,
recp_print number,
recp_worker varchar2,
memo varchar2)
as
recp_id varchar2(10);
newid number;function func_lock
return boolean is
res boolean;BEGIN
res:=true;savepoint a;
update id_tbl set id=id+1
where to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd');
dbms_output.put_line(to_char(sqlcode)||'first');
dbms_output.put_line(sqlerrm);
if sqlcode=0 then
if sql%rowcount=0 then
INSERT INTO id_tbl VALUES(1,r_type,sysdate);
dbms_output.put_line(to_char(sqlcode)||'second');
dbms_output.put_line(sqlerrm);
IF SQLCode <> 0 THEN
ROLLBACK to a;
res:=false;
else
newid:=1;
END IF;
ELSE
SELECT id INTO newid FROM id_tbl WHERE to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd');
dbms_output.put_line(to_char(newid));
res:=true;
dbms_output.put_line(to_char(sqlcode)||'third');
dbms_output.put_line(sqlerrm);
END IF;
ELSE
ROLLBACK to a;
res:=false;
END IF;
return res;
end func_lock;beginsavepoint b;if func_lock then
dbms_output.put_line('success');
recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
if sqlcode<>0 then
rollback to b;
else
commit;
end if;
else
dbms_output.put_line('faise');
rollback to b;
end if;
end recp_pro;
////////////////////
declare
r_type varchar2(10);
recp_name varchar2(20);
location varchar2(40);
recp_print number(1);
recp_worker varchar2(20);
memo varchar2(40);
begin
r_type:='A';
recp_name:='li';
location:='西湖';
recp_print:=0;
recp_worker:='liha';
memo:='空白';
recp_pro(r_type,recp_name,location,recp_print,recp_worker,memo);
end;
二、在函数中一般不要执行修改数据库的操作,不是太好,否则,改用过程。
三、注意语句的缩进,使结构化明显。
四、单独的pl/sql块有单独的异常处理模块,靠sqlcode=0是不行的,如果发生异常,你的过程已经挂起了。象你的这种简单结构,根本上用不到rollback to checkpoint。
beginsavepoint b;if func_lock then
dbms_output.put_line('success');
recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
if sqlcode<>0 then
rollback to b;
else
commit;
end if;
else
dbms_output.put_line('faise');
rollback to b;
end if;
end recp_pro;
请看上面的代码,我不知道如果操作不成功,rollback to b能不能回滚到b,还有如果我不用savepoint,如果insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);执行不成功,用rollback的话回滚到哪里为止??能回滚到b这里吗?因为我还有func_lock函数
recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
--这里oracle开启一个事务(第一个dml语句)
insert into recpt_tbl
values (recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
--如果没有错误,则提交,插入成功
commit;
exception
when others then
--如果发生错误,回滚所有操作,即开启事务处,插入失败
rollback;
end;
斑竹我指的是着段代码:
begin
savepoint b;
if func_lock then
dbms_output.put_line('success');
recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
if sqlcode<>0 then
rollback to b;
到这为止没有commit阿??我的目的是产生A021218001这样的id号,func_lock函数是一个锁定id_tbl序号表的行纪录,返回一个序号表的最大值,我不知道会不会出现func_lock=true(锁定成功,得到一个最大序号),但是insert另外一张表的时候不成功,碰到这样的情况,我想把所有的事务操作rollback?改怎么做啊,谢谢
begin
savepoint b;
if func_lock then
dbms_output.put_line('success');
recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
exception
when others then
rollback to b;
end;