Oracle 简单函数没有像我预期的那样工作
我有一个非常简单的函数,我只想根据传递的参数更新Oracle 简单函数没有像我预期的那样工作,oracle,plsql,oracle11g,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
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。为什么?当其他人执行异常处理程序时,您正在用自己的
隐藏实际错误;您所做的只是隐藏有用的信息,让调用方认为一切正常,除非他们碰巧知道检查(以及如何解释)返回值。最好不要在这里处理意外异常,让调用方在看到异常时决定要做什么。(最好不要在过程/函数中提交或回滚,因为它会破坏调用方的事务,但这是一个单独的问题)
如果删除该异常处理程序,您将看到它显示:
ORA-14551: cannot perform a DML operation inside a query
该错误的描述如下:
*原因:DML操作,如插入、更新、删除或选择更新
无法在查询内部或PDML从机下执行。
*措施:确保未执行有问题的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
帮助中心有@Sohel-