2013-06-20 73 views
1

我正在用以下方式使用java進行字符串轉換。如何將Long值轉換爲使用sql的字符串

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

這是返回我作爲值A7。如何才能做到這一點在做oracle的sql。

更新:

嗨,我已經分析了Java代碼工作,然後要在落實過程中的同樣的事情。

第一點是輸入vaues。長和基數。在我的情況下,基數是36.所以我將有從1..9A的值... Z0它只從這個集合中獲取值。 第二點長輸入值。我們必須將這個值與基數分開。如果商數再次超過36,我們需要分開。

對於eaxmple 367,那麼我的轉換值是10(商)7(餘數)是A7。 3672轉換後的值是102 0我需要再次爲102這是2 -6,所以我的最終值將是2-6 0即2U0( - 意味着顛倒順序)。

更新2:

使用建立在函數中的oracle我們可以做到這一點。這是我的朋友解決的,給了我一個功能。我要感謝我的朋友。這會給我一個如下的結果。

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

是的。上面的代碼會生成一個序列號。現在我正在編寫過程來做同樣的事情,我們在java中進行批處理。這就是爲什麼我想在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數據庫PL/SQL軟件包和類型參考)

+0

謝謝,我想你誤解了我的問題,或者我的問題是錯誤的。我已經瞭解到,我必須編寫自己的函數,確切地說toString要做什麼。 – user1268890

+0

畢竟它是Java必須有一些庫。 –

+0

@the_slk:請閱讀Oracle中的[LONG](http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i3056)數據類型。它與Java中同名數據類型沒有任何相似之處,它是一種旨在保存可變長度大對象數據(類似於CLOB)的文本數據類型。它的使用已被棄用多年。 –

相關問題