2013-06-20 2 views
1

다음과 같이 java를 사용하여 문자열 변환을 수행하고 있습니다.SQL을 사용하여 Long 값을 String으로 변환하는 방법

Long longValue = 367L; 
String str = Long.toString(longValue, 36).toUpperCase(); 

이 값은 나를 값 A7로 반환합니다. 오라클 SQL을 수행 할 때 어떻게 이것을 달성 할 수 있습니까?

업데이트 :

안녕, 나는 자바 코드는 다음 노력하는 과정에서 같은 일을 구현하고 싶었 방법을 분석 하였다.

첫 번째 포인트는 입력 신호입니다. LONG과 기수. 내 경우 기수는 36입니다. 그래서 1..9A ... Z0의 값을 갖습니다.이 세트에서만 값을 가져옵니다. 두 번째 점 입력 값으로 긴 값. 이 값을 기수로 나눠야합니다. 지수가 36 이상이면 다시 나누어야합니다.

eaxmple 367의 경우 변환 된 값은 A7 인 10 (상수) 7 (나머지)입니다. 변환 된 3672 값은 102입니다. 102에 대해 다시해야하기 때문에 2-6입니다. 따라서 최종 값은 2-6 0이 될 것이므로 2U0입니다. -는 순서를 뒤집습니다.

업데이트 2 :

오라클 내장 함수를 사용하여이를 수행 할 수 있습니다. 이것은 내 친구에 의해 해결되었고 나에게 기능을 주었다. 나는 내 친구에게 감사하고 싶다. 이것은 나에게 다음과 같이 나올 것이다.

367 그러면 변환 한 값은 10 (상수) 7 (나머지) * A * 7입니다. (필자의 요구 사항에 맞게 수정했습니다.)

FUNCTION ENCODE_STRING(BASE_STRING IN VARCHAR2, 
          FROM_BASE  IN NUMBER, 
          TO_BASE  IN NUMBER) 
    RETURN VARCHAR2 
    IS 
     V_ENCODED_STRING VARCHAR(100); 
    BEGIN 

     WITH N1 AS (
        SELECT SUM((CASE 
            WHEN C BETWEEN '0' AND '9' 
             THEN TO_NUMBER(C) 
            ELSE 
             ASCII(C) - ASCII('A') + 10 
           END) * POWER(FROM_BASE, LEN - RN)  
          ) AS THE_NUM 
        FROM (SELECT SUBSTR(BASE_STRING, ROWNUM, 1) C, LENGTH(BASE_STRING) LEN, ROWNUM RN 
         FROM DUAL 
         CONNECT BY ROWNUM <= LENGTH(BASE_STRING)) 
       ), 
      N2 AS ( 
        SELECT (CASE 
           WHEN N < 10 
            THEN TO_CHAR(N) 
           ELSE CHR(ASCII('A') + N - 10) 
          END) AS DIGI, RN 
        FROM (SELECT MOD(TRUNC(THE_NUM/POWER(TO_BASE, ROWNUM - 1)), TO_BASE) N, ROWNUM RN 
         FROM N1 
         CONNECT BY ROWNUM <= TRUNC(LOG(TO_BASE, THE_NUM)) + 1) 
       ) 
     SELECT SYS_CONNECT_BY_PATH(DIGI, '*') INTO V_ENCODED_STRING 
     FROM N2 
     WHERE RN = 1  
     START WITH RN = (SELECT MAX(RN) FROM N2) 
     CONNECT BY RN = PRIOR RN - 1; 

     RETURN V_ENCODED_STRING; 
+0

plsql에서 변환을 수행해야하는 이유가 있습니까? 일반적으로 데이터를 기본 데이터 형식으로 데이터베이스에 보관하고 상위 수준 (이상적으로는 사용자에게 표시되기 직전)의 서식 지정 * 문제를 처리하는 것이 더 좋습니다 ( –

+0

예). 위의 코드는 시퀀스 ID를 생성합니다. 이제 우리는 일괄 처리를 위해 자바에서 수행하는 것과 동일한 작업을 수행하는 프로 시저를 작성하고 있습니다.그래서 sql과 동등한 가치를 원했습니다. 그것이 가능합니다. – user1268890

+0

나는 [이 페이지는 OraQA의 Frank Zhou가 작성한] SQL을 취할 수있는 사람보다 더 용기있는 사람이다. (http://oraqa.com/2008/02/29/how-to-convert-decimal-base-ten-number- to-binaryoctalhex-in-sql /)을 수정하고 base-36 변환을 수행하도록 수정하십시오. 그러나 경고를 받으십시오. 이것은 희미한 마음을위한 일이 아닙니다. –

답변

-1

순수한 SQL에서 그것을 할 수 없습니다. PL/SQL을 사용해야합니다.

그것을 PL/SQL을 수행하는 방법 간단한 예 :

CREATE TABLE long_tbl 
(
    long_col LONG 
); 

INSERT INTO long_tbl VALUES('How to convert the Long value to String using sql'); 

DECLARE 
    l_varchar VARCHAR2(32767); 
BEGIN 
    SELECT long_col 
    INTO l_varchar 
    FROM long_tbl; 

    DBMS_OUTPUT.PUT_LINE(l_varchar); 
END; 
-- How to convert the Long value to String using sql 

이 TO_LOB 기능입니다하지만 당신은 테이블에 데이터를 삽입 할 때 그것은 단지로 사용할 수 있습니다. http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions185.htm

당신은 단지 LONG 또는 LONG RAW 컬럼에이 기능을 적용 할 수 있습니다

, 오직 INSERT 문에서 하위 쿼리의 선택 목록에 .

있다 "dbms_sql.column_value_long"를 사용하여 작업을 수행하는 다른, 더 적절한 방법이기도하지만, 이것은 (긴 칼럼의 인출과 CLOB 유형에 추가.)

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm#i1025399

복잡해진다

(Oracle Database PL/SQL 패키지 및 유형 참조)

+0

감사합니다. 제 질문에 오해 한 것 같아요. 필자는 toString이하는 것과 동일한 기능을 직접 작성해야한다는 것을 알게되었습니다. – user1268890

+0

결국 Java 용 라이브러리가 있어야합니다. –

+0

@the_slk : 오라클의 [LONG] (http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i3056) 데이터 유형을 읽어보십시오. Java에서 동일한 이름의 데이터 유형과 유사하지 않으며 가변 길이 대형 객체 데이터 (CLOB와 유사)를 보유하기위한 텍스트 데이터 유형입니다. 그 사용은 오랫동안 사용되지 않았습니다. –

관련 문제