SQL SELECT 문에서 패키지 상수를 사용하는 방법
Oracle의 단순한 SELECT 쿼리 문에서 패키지 변수를 사용하려면 어떻게 해야 합니까?
뭐랄까
SELECT * FROM MyTable WHERE TypeId = MyPackage.MY_TYPE
PL/SQL을 사용하는 경우(SELECT in BEGIN/END 사용)는 전혀 가능합니까?
그럴수는 없어요.
SQL 문에서 공용 패키지 변수를 사용하려면 값을 외부에 노출하기 위해 래퍼 함수를 작성해야 합니다.
SQL> create package my_constants_pkg
2 as
3 max_number constant number(2) := 42;
4 end my_constants_pkg;
5 /
Package created.
SQL> with t as
2 ( select 10 x from dual union all
3 select 50 from dual
4 )
5 select x
6 from t
7 where x < my_constants_pkg.max_number
8 /
where x < my_constants_pkg.max_number
*
ERROR at line 7:
ORA-06553: PLS-221: 'MAX_NUMBER' is not a procedure or is undefined
래퍼 함수를 만듭니다.
SQL> create or replace package my_constants_pkg
2 as
3 function max_number return number;
4 end my_constants_pkg;
5 /
Package created.
SQL> create package body my_constants_pkg
2 as
3 cn_max_number constant number(2) := 42
4 ;
5 function max_number return number
6 is
7 begin
8 return cn_max_number;
9 end max_number
10 ;
11 end my_constants_pkg;
12 /
Package body created.
이제 작동하게 되었습니다.
SQL> with t as
2 ( select 10 x from dual union all
3 select 50 from dual
4 )
5 select x
6 from t
7 where x < my_constants_pkg.max_number()
8 /
X
----------
10
1 row selected.
나에게 잘 맞는 더 일반적인 방법이 있다.입력 상수 이름(schema.package.constantname 등)을 사용하여 함수를 만들면 상수 값이 반환됩니다.res 변수를 바인딩하여 PL/SQL 블록을 즉시 실행합니다(예 참조).
기능은 다음과 같습니다.
CREATE OR REPLACE FUNCTION GETCONSTANTVALUE (i_constant IN VARCHAR2) RETURN NUMBER deterministic AS
res number;
BEGIN
execute immediate 'begin :res := '||i_constant||'; end;' using out res;
RETURN res;
END;
/
그러면 다음과 같은 SQL의 모든 패키지의 상수를 사용할 수 있습니다.
select GETCONSTANTVALUE('PKGGLOBALCONSTANTS.constantname') from dual;
이와 같이 하나의 기능만 필요하며 기존 packages.constants를 사용할 수 있는 이점을 활용할 수 있습니다.
주의: Oracle 11g에서만 시도했습니다.
저도 같은 요구가 있어서 (패키지 없이) 원하는 값을 반환하는 함수를 선언하는 것이 더 쉬웠습니다.Import를 위해 ddl에 넣으려면 각 함수 선언을 / 문자로 구분해야 합니다.예를 들어 다음과 같습니다.
CREATE OR REPLACE FUNCTION UNDEFINED_INT RETURN NUMBER AS BEGIN RETURN 2147483646; END;
/
CREATE OR REPLACE FUNCTION UNDEFINED_SHORT RETURN NUMBER AS BEGIN RETURN 32766; END;
/
CREATE OR REPLACE FUNCTION UNDEFINED_LONG RETURN NUMBER AS BEGIN RETURN 223372036854775806; END;
/
CREATE OR REPLACE FUNCTION UNDEFINED_FLOAT RETURN FLOAT AS BEGIN RETURN .4028233E38; END;
/
CREATE OR REPLACE FUNCTION UNDEFINED_DOUBLE RETURN BINARY_DOUBLE AS BEGIN RETURN to_binary_double('1.7976931348623155E308'); END;
/
CREATE OR REPLACE FUNCTION UNDEFINED_STRING RETURN VARCHAR AS BEGIN RETURN '?'; END;
/
이를 통해 함수를 상수 값인 것처럼 참조할 수 있습니다(예: 괄호도 필요 없음).
예를 들어 (정밀도를 나타내는 to_char 메서드가 보존되어 있는 것을 주의해 주세요).듀얼에서 undefined_int를 선택합니다.
UNDEFINED_INT
-------------
2147483646
듀얼에서 undefined_string을 선택합니다.
UNDEFINED_STRING
--------------------------------------------------------------------------------
?
듀얼에서 undefined_double을 선택합니다.
UNDEFINED_DOUBLE
----------------
1.798E+308
SQL > to_char ( undefined _ double , ' 9 . 99999999999999999999) 를 선택합니다.EEE') (듀얼부터)
TO_CHAR(UNDEFINED_DOUBL
-----------------------
1.797693134862316E+308
SQL > to_char ( undefined _ double , ' 9 . 9999999999999999999999999) 를 선택합니다.EEE') (듀얼부터)
TO_CHAR(UNDEFINED_DOUBLE,
-------------------------
1.79769313486231550E+308
아니, 넌 그렇게 할 수 없어값을 반환하는 함수를 제공하고 SQL에서 값을 사용해야 합니다.
SELECT * FROM MyTable WHERE TypeId = MyPackage.FUN_MY_TYPE
언급URL : https://stackoverflow.com/questions/5178830/how-to-use-a-package-constant-in-sql-select-statement
'programing' 카테고리의 다른 글
Google Instant는 어떻게 작동합니까? (0) | 2023.02.28 |
---|---|
Pymongo를 사용하여 컬렉션의 모든 문서 가져오기 (0) | 2023.02.28 |
오류가 발생하지 않고 모듈의 존재를 확인하는 방법은 무엇입니까? (0) | 2023.02.28 |
Wordpress 폼에서 SOAP 웹 서비스를 호출하려면 어떻게 해야 합니까? (0) | 2023.02.28 |
토큰 기반 인증을 위한 JWT vs 쿠키 (0) | 2023.02.28 |