简单的功能不能像我预期的那样工作

时间:2016-08-03 14:14:22

标签: oracle plsql oracle11g

我的功能非常简单,我只想根据传递的参数更新salary列。我知道我可以通过程序来完成,但是这个代码有什么问题,任何人都可以解释一下。

表格和数据结构:

create table emp_test  (emp_id number,  salary number);
insert into emp_test values (10,750);
insert into emp_test values (11,850);
insert into emp_test values (12,650);
insert into emp_test values (13,950);
insert into emp_test values (14,1750);
insert into emp_test values (15,2750);

功能:

CREATE OR REPLACE FUNCTION
CIS_EXT.UPDATE_EMP_SAL( p_emp_id IN emp_test.emp_id%TYPE )
return NUMBER
IS
BEGIN
  UPDATE EMP_TEST SET SALARY = SALARY+200
  WHERE  EMP_ID = p_emp_id;
  COMMIT;
  RETURN 1;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END UPDATE_EMP_SAL ;

当我如下跑步时

SELECT UPDATE_EMP_SAL(10) FROM DUAL;

我的输出是0.为什么?

1 个答案:

答案 0 :(得分:3)

您正在使用when others异常处理程序隐藏实际错误。 That is almost always a bug;你所做的就是压制有用的信息,并让调用者认为一切正常,除非他们碰巧知道检查(以及如何解释)返回值。最好不要在这里处理意外的异常,让调用者决定在看到它时做什么。 (最好不要在过程/函数内部提交或回滚,因为它可能会破坏调用者的事务,但这是一个单独的问题。)

如果删除该异常处理程序,您会看到它说:

ORA-14551: cannot perform a DML operation inside a query 

该错误的描述是:

  

*原因:DML操作,如插入,更新,删除或选择更新
             无法在查询内或PDML从站下执行   *措施:确保不执行违规的DML操作或
             使用自治事务来执行内部的DML操作              查询或PDML从站。

允许函数执行DML,尽管通常首选只在程序中执行DML。但是如果你的函数确实做了DML,你只能从PL / SQL中调用它:

set serveroutput on
declare
  rc number;
begin
  rc := UPDATE_EMP_SAL(10);
  dbms_output.put_line(rc);
end;
/

PL/SQL procedure successfully completed.

1

select * from emp_test where emp_id = 10;

    EMP_ID     SALARY
---------- ----------
        10        950