Oracle 10G: ORA-06575: функция в недопустимом состоянии - PullRequest
15 голосов
/ 06 марта 2011

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

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;
/

, когда я использовал эту налоговую функцию в stmt для вставки, например

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.

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

Ответы [ 4 ]

13 голосов
/ 01 июня 2014

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

Select * from user_errors where name='Your function name'
9 голосов
/ 06 марта 2011

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

alter function tax compile;

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

SHOW ERRORS

Существует две основные причины, по которым объект в Oracle является недействительным:

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

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

3 голосов
/ 04 апреля 2016

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

SQL> show error function Your_Function_Name;
2 голосов
/ 06 марта 2011

Убедитесь, что ваша функция скомпилирована без ошибок. Это то, что 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 в параметре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...