如何修复函数编译错误?

How do I fix function compilation error?

--这是我的函数

create or replace 
function sal_incr
(
p_grade number)
return number
is
v_inc number;
begin
select raise_percent into v_inc 
from sal_inc 
where grade_id in (select grade_id from emp_task where grade_id = p_grade);
return v_inc;
end;

-- 更新语句

update emp_task set sal = sal + sal_incr(grade_id);

-- 错误堆栈

Error starting at line 15 in command:
update emp_task set sal = sal + sal_incr(grade_id)
Error at Command Line:15 Column:32
Error report:
SQL Error: ORA-06575: Package or function SAL_INCR is in an invalid state
06575. 00000 -  "Package or function %s is in an invalid state"
*Cause:    A SQL statement references a PL/SQL function that is in an
           invalid state. Oracle attempted to compile the function, but
           detected errors.
*Action:   Check the SQL statement and the PL/SQL function for syntax
           errors or incorrectly assigned, or missing, privileges for a
           referenced object.
  1. 首先认为你是 selecting % 将其转换为数量然后添加它。
  2. 检查您的 select 函数查询是否每次 returns 单行。您可以使用 max、min 或 rownum 来限制多行。
  3. 检查基础 table 是否存在于数据库中。
  4. 检查 % 的数据类型是否仅为数字。 其他功能代码看起来不错。

我会尽量不使用函数。使用直接 SQL 通常是更好的解决方案。根据您提供的信息,我们有下表。 (您的函数确实可以使用这些表进行编译。)

  CREATE TABLE emp_task
  (emp_id   NUMBER  PRIMARY KEY
  ,grade_id NUMBER
  ,sal NUMBER);

  CREATE TABLE sal_inc
  (grade_id NUMBER PRIMARY KEY
  ,raise_percent NUMBER);

  INSERT INTO emp_task VALUES (1,10,1000);
  INSERT INTO emp_task VALUES (2,20,2000);

  INSERT INTO sal_inc VALUES (10, 0.1);
  INSERT INTO sal_inc VALUES (20, 0.2);

我在这里使用了 sub-select(我以前从未这样做过,但它适用于 11g)。

  UPDATE emp_task t1 
  SET sal = sal + sal*
    (SELECT raise_percent 
     FROM sal_inc t2 
     WHERE t2.grade_id = t1.grade_id);

  SELECT *
  FROM   emp_task;

    EMP_ID   GRADE_ID        SAL
---------- ---------- ----------
         1         10       1100 
         2         20       2400 

您还可以查看更新视图

UPDATE (SELECT ... FROM t1 JOIN t2 ON ...

或者合并语句。