Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 简单函数没有像我预期的那样工作_Oracle_Plsql_Oracle11g - Fatal编程技术网

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-