Plsql 如何使用sql将长值转换为字符串

Plsql 如何使用sql将长值转换为字符串,plsql,Plsql,我正在使用java以以下方式进行长到字符串的转换 Long longValue = 367L; String str = Long.toString(longValue, 36).toUpperCase(); 这将我作为值A7返回。如何在执行oracle sql时实现这一点 更新: 您好,我已经分析了java代码是如何工作的,然后想在过程中实现同样的东西 第一点是输入值。长和根。就我而言,基数是36。所以我将得到1..9A…Z0的值,它只从这个集合中获取值。 第二个点长值作为输入。我们必须把这

我正在使用java以以下方式进行长到字符串的转换

Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();
这将我作为值A7返回。如何在执行oracle sql时实现这一点

更新:

您好,我已经分析了java代码是如何工作的,然后想在过程中实现同样的东西

第一点是输入值。长和根。就我而言,基数是36。所以我将得到1..9A…Z0的值,它只从这个集合中获取值。 第二个点长值作为输入。我们必须把这个值除以基数。如果商再次大于36,我们需要除法

对于eaxmple 367,则我的转换值为10商7余数,即A7。 3672转换后的值是1020,我需要再做一次,102是2-6,所以我的最终值是2-60,也就是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;

在PL/SQL或Oracle SQL中,您有一个名为_CHAR的函数


在纯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函数,但它只能在向表中插入数据时使用。

您只能将此函数应用于长或长原始列,并且 仅在INSERT语句中子查询的select列表中

还有其他更合适的方法,使用dbms_sql.column_value_long,但这会使长列的获取和附加到CLOB类型变得复杂


Oracle数据库PL/SQL包和类型引用

您想在plsql中进行转换的原因是什么?通常,最好在数据库中保持数据的本机数据类型,并在将其呈现给用户之前立即在更高级别上处理格式化问题。上面的代码将生成一个序列id。现在,我正在编写一个过程来完成我们在java中为批处理所做的同样的事情。这就是为什么我希望在sql中有相同的值。有没有可能。有人比我更有勇气从SQL中获取SQL并修改它以进行base-36转换。但是请注意-这不是胆小鬼的任务…感谢Pugal提供的代码。我看不到任何选项可以为转换指定10以外的基数。Java转换得到的是base-36表示。谢谢,我想你误解了我的问题,或者我的提问是错误的。我开始明白,我必须编写自己的函数,这正是toString所做的。毕竟它是Java,它肯定有一些库。@the_slk:请仔细阅读Oracle中的数据类型。它与Java中同名的数据类型没有相似之处,它是一种文本数据类型,用于保存类似于CLOB的可变长度大型对象数据。它的使用已经被弃用多年了。@Bob Jarvis:我知道。这就是为什么Java应该包含一些lib来处理它。