programing

10진수에 대한 NLS_NUMERIC_CHARTS 설정

sourcejob 2023. 6. 28. 21:40
반응형

10진수에 대한 NLS_NUMERIC_CHARTS 설정

저는 테스트 기계에 하나의 db 설정이 있고 생산 기계에 두 번째 설정이 있습니다.실행할 때:

select to_number('100,12') from dual 

그러면 테스트 기계에 오류가 발생합니다.그러나 이 문구는 생산 기계에서 꽤 잘 작동합니다.

이제 NLS_NUMERIC_CHARATERS를 확인하면 두 기계 모두에서 ','(콤마)가 표시됩니다.제가 십진수 설정을 찾아야 할 다른 곳이 있나요?

건배!

쿼리를 통해 현재 세션 설정을 볼 수 있습니다.nls_session_parameters:

select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

VALUE                                  
----------------------------------------
.,                                       

에서 볼 수 있는 데이터베이스 기본값과 다를 수 있습니다.nls_database_parameters.

이 세션에서 쿼리 오류:

select to_number('100,12') from dual;

Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"

직접 세션을 변경할 수 있습니다.alter session또는 문자열이 필요한 설정으로 이어지도록 클라이언트를 구성합니다(예: 운영 체제 또는 Java 로케일에서 상속될 수 있음).

alter session set NLS_NUMERIC_CHARACTERS = ',.';
select to_number('100,12') from dual;

TO_NUMBER('100,12')
-------------------
             100,12 

SQL Developer에서 Tool->Preferences->Database->NLS에서 원하는 값을 설정할 수 있습니다.

그러나 세 번째 nlsparam 매개 변수(선택 사항)를 사용하여 쿼리의 일부로 해당 세션 설정을 재정의할 수도 있습니다. 단, 두 번째 fmt 매개 변수(선택 사항)도 필요하므로 적절한 형식을 선택할 수 있어야 합니다.

alter session set NLS_NUMERIC_CHARACTERS = '.,';
select to_number('100,12', '99999D99', 'NLS_NUMERIC_CHARACTERS='',.''')
from dual;

TO_NUMBER('100,12','99999D99','NLS_NUMERIC_CHARACTERS='',.''')
--------------------------------------------------------------
                                                        100.12 

기본적으로 결과는 세션 설정과 함께 계속 표시되므로 소수점 구분 기호는 마침표입니다.

Jana, Oracle SQL Developer의 세션 매개 변수는 클라이언트 컴퓨터에 따라 다르며 PL/SQL의 NLS 매개 변수는 서버에 따라 다릅니다.

예를 들어,NLS_NUMERIC_CHARACTERS클라이언트 컴퓨터에서는 ','일 수 있지만 서버에서는 '.'일 수 있습니다.

따라서 PL/SQLOracle SQL Developer에서 스크립트를 실행할 때 예상한 세션을 변경하지 않는 한 동일한 스크립트에 대해 소수 구분 기호가 완전히 다를 수 있습니다.NLS_NUMERIC_CHARACTERS대본에

세션 매개 변수를 쉽게 테스트하는 한 가지 방법은 다음과 같습니다.

select to_number(5/2) from dual;

SESSION 소수 구분자를 알기 위해 다음 SQL 명령을 사용할 수 있습니다.

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

select SUBSTR(value,1,1) as "SEPARATOR"
      ,'using NLS-PARAMETER' as "Explanation"
  from nls_session_parameters
  where parameter = 'NLS_NUMERIC_CHARACTERS'

UNION ALL

select SUBSTR(0.5,1,1) as "SEPARATOR" 
      ,'using NUMBER IMPLICIT CASTING' as "Explanation"
  from DUAL;

첫 번째 SELECT 명령은 다음에 정의된 NLS 매개 변수를 찾습니다.NLS_SESSION_PARAMETERStable. 반환된 값의 첫 번째 문자는 소수 구분 기호입니다.

두 번째 SELECT 명령은 암시적으로 변환합니다.0.5세션 수준에서 정의된 NLS_NUMERIC_CHARACHARTS를 사용하여 문자열에 유리한 숫자를 입력합니다.

두 명령 모두 동일한 값을 반환합니다.

이미 PL/SQL 스크립트에서 동일한 SQL 명령을 테스트했으며 이 값은 항상 표시되는 값과 동일합니다.PL/SQL 스크립트에 표시되는 소수 구분 기호는 SQL에 표시되는 숫자와 동일합니다.

제 말을 테스트하기 위해 다음 SQL 명령을 사용했습니다.

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', ';

select 'DECIMAL-SEPARATOR on CLIENT: (' || TO_CHAR(.5,) || ')' from dual;

DECLARE
    S VARCHAR2(10) := '?';
BEGIN

    select .5 INTO S from dual;

    DBMS_OUTPUT.PUT_LINE('DECIMAL-SEPARATOR in PL/SQL: (' || S || ')');
END;
/

소수 구분 기호를 아는 짧은 명령은 다음과 같습니다.

SELECT .5 FROM DUAL;

답례는 ㅠㅠㅠㅠ0,5이고 "" " " "일 "0.5소수점 구분 기호가 POINT인 경우

가장 좋은 방법은,

SELECT to_number(replace(:Str,',','')/100) --into num2 
FROM dual;

언급URL : https://stackoverflow.com/questions/24571355/nls-numeric-characters-setting-for-decimal

반응형