如何修复函数编译错误?
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.
- 首先认为你是 selecting % 将其转换为数量然后添加它。
- 检查您的 select 函数查询是否每次 returns 单行。您可以使用 max、min 或 rownum 来限制多行。
- 检查基础 table 是否存在于数据库中。
- 检查 % 的数据类型是否仅为数字。
其他功能代码看起来不错。
我会尽量不使用函数。使用直接 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 ...
或者合并语句。
--这是我的函数
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.
- 首先认为你是 selecting % 将其转换为数量然后添加它。
- 检查您的 select 函数查询是否每次 returns 单行。您可以使用 max、min 或 rownum 来限制多行。
- 检查基础 table 是否存在于数据库中。
- 检查 % 的数据类型是否仅为数字。 其他功能代码看起来不错。
我会尽量不使用函数。使用直接 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 ...
或者合并语句。