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

解决方案 »

  1.   

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

  2.   

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

  3.   

    触发器的事物是单独的,它依托于触发语句。触发器内部调用的SQL或者PLSQL中不能包含commit、rollback等事物控制语句。
      

  4.   

    谢谢你的回复啦,我没有放在触发器中啊,我是直接放在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=1PL/SQL 过程已成功完成。
      

  5.   

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

  6.   

    在前面加上 PRAGMA AUTONOMOUS_TRANSACTION;试试
      

  7.   


    除了 pragma autonomous_transaction;
      

  8.   

    我在11g执行的是没有问题,不知道LZ什么情况。
      

  9.   

    我也是11g,用的是PL/SQL Developer,不过差不多知道是怎么回事啦~还是很谢谢大家了