Comment convertir le Long de la valeur de Chaîne à l'aide de sql
Je suis en train de faire une longue chaîne de conversion à l'aide de java manière suivante.
Long longValue = 367L;
String str = Long.toString(longValue, 36).toUpperCase();
c'est le retour de moi que la valeur de l'A7. comment pouvons atteindre cet objectif en faisant oracle sql.
Mise à JOUR:
Salut, j'ai analysé comment le code java fonctionne alors voulu mettre en place la même chose dans la procédure.
Premier point d'Entrée vaues. LONG et Radix. dans mon cas, Radix est de 36. je vais donc avoir des valeurs à partir de 1..9A...Z0 Elle reprend les valeurs de cet ensemble uniquement.
Deuxième point de valeur en entrée. nous devons diviser cette valeur avec radix. si le quotient est plus que 36 nous avons encore besoin de diviser.
Pour eaxmple 367 puis ma valeur convertie est de 10(le quotient) 7(reste) c'est-à A7.
3672 valeur convertie est de 102 0 j'ai besoin de faire à nouveau pour 102 2 -6 donc ma valeur finale sera 2-6 0 c'est-2U0(- moyens d'inverser l'ordre).
Mise à JOUR 2:
De l'utilisation d'oracle construit dans les fonctions, nous pouvons le faire. cela a été résolu par mon ami et m'a donné une fonction.Je tiens à remercier mon ami. cela me donnera une sortie comme suit.
367 puis ma valeur convertie est de 10(le quotient) 7(reste) c'est *Un*7.(J'ai modifié à mon besoin).
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;
- Est-il une raison pourquoi vous voulez faire la conversion en plsql? Il est généralement préférable de garder les données dans son pays d'origine type de données dans la base de données, et de traiter avec le formatage des préoccupations à un niveau supérieur (immédiatement avant qu'il soit présenté à l'utilisateur, idéalement)
- oui. le code ci-dessus va générer un id de séquence. maintenant, je suis en train d'écrire la procédure pour faire la même chose que ce que nous faisons en java pour les processus de traitement par lots. c'est pourquoi je voulais avoir l'équivalent de la valeur en sql. est-il possible.
- Quelqu'un avec plus de courage que j'ai pu prendre le SQL à partir de cette page par Frank Zhou à OraQA et de le modifier pour faire de base-36 de conversion. Mais attention, ce n'est pas une tâche pour les faibles de cœur...
- Grâce Pugal pour votre code.
Vous devez vous connecter pour publier un commentaire.
EN PL/SQL (Oracle SQL), vous avez la un appel de fonction TO_CHAR.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions181.htm
Il n'est pas possible de le faire dans le plus pur SQL. Vous devez utiliser PL/SQL.
Exemple Simple comment faire PL/SQL:
Il est TO_LOB fonction, mais il peut seulement être utilisé lorsque vous insérez des données dans une table.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions185.htm
Il y a aussi d'autres, plus bonne façon de le faire à l'aide de "dbms_sql.column_value_long" mais cela devient compliqué (l'extraction de la LONGUE colonne et l'ajout de la CLOB type.)
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm#i1025399
(Base de données Oracle PL/SQL Paquets et les Types de Référence)