PL/SQL 패키지가 잘못됨
패키지(PKG_MY_PACKage)를 사용하는 스크립트가 있습니다.해당 패키지의 쿼리에 있는 필드 중 일부를 변경한 후 다시 컴파일합니다(다른 패키지는 변경하거나 컴파일하지 않음).스크립트를 실행하면 다음과 같은 오류가 표시됩니다.
ORA-04068: 기존 패키지 상태가 삭제되었습니다.ORA-04061: 패키지 본문 "USER3.PKG_MY_PACKAGE"의 기존 상태가 무효화되었습니다.ORA-04065: 패키지 본문 "USER3.PKG_MY_PACKAGE"가 실행되지 않거나 변경되거나 삭제되지 않았습니다.ORA-06508: PL/SQL: 호출 중인 프로그램 단위 "USER3.PKG_MY_PACKage"를 찾을 수 없습니다.ORA-06512: 34번 선에서
시스템에서 다른 것을 변경하지 않고 스크립트를 다시 실행하면 스크립트가 성공적으로 실행됩니다.
스크립트를 실행하기 전에 컴파일할 때 잘못된 참조를 수정할 수 있을 것이라고 생각했습니다.이것은 100% 재현 가능하며, 이 스크립트를 사용하면 할수록 짜증이 납니다.무엇이 이것을 유발할 수 있고 무엇이 그것을 고칠 수 있습니까?
(PL/SQL Developer 7을 사용하는 Oracle 10g)
배경
existing state of packages has been discarded패키지(또는 Body)에 재컴파일로 인해 손실된 상태가 있음을 의미합니다.
패키지에 저장된 전역 변수로 인해 발생합니다.
11.2.0.2까지는 상수가 이러한 동작을 유발하기도 했습니다(문서 참조).
패키지가 세션에서 이미 사용되었기 때문에 Oracle은 이 상태가 사용자에게 적합하다고 가정합니다.일부 변수가 변경되었을 수 있으며 다시 컴파일하면 값이 재설정됩니다.
이 예외는 클라이언트가 이러한 변수에 더 이상 의존할 수 없음을 알 수 있도록 하기 위해 적용됩니다.
솔루션
솔루션(소스 변경)
- 가능한 경우 모든 전역 변수(및 11gR2 이전의 상수) 제거
- 본문의 재컴파일 이상이 작동하도록 패키지 헤더로 이동합니다.
- 를 전변수바로 바꿉니다.
DETERMINISTIC함수(이 답변에서 제안한 대로) - 로 패키지를 정의하면 Oracle은 서버를 호출할 때마다 글로벌 변수를 다시 초기화합니다.
스크립트에서 무언가를 실행하는 경우 다시 컴파일된 코드를 실행하기 전에 해당 명령을 실행해 보십시오.
exec DBMS_SESSION.RESET_PACKAGE
exec DBMS_SESSION.MODIFY_PACKAGE_STATE( DBMS_SESSION.REINITIALIZE )
그들은 이름이 암시하는 것을 합니다.
발생할 수 있는 문제는 다음과 같습니다.
- 호출 중인 패키지/프로시저가 잘못되었습니다(단, 별도로 호출할 경우 작동할 수 있음). 이 all_objects 보기에서 패키지의 항목이 있는지 또는 패키지에 사용된 개체가 있는지 이 쿼리를 확인하십시오.
select * from all_objects where status = 'INVALID' and owner = 'SCHEMA_NAME';
패키지에 전역 변수가 있는지 확인하시겠습니까?만약 그렇다면, 해당 변수가 다른 세션에서 변경되지 않는지 확인하십시오. 가급적이면 해당 글로벌 변수/사용 함수를 제거하십시오.
아래 스크립트를 실행하여 스키마의 모든 개체를 컴파일합니다.
begin
dbms_utility.compile_schema('SCHEMA_NAME', false);
end;
- 마지막 옵션은 위의 모든 절차/기능이 작동하지 않으면 패키지에서 모든 절차/기능을 제거하고 새 기능을 추가한 후 트리거에서 기능을 실행해 보십시오.이것이 작동하는지 확인하면 당신의 패키지는 특수 잠금 상태입니다.새로운 함수/프로시저를 추가하면 상태가 다시 유효하게 되고 실제 함수/프로시저를 모두 추가하고 새로 추가된 함수/프로시저를 제거할 수 있습니다.
위 오류: ORA-06508: PL/SQL: 호출 중인 프로그램 단위를 찾을 수 없습니다.
찾을 수 없는 저장된 프로그램을 호출하려고 할 때 발생합니다.프로그램이 삭제되었거나 호환되지 않게 수정되었거나 오류와 함께 컴파일되었을 수 있습니다.
패키지 본문을 포함하여 참조되는 모든 프로그램이 존재하고 호환되는지 확인합니다.
이 쿼리를 실행하여 잘못된 개체를 찾을 수 있으며, 이로 인해 ORA-06508 오류가 발생할 수 있습니다.
dba_message에서 comp_id, comp_name, 버전, 상태, 네임스페이스, 스키마를 선택합니다.
언급URL : https://stackoverflow.com/questions/2502722/pl-sql-package-invalidated
'programing' 카테고리의 다른 글
| 컬렉션 항목의 값을 변경하는 방법 (0) | 2023.06.14 |
|---|---|
| Python xlwt 결함 있는 엑셀 북 만들기 (0) | 2023.06.14 |
| iOS 6에서 자동 레이아웃을 활성화하는 동시에 iOS 5와 역호환 가능 (0) | 2023.06.09 |
| 문이 Rewrite* 규칙을 위반함 (0) | 2023.06.09 |
| CSV 파일을 에서 강력하게 입력된 데이터 구조로 가져옵니다.그물 (0) | 2023.06.09 |