by 아라온 PRAGMA SERIALLY_REUSABLE [2015.03.26 16:03:08]
안녕하십니까!? 항상 도움받고 있는 개발자입니다^^
다름이 아니라 패키지 컴파일 후 현업에서 띄워놓은 C# 프로그램에서 오류가 발생하는 상황이 생겨 문의드립니다.
오류는 다음과 같습니다.
ORA-04068: 패키지의 기존 상태가 버려졌습니다
ORA-04061: package body "GAMA.PKG_KD001"의 기존상태가 무효화되었습니다
ORA-04065: 실행 불가, package body "GAMA.PKG_KD001"이(가) 변경 또는 삭제되었습니다.
....
질문내용은 구글링을 하다가 오라클 Docs 에서 찾은 방식인데...
패키지 선언부와 바디에 각각 "PRAGMA SERIALLY_REUSABLE" 요놈을 넣으면 오류가 나지 않는것 같습니다.
아직 전체적인 현업 테스트는 하지 않았고 테스트환경에서 잠시 확인만 했는데 이게 무엇인지 궁금하네요.
CREATE OR REPLACE PACKAGE PKG_KD001 AS
PRAGMA SERIALLY_REUSABLE;
CREATE OR REPLACE PACKAGE BODY PKG_KD001 AS
PRAGMA SERIALLY_REUSABLE;
즉, "PRAGMA SERIALLY_REUSABLE" 요녀석이 정확히 어떤 역활을 하는것인지 궁금합니다.
영문내용이라 잘 이해가 안되서요..ㅠ.ㅠ 부탁드립니다... (__)
참조한 사이트는 이곳입니다.
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS99977
잠깐 읽어봤는데 정확하지는 않지만 메모리 확보를 위해서 패키지 상태를 sga 에 공유 리소스로 두고 call 할 때마다 불러오는 개념인 것 같네요.. call 범위 안에서만 package state 가 유지(일반적으로는 세션 레벨에서 유지) 됨에 따라 발생하는 transaction 측면에서의 결과값 차이는 같은 문서에 예시 패키지로 나와 있으니 테스트 해 보시면 될 것 같습니다.
4061 에러는 패키지 스펙 부분에서 변수나 타입 같은거 썼을 때 한 세션에서 내용 바꾸고 컴파일하면 다른 세션들에서 처음 1회씩 에러가 납니다, 세션에서 유지하고 있던 정보들을 패키지가 바뀌었으므로 한번씩 무효화 시켜 줘야 해서...