PL/SQL: 세션 변수를 선언하려면 어떻게 해야 합니까?
PL/SQL에서 세션 변수를 선언하려면 어떻게 해야 합니까? 세션 변수는 데이터베이스 자체에 저장하지 않고 세션 기간 동안만 유지됩니다.
'사용자 생성 컨텍스트'를 사용하여 세션 내 여러 장치에서 공유된 데이터를 저장할 수 있습니다.
먼저 컨텍스트를 만듭니다.
CREATE CONTEXT SYS_CONTEXT ('userenv', 'current_schema')|| '_ctx' USING PKG_COMMON
둘째, 컨텍스트를 관리하는 패키지를 만듭니다.
CREATE OR REPLACE PACKAGE PKG_COMMON
IS
common_ctx_name CONSTANT VARCHAR2 (60)
:= SYS_CONTEXT ('userenv', 'current_schema')
|| '_ctx';
FUNCTION fcn_get_context_name RETURN VARCHAR2;
PROCEDURE prc_set_context_value (var_name VARCHAR2, var_value NUMBER);
END;
CREATE OR REPLACE PACKAGE BODY PKG_COMMON
IS
FUNCTION fcn_get_context_name
RETURN VARCHAR2
IS
BEGIN
RETURN common_ctx_name;
END;
PROCEDURE prc_set_context_value (var_name VARCHAR2, var_value NUMBER)
IS
BEGIN
DBMS_SESSION.set_context (common_ctx_name, var_name, var_value);
END;
END;
prc_set_context_value는 더 고급일 수 있습니다. 이는 예에 불과합니다.컨텍스트와 생성된 패키지를 사용하여 사용을 시작할 수 있습니다.프로시저 호출을 사용하여 컨텍스트 변수 설정
begin
PKG_COMMON.prc_set_context_value('MyVariable', 9000)
end;
절차, 패키지, 기능 또는 이벤트 뷰 등 어디에서나 사용할 수 있습니다.
CREATE VIEW V_TEST AS
SELECT ID, LOGIN, NAME
FROM USERS
WHERE ROLE_ID = SYS_CONTEXT(PKG_COMMON.FCN_GET_CONTEXT_NAME, 'MyVariable')
자세한 내용은 http://www.psoug.org/reference/sys_context.html 를 참조하십시오.
패키지 수준 변수를 생성합니다.다음은 최소한의 예입니다.
CREATE OR REPLACE PACKAGE my_package
AS
FUNCTION get_a RETURN NUMBER;
END my_package;
/
CREATE OR REPLACE PACKAGE BODY my_package
AS
a NUMBER(20);
FUNCTION get_a
RETURN NUMBER
IS
BEGIN
RETURN a;
END get_a;
END my_package;
/
이 작업을 수행할 경우 다음 사항을 숙지하고 올바르게 처리해야 합니다.ORA-04068
오류각 데이터베이스 세션에는 a에 대한 고유한 값이 있습니다.다음과 같이 사용할 수 있습니다.
SELECT my_package.get_a FROM DUAL;
저는 짧지만 직관적인 구문을 사용하는 것을 좋아하기 때문에 글로벌 "변수"를 설정하고 가져오는 하나의 기능만 제공하는 패키지를 만들 것입니다.
(현재 세션에만 적용됨; 내 경우에는 사용자 생성-수정 변수로 구현할 필요가 없지만 후드 아래에서 쉽게 변경할 수 있음; 예: 일부 사용foo varchar2
그리고.bar number
대표팀)
용도:
select ctx.foo from dual -- => null (init)
select ctx.foo('a') from dual -- => 'a'
select ctx.foo('b') from dual ; select ctx.foo from dual -- => 'b', 'b'
.
-- (optimizer should cause the subquerys unselected columns not to be executed:)
select 'ups' from (select ctx.foo('a') from dual) ; select ctx.foo from dual -- => null
select ctx.bar(1.5) from dual ; select ctx.bar from dual -- => 1.5, 1.5
-- ...
패키지 헤더:
create or replace package ctx as
-- select ctx.foo from dual -- => null (init)
-- select ctx.foo('a') from dual -- => 'a'
-- select ctx.foo('b') from dual ; select ctx.foo from dual -- => 'b', 'b'
-- (optimizer should cause the subquerys unselected columns not to be executed:)
-- select 'ups' from (select ctx.foo('a') from dual) ; select ctx.foo from dual
-- => null
-- parallel_enable for queries since it should not change inside of them
function foo( set varchar2 := null ) return varchar2 parallel_enable;
-- (samples like in foo above as executable test comments like in foo above skipped for
-- brevity)
function bar( set number := null ) return number parallel_enable;
end;
패키지 본문:
create or replace package body ctx as
foo_ varchar2(30); -- e.g. 'blabla'
bar_ number;
-- internal helper function for varchars
function set_if_not_null( ref in out varchar2, val varchar2 ) return varchar2 as
begin
if val is not null then ref := val; end if;
return ref ;
end;
-- internal helper function for numbers
function set_if_not_null( ref in out number, val number ) return number as begin
if val is not null then ref := val; end if;
return ref ;
end;
-- (same test comments like in foo above skipped for brevity)
function foo( set varchar2 := null ) return varchar2 parallel_enable as begin
return set_if_not_null( foo_, set ) ;
end;
-- (same test comments like in foo above skipped for brevity)
function bar( set number := null ) return number parallel_enable as begin
return set_if_not_null( bar_, set ) ;
end;
end;
변수()foo
가 단일 쿼리 내에서 변경될 수 있다는 것을 알고 있는 경우 를 제거합니다. 그렇지 않으면 쿼리가 병렬 처리 가능한 경우 더 성능이 좋습니다.
필요에 따라 당연히 추가할 수 있습니다.foo_reset()
null 등으로 설정합니다.
언급URL : https://stackoverflow.com/questions/301369/pl-sql-how-do-i-declare-session-variables
'programing' 카테고리의 다른 글
함수 및 Firestore 사용 시 필드 값이 정의되지 않음 (0) | 2023.06.27 |
---|---|
클래스와 모듈의 차이 (0) | 2023.06.27 |
콘다와 아나콘다의 차이점은 무엇입니까? (0) | 2023.06.27 |
메모장++(또는 기타)를 msysgit와 함께 사용하려면 어떻게 해야 합니까? (0) | 2023.06.27 |
VS 2012에서 사용자 지정 바인딩 호스트가 있는 IIS를 사용하는 프로젝트를 로드할 수 없습니다. IIS Express를 사용하고 있다고 생각합니다. (0) | 2023.06.27 |