2010-12-10 3 views
0

최근 개발 한 데이터베이스 중 하나를 Oracle 계정에서 LDAP 로그인 계정으로 변경했으며 시스템에 액세스하는 직원이 사용하는 프런트 엔드에 모두 적합했습니다. 그러나 데이터베이스에 데이터를로드하는 admin staff로 제한된 두 번째 항목 방법이 있으며 dbms_scheduler를 사용하여 많은 처리가 호출됩니다.오라클 글로벌 임시 테이블과 스토어드 프로 시저 및 함수 사용

대부분의 데이터베이스 테이블에는 created_by 열이 있습니다.이 열은 sys_context에서 사용자 이름을 가져 오는 기본값이지만 dbms_scheduler에서 데이터로드가 실행될 때이 정보를 사용할 수 없으므로 created_by 열은 모두 APP_GLOBAL로 채워집니다.

전역 임시 테이블 (GTT)에 sys_context 값을 채우고이 값을 사용하여 db_scheduler라는 저장 프로 시저에서 created_by를 채 웁니다. 따라서 다음 논리적 단계는이를 함수에 넣고 호출하는 것입니다. 시스템 전반에 걸쳐 사용될 수 있거나 심지어 삽입 트리거 이전에 참조 될 수도 있습니다.

문제는 코드를 함수에 넣을 때 GTT의 데이터를 찾을 수 없다는 것입니다. 테이블은 행을 보존하도록 설정됩니다.

많은 사이트를 트롤링했지만 답변을 구할 수있는 사람이 아무도 없었습니다.

답변

0

스케줄러가 작업을 생성 한 세션과 다른 세션을 사용하고 있습니다. preserve rows은 다른 세션에서 GTT 데이터를 볼 수 없게합니다.

created_by 열의 기본값이 nvl(sys_context(...),'APP_GLOBAL') 인 것으로 가정합니다. 사용자 이름을 매개 변수로 작업에 전달하고 컨텍스트를 작업의 첫 번째 단계로 설정하십시오.

+0

Jack, 저는 dbms_scheduler와 동일한 세션을 위해 GTT를 채우고 선택할 수 있습니다. 모든 저장 프로 시저가 스케줄러에서 실행하여 참조 할 수 있도록 코드를 함수에 넣었지만 함수를 참조 할 때 GTT의 데이터가 반환되지 않습니다. created_by에 대한 가정은 거의 정확합니다. 표현식은 열의 기본값이며 트리거가 아닙니다. – Colin

+0

@Colin 죄송합니다 - 트리거에 대한 참조는 오타입니다 –

+0

@Colin 스케줄러가 실행하는 각 작업마다 다른 세션을 사용합니다 –

0

주말에 내 코드를 면밀히 살펴보면 GTT의 데이터 선택이 발생하지 않는 구문에서 치명적인 결함이 있음을 알 수 있습니다. 신속하게 조정하고 다시 컴파일하면 모든 것이 잘됩니다.

잭, 도움 주셔서 감사합니다.

관련 문제