Oracle 10G: ORA-06575: функция в недействительном состоянии

Я создал такую ​​функцию

CREATE OR REPLACE FUNCTION tax 
(p_sal IN  NUMBER(4)) 
RETURN NUMBER 
AS
v_tax NUMBER(4);
BEGIN 
v_tax:= CASE        
WHEN p_sal> 4000 THEN
p_sal*0.33       
WHEN p_sal >2500 THEN 
p_sal*0.25      
WHEN p_sal >1500 THEN 
p_sal*0.20     
ELSE 0         
END; 
RETURN v_tax;
END;
/

когда я использовал эту налоговую функцию в insert stmt like

INSERT INTO employees(eno, ename, job, join_date, sal, comm)
VALUES (7784,'allen','salesman',sysdate, 5000, tax(5000));

он показывает ошибку, например

ERROR: ORA-O6575: package or function tax is in invalid state.

Может ли кто-нибудь предложить мне, как сделать эту функцию в правильном состоянии? спасибо заранее.

Ответ 1

Проверьте ошибки с помощью этой команды:

Select * from user_errors where name='Your function name'

Ответ 2

Функция компилируется следующим образом:

alter function tax compile;

Затем проверьте ошибки компиляции с помощью:

SHOW ERRORS

Есть две основные причины, когда объект в Oracle недействителен:

  • Недопустимый код (и сообщение об ошибке при попытке скомпилируйте его). Решение имеет чтобы исправить ошибку, а затем перекомпилируйте его.
  • Объект ссылается на другой объект, а другой объект изменилось. Решение заключается в перекомпилируйте недопустимый объект.

Кроме того, некоторые драйверы подключения к базе данных содержат ссылки на объекты в базе данных. Если состояние этого объекта изменяется в базе данных, ссылки остаются устаревшими, и вы получите ошибку, аналогичную приведенной выше.

Ответ 3

Вы можете проверить ошибки с помощью команды SHOW ERROR

SQL> show error function Your_Function_Name;

Ответ 4

Убедитесь, что ваша функция скомпилирована без ошибок. Это то, что Oracle говорит вам с ERROR: ORA-06575.

Создайте свою функцию с помощью этого оператора:

CREATE OR REPLACE FUNCTION tax (p_sal IN NUMBER)
   RETURN NUMBER AS 
   v_tax NUMBER(4); 
BEGIN
   v_tax:= CASE
    WHEN p_sal> 4000 THEN p_sal*0.33
    WHEN p_sal >2500 THEN p_sal*0.25
    WHEN p_sal >1500 THEN p_sal*0.20
    ELSE 0
   END;
   RETURN v_tax;   
END;

Вам не нужно (4) в списке параметров при объявлении параметра NUMBER.