2013-06-20 64 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)的文本数据类型。它的使用已被弃用多年。 –

相关问题