如何修复函数编译错误?

时间:2015-06-18 05:48:53

标签: oracle function plsql sql-update

- 这是我的功能

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.

2 个答案:

答案 0 :(得分:0)

  1. 首先想到你正在选择%将其转换为金额然后添加它。
  2. 检查函数中的select查询是否每次返回单行。您可以使用max,min或rownum来限制多行。
  3. 检查数据库中是否存在基础表。
  4. 检查%的数据类型仅为数字。 功能代码看起来不错。

答案 1 :(得分:0)

我会尽量不使用任何功能。使用直接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);

我在这里使用了一个子选择(我之前从未这样做过,但它在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 ...

或合并声明。