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.
InformationsquelleAutor user1268890 | 2013-06-20