[SQL] 어떻게 SQL SELECT 문에서 패키지 상수를 사용 하는가?
SQL어떻게 SQL SELECT 문에서 패키지 상수를 사용 하는가?
어떻게 간단한에서 패키지 변수는 오라클 쿼리 문을 선택 사용할 수 있습니까?
같은 뭔가
SELECT * FROM MyTable WHERE TypeId = MyPackage.MY_TYPE
그것은 전혀 불가능하거나 (END / BEGIN 내에서 사용 SELECT) PL / SQL을 사용하는 경우에만인가?
해결법
-
==============================
1.당신은 할 수 없습니다.
당신은 할 수 없습니다.
공용 패키지 변수가 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.
-
==============================
2.나를 위해 잘 작동 더 일반적인 방법이있다. 당신은 입력 일정 이름 (즉 schema.package.constantname)와 함수를 작성하고 그것은 당신에게 상수 값을 반환합니다. 당신은 (예 참조) 고해상도 변수를 바인딩하여 즉시 PL / SQL 블록을 실행 사용합니다.
나를 위해 잘 작동 더 일반적인 방법이있다. 당신은 입력 일정 이름 (즉 schema.package.constantname)와 함수를 작성하고 그것은 당신에게 상수 값을 반환합니다. 당신은 (예 참조) 고해상도 변수를 바인딩하여 즉시 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을 사용하도록 활용할 수 있습니다.
-
==============================
3.참고 : 난 단지 오라클 11g에서 이것을 시도했다.
참고 : 난 단지 오라클 11g에서 이것을 시도했다.
나는 비슷한 요구를했고, 쉽게 간단하게 원하는 값을 반환 (패키지 제외) 함수를 선언 발견했다. 수입 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 방법에주의)의 경우 : SQL> 이중에서 선택 undefined_int;
UNDEFINED_INT ------------- 2147483646
SQL은> 이중에서 undefined_string 선택;
UNDEFINED_STRING -------------------------------------------------------------------------------- ?
SQL은> 이중에서 undefined_double 선택;
UNDEFINED_DOUBLE ---------------- 1.798E+308
이중에서 SQL>를 선택 TO_CHAR (undefined_double, '9.999999999999999EEEE');
TO_CHAR(UNDEFINED_DOUBL ----------------------- 1.797693134862316E+308
이중에서 SQL>를 선택 TO_CHAR (undefined_double, '9.99999999999999999EEEE');
TO_CHAR(UNDEFINED_DOUBLE, ------------------------- 1.79769313486231550E+308
-
==============================
4.아니, 당신은 그렇게 할 수 aren'e. 당신은 기능을 제공해야 그 반환 값 다음 사용하는 SQL에서 :
아니, 당신은 그렇게 할 수 aren'e. 당신은 기능을 제공해야 그 반환 값 다음 사용하는 SQL에서 :
SELECT * FROM MyTable WHERE TypeId = MyPackage.FUN_MY_TYPE
from https://stackoverflow.com/questions/5178830/how-to-use-a-package-constant-in-sql-select-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] ORDER BY "ENUM 필드"MYSQL에서 (0) | 2020.06.26 |
---|---|
[SQL] 행 번호는 SQL 쿼리의 결과 집합에 추가 (0) | 2020.06.26 |
[SQL] 매개 변수가 모두 선택 null의 경우 SQL 쿼리 (0) | 2020.06.26 |
[SQL] 시간없이 날짜 만 아는하여 테이블에서 선택 (ORACLE) (0) | 2020.06.26 |
[SQL] SQL : CASE 문에있는 사용을위한 별칭 열 이름 (0) | 2020.06.26 |