복붙노트

[SQL] 어떻게 SQL SELECT 문에서 패키지 상수를 사용 하는가?

SQL

어떻게 SQL SELECT 문에서 패키지 상수를 사용 하는가?

어떻게 간단한에서 패키지 변수는 오라클 쿼리 문을 선택 사용할 수 있습니까?

같은 뭔가

SELECT * FROM MyTable WHERE TypeId = MyPackage.MY_TYPE

그것은 전혀 불가능하거나 (END / BEGIN 내에서 사용 SELECT) PL / SQL을 사용하는 경우에만인가?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.아니, 당신은 그렇게 할 수 aren'e. 당신은 기능을 제공해야 그 반환 값 다음 사용하는 SQL에서 :

    아니, 당신은 그렇게 할 수 aren'e. 당신은 기능을 제공해야 그 반환 값 다음 사용하는 SQL에서 :

    SELECT * FROM MyTable WHERE TypeId = MyPackage.FUN_MY_TYPE
    
  5. from https://stackoverflow.com/questions/5178830/how-to-use-a-package-constant-in-sql-select-statement by cc-by-sa and MIT license