2012-03-17 1 views
1

ODP.Net 메서드는 호출 될 때마다 테이블을 다시 생성하는 패키지 된 저장 프로 시저를 호출합니다. 모든 이후에 는 오류에게 내가이 circumevent 수있는 방법모든 후속 호출에서 Oracle 패키지 무효화

ORA-04061: existing state of package body "SAAP.PRICEWORX" has been invalidated 
ORA-06508: PL/SQL: could not find program unit being called: "SAAP.PRICEWORX" 

를 던졌습니다 전화를?

+0

http://ora-04061.ora-code.com/에서 두 번 전화하면 두 번째로 작동합니다. –

답변

4

내 즉시 추측 할 것은 패키지가 작성중인 테이블을 삭제하거나 참조한다는 것입니다. 따라서 패키지가 존재하지 않는 테이블을 참조하려고하는 경우가 있습니다.

이벤트의 순서는 다음과 같이 갈 수

  1. 표 다시 테이블을 사용하는
  2. 를 사용하여 테이블을
  3. 드롭 테이블
  4. 보십시오 존재 - 패키지는 테이블이 더 이상 존재 유효하지 않습니다.
  5. 표 만들기 - 모든 것이 좋습니다.

간단한 대답은 코드에서 테이블을 만들거나 삭제하는 것이 아닙니다. 대신 global temporary table을 만드십시오. 이렇게하면 테이블이 항상있을 수 있습니다.

더 나쁜 옵션은 execute immediate에 존재할 수도 있고 존재하지 않을 수도있는 해당 테이블을 사용하는 모든 단일 호출을 래핑하는 것입니다.

내가 완전히 틀린 경우 패키지가 유효하지 않은 이유를 조사하고 결과를 게시해야합니다. 그것이 유효하지 않다는 사실은별로 의미가 없습니다.

+0

유익한 답변을 해주셔서 감사합니다. dbms_session.modify_package_state (dbms_session.reinitialize)를 실행하여 바로 가기 솔루션을 찾았습니다. proc.http : //docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sessio.htm#BHCEIDAB – TonyP

+0

@TonyP의 시작 부분에서 도움을 얻었 기 때문에 기쁘게 생각합니다. 동일한 이유로 내 DB에서'alter package compile '; 문제를 해결할 시간이 없었습니다. 당신이 이것을하는 것을 피할 수 있다면 그것은 그것의 가치가있다. – Ben

2

개체를 삭제하면 해당 개체를 참조하는 모든 개체가 잘못된 것으로 표시됩니다. 이 무효화 된 객체를 참조하는 객체도 무효로 표시 될 수 있습니다. 그래서, 여러분의 패키지가이 테이블을 참조하거나 그 테이블에 의존하는 것으로 보입니다.

오라클이 ORA-04061 오류를 발생시키는 이유를 알고 있으며 처음으로 유효하지 않은 패키지를 호출 할 때 자동으로 패키지의 유효성을 다시 검사하지 않습니다. 그러나, 나는 이것을 문제로 보지 않는다. 응용 프로그램이 실행되는 동안 실제로 테이블을 만들거나 삭제하면 안됩니다. 왜 이럴 필요가 있니?

DELETE FROM my_table보다 빠르게 테이블을 비울 방법을 찾고 있다면 TRUNCATE TABLE my_table을 사용하십시오. TRUNCATECREATE, ALTERDROP과 같이 DDL이므로 EXECUTE IMMEDIATE으로 전화를 겁니다.

관련 문제