【发布时间】:2013-06-20 06:15:12
【问题描述】:
我正在通过以下方式使用 java 进行长字符串转换。
Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();
这将返回我作为值 A7。如何在做oracle sql时做到这一点。
更新:
嗨,我已经分析了 java 代码是如何工作的,然后想在程序中实现同样的事情。
第一点是输入值。长和基数。在我的情况下,基数是 36。所以我将有 1..9A...Z0 的值它只从这个集合中获取值。 第二点 Long 值作为输入。我们必须将此值除以基数。如果商再次大于 36,我们需要除以。
对于 eaxmple 367,我的转换值为 10(商)7(余数),即 A7。 3672 转换后的值是 102 0 我需要对 2 -6 的 102 再做一次,所以我的最终值将是 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;
【问题讨论】:
-
有什么理由要在 plsql 中进行转换吗?通常最好将数据以其本机数据类型保存在数据库中,并在更高级别处理格式化问题(最好是在立即呈现给用户之前)
-
是的。上面的代码将生成一个序列 id。现在我正在编写程序来做我们在java中为批处理做的同样的事情。这就是为什么我想在 sql 中具有同等价值的原因。有没有可能。
-
比我更有勇气从this page by Frank Zhou at OraQA 获取 SQL 并对其进行修改以进行 base-36 转换的人。但请注意 - 这不是胆小的人的任务......
-
感谢 Pugal 提供您的代码。
标签: plsql