我的功能非常简单,我只想根据传递的参数更新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.为什么?
答案 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