2012-09-09 3 views
0

테이블, 트리거, 시퀀스 및 패키지를 설치하는 데 사용하는 sql 스크립트 파일이 있습니다. 패키지는 SQL 스크립트 파일에 의해 생성 된 테이블을 사용합니다. 패키지는 응용 프로그램에서 이벤트가 발생할 때, 즉 응용 프로그램 트리거가 시작될 때 패키지가 실행될 때 실행되도록 지정됩니다.PLSQL - 설치가 번갈아 이루어집니다

모든 패키지는 스테이징 테이블에 대량 선택 삽입을 수행합니다. 그것이 전부입니다.

처음으로 새로 설치할 때 패키지가 트리거되고 실행되지만 준비 테이블에 데이터가 삽입되지 않습니다. 그러나 다음 이벤트가 발생하면 패키지가 트리거되고 데이터가 준비 스테이 션에 삽입되어 정상적으로 계속 작동합니다. 그래서 처음에는 초기화 오류 일 수 있다고 생각했습니다.

그러나 패키지를 포함하여 sql 스크립트 파일로 생성 된 모든 객체를 삭제하고 sql 스크립트 파일을 다시 실행하면 첫 번째 이벤트가 발생할 때 패키지가 제대로 작동하고 정상적으로 계속 작동합니다.

초기화 오류가 될 수 없습니다.

하지만 다시 (모든 생각을 잃어 버렸기 때문에) 나는 모든 것을 버리고 스크립트 파일을 다시 실행합니다. 처음으로 알아 차린 행동과 동일한 것을 발견합니다. 그런 다음 모든 것을 다시 드롭하고 스크립트 파일을 다시 실행하여 처음에는 정상적으로 작동합니다.

나는 그것이 왜 이상하게 작동하는지 잘 모른다.

답변

3

코드가 올바르지 않은 (컴파일되지 않은) 상태에 있다고 생각합니다. 아직 생성되지 않은 패키지를 호출하는 테이블에 트리거가 생성됩니다. 그런 다음 패키지가 생성됩니다. 처음 실행 된 후 트리거 코드는 자동으로 서버에 의해 다시 컴파일됩니다. 작성 스크립트에서 모든 오브젝트가 작성된 후, 스크립트를 실행하여 유효하지 않은 오브젝트 (ALTER <object> COMPILE)를 컴파일하십시오.

는 확인하여 이런 경우가 확인 이벤트 트리거

SELECT object_type, object_name 
    FROM all_objects 
    WHERE status = 'INVALID' 

만든 후,하지만 전에.

+0

실제로 테이블은 패키지를 호출하지 않습니다. 두 번째는 INVALID 객체에 대한 쿼리를 실행했을 때 0 행을 다시 실행한다는 것입니다. sleep()을 사용하거나 스크립트 파일에서 패키지 설치를 옮겼습니다. 그러나 그 행동은 반복됩니다. 이 수동으로 설치하고 동일한 동작을 얻을 계획입니다. – user547453

+0

@Glenn .... 실제로 패키지를 떨어 뜨린 것은 명백한 evrytime이되고있는 근본적인 동의어였습니다. 동의어가 패키지에 대해 작성됩니다. 나를 올바른 방향으로 가리켜 주셔서 감사합니다. 하지만 INVALID 개체는 수동으로 컴파일 될 때까지 자동으로 재 컴파일되지 않는다고 생각했습니다. – user547453

+1

@ user547453 다행 이군요. 찾을 수있는 좌절 수 있습니다. [객체 종속성 및 객체 무효화 정보] (http://docs.oracle.com/cd/E11882_01/server.112/e25494/general007.htm#ADMIN12491)'잘못된 종속 객체 참조시 자동으로 재 컴파일이 발생합니다 . 잘못된 개체에 충돌이 발생하면 다시 컴파일하려고 시도하지만 유효하지 않은 개체이기 때문에 여전히 잘못된 개체에 도달 한 작업은 실패합니다. 컴파일이 성공하면 다음 히트가 성공하게됩니다. 좀 더 아래로,'utl_recomp'를보십시오 : 설치 스크립트 후에 실행하는 것이 유용 할 수 있습니다. – Glenn