日期:2014-05-17  浏览次数:21037 次

关于case分支中使用COMMIT出现的问题

declare
v_job varchar2(30);
v_empno number(4) := &empno;
begin
select job into v_job from scott.emp where empno = v_empno;
case v_job
when 'CLERK'
then
update scott.emp set sal = sal * (1 + 0.15) where empno = v_empno;
Dbms_output.put_line('为普通员工加薪15%');
when 'ANALYST'
then
update scott.emp set sal = sal * (1 + 0.18) where empno = v_empno;
Dbms_output.put_line('为分析员工加薪18%');
when 'MANAGER'
then
update scott.emp set sal = sal * (1 + 0.20) where empno = v_empno;
Dbms_output.put_line('为管理员工加薪20%');
when 'SALESMAN'
then
update scott.emp set sal = sal * (1 + 0.22) where empno = v_empno;
Dbms_output.put_line('为销售员工加薪22%');
else
Dbms_output.put_line('员工职位不在加薪行列');
end case;
COMMIT;
end;


上面中程序运行之后,报如下错误:
ORA-04092: COMMIT 不能在触发器中

请问下,我如何才能将数据库中的数据更新呢?

数据库 SQL

------解决方案--------------------
整体上看没什么问题吧。。。。
------解决方案--------------------
你的代码是放在触发器中的?
触发器中不能出现ROLLBACK和COMMIT
提交或回滚是有触发语句来决定的
------解决方案--------------------
引用:
你的代码是放在触发器中的?
触发器中不能出现ROLLBACK和COMMIT
提交或回滚是有触发语句来决定的

说的好,支持
------解决方案--------------------
触发器的事物是单独的,它依托于触发语句。触发器内部调用的SQL或者PLSQL中不能包含commit、rollback等事物控制语句。
------解决方案--------------------
引用:
Quote: 引用:

你的代码是放在触发器中的?
触发器中不能出现ROLLBACK和COMMIT
提交或回滚是有触发语句来决定的

谢谢你的回复啦,我没有放在触发器中啊,我是直接放在PL/SQL Developer开发环境中运行的这段代码,出现 不能在触发器 中的错误,难道用case之后就默认是个触发器了吗?

SQL> begin
  2  case when 1=&1 then
  3  dbms_output.put_line('1=1');
  4  update test set id=2;
  5  else
  6  update test set id=3;
  7  dbms_output.put_line('else');
  8  end case;
  9  commit;
 10  end;
 11  /
输入 1 的值:  1
原值    2: case when 1=&1 then
新值    2: case when 1=1 then
1=1

PL/SQL 过程已成功完成。
------解决方案--------------------
引用: