모든 저장 프로 시저 호출에 추가 매개 변수를 전달하는 대신 컨텍스트를 사용합니다. 컨텍스트는 저장 프로 시저가 모두 참조 할 수있는 임의의 세션 수준 상태 데이터를 저장할 수있는 편리한 위치입니다.
예를 들어, 내 응용 프로그램에 대해 컨텍스트 MYAPP_CTX
을 만들고 컨텍스트에서 원하는 모든 값을 설정할 수있는 간단한 패키지를 만들 수 있습니다.
SQL> create context myapp_ctx using ctx_pkg;
Context created.
SQL> create package ctx_pkg
2 as
3 procedure set_value(p_key in varchar2, p_value in varchar2);
4 end;
5/
Package created.
SQL> create package body ctx_pkg
2 as
3 procedure set_value(p_key in varchar2, p_value in varchar2)
4 as
5 begin
6 dbms_session.set_context('MYAPP_CTX', p_key, p_value);
7 end;
8 end;
9/
Package body created.
응용 프로그램이 연결 풀에서 연결을 가져 오면 모든 컨텍스트 정보를 한 번 설정하면됩니다.
SQL> begin
2 ctx_pkg.set_value('USERNAME', 'JCAVE');
3 ctx_pkg.set_value('IP_ADDRESS', '192.168.17.34');
4 end;
5/
PL/SQL procedure successfully completed.
동일한 세션에서 후속 호출 및 쿼리는 컨텍스트에 저장된 값을 요청할 수 있습니다.
SQL> select sys_context('MYAPP_CTX', 'USERNAME')
2 from dual;
SYS_CONTEXT('MYAPP_CTX','USERNAME')
--------------------------------------------------------------------------------
JCAVE
현실적으로, 당신은 거의 확실하게 연결이 문맥을 허용하는 실수 방지하기 위해 연결 풀에 반환 될 때 맥락에서 설정 한 값이 무엇이든지 취소 dbms_session.clear_context('MYAPP_CTX')
라는 패키지에 clear_context
절차를 추가 할 것 한 세션의 정보가 다른 세션으로 유출 될 수 있습니다. 또한 'USERNAME'을 여러 곳으로 하드 코딩하지 않고 공통 키 (사용자 이름, IP 주소 등)를 설정하고 가져 오는 별도의 절차로 패키지를 디자인 할 수 있습니다. 단순화를 위해 하나의 일반 set_value
메서드를 사용했습니다.
확실히 표준이 아니며 확실히 수행하지 않는 것이 좋습니다. 어떤 종류의 '추가'데이터 (예 : 사용자 이름 등)를 전달해야합니까? – Icarus
예, 사용자 이름, 도메인, IP 주소를 전달해야합니다. – zaq