- 这是我的功能
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.
答案 0 :(得分:0)
答案 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 ...
或合并声明。