Quien soy? RSS feed Enviar por email Imprimir Parar este menu Ir arriba
Blogzote.com
Mexico, informatica, internet, musica y algo mas…

Rawtochar en Oracle

En mi actual proyecto se necesitaba leer la información contenida en un campo de tipo BLOB, que no era más que a fin de cuentas una cadena XML pero guardada en un campo de la base de datos.

Conocía poco del tema pero San Google hace milagros y me tope fácilmente con el paquete DBMS_LOB, dentro de él existe la función SUBSTR que al igual que substr aplicado a una cadena normal regresa una porción de ella definida por los dos siguientes parámetros, aunque varia un poco su uso. (No hablare a detalle del uso del paquete en este post).

Pero resulta que al utilizar esta función el resultado no es el esperado:

1
2
3
4
5
6
7
SQL> SELECT DBMS_LOB.SUBSTR(campo_blob, 100, 1) campo_blob
  2    FROM tabla_con_campo_blob
  3   WHERE identificador = 1;
 
CAMPO_BLOB
--------------------------------------------------
3C3F786D6C2076657273696F6E3D22312E302220656E636F64

Lo que pasa es que la función dbms_lob.substr regresa una cadena de tipo RAW (tampoco hablare mucho al respecto) otra vez pidiendo ayuda a san google me tope con un paquete para convertir mi cadena raw a una cadena legible tipo varchar2, solo la adapte un poquito a lo que necesitaba, acá se las dejo:

1
2
3
4
5
6
7
8
9
CREATE OR REPLACE PACKAGE rawtochar IS
 
  FUNCTION hextonum(v_hex VARCHAR2) 
    RETURN NUMBER;
 
  FUNCTION rawtochar(p_raw_data VARCHAR2) 
    RETURN VARCHAR2;
 
END;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
CREATE OR REPLACE PACKAGE BODY rawtochar IS
 
  FUNCTION hextonum(v_hex VARCHAR2) 
   RETURN NUMBER IS 
 
    hex          VARCHAR2(4);
    num          NUMBER;
    num1         NUMBER;
    num2         NUMBER;
 
  BEGIN
 
    hex := SUBSTRB(v_hex,1,1);
 
    IF ( hex >= '0' AND hex < = '9' ) THEN 
      num1  := TO_NUMBER(hex);
    END IF; 
    IF hex = 'A' THEN num1 := 10; END IF; 
    IF hex = 'B' THEN num1 := 11; END IF; 
    IF hex = 'C' THEN num1 := 12; END IF; 
    IF hex = 'D' THEN num1 := 13; END IF; 
    IF hex = 'E' THEN num1 := 14; END IF; 
    IF hex = 'F' THEN num1 := 15; END IF; 
 
    hex := SUBSTRB(v_hex,2,1);
 
    IF ( hex >= '0' AND hex < = '9' ) THEN 
      num2  := TO_NUMBER(hex);
    END IF; 
    IF hex = 'A' THEN num2 := 10; END IF; 
    IF hex = 'B' THEN num2 := 11; END IF; 
    IF hex = 'C' THEN num2 := 12; END IF; 
    IF hex = 'D' THEN num2 := 13; END IF; 
    IF hex = 'E' THEN num2 := 14; END IF; 
    IF hex = 'F' THEN num2 := 15; END IF; 
 
    num := (num1*16)+num2;
 
    RETURN num;
 
  END;
 
  FUNCTION rawtochar(p_raw_data  VARCHAR2) 
   RETURN VARCHAR2 IS
 
    raw_data          LONG RAW;
    rawlen            NUMBER;
    hex_data          VARCHAR2(32760);
    char_data         VARCHAR2(32760);
    loop_counter      NUMBER;
 
  BEGIN
 
    raw_data := p_raw_data;
 
    -- Convert the raw data to hex.    
    hex_data := RAWTOHEX(raw_data);
    rawlen := LENGTH(hex_data);
 
    loop_counter := 1;
 
    -- Loop through and convert the hex to characters.
    WHILE loop_counter <= rawlen LOOP
        char_data := char_data || CHR(HEXTONUM(SUBSTRB(hex_data,loop_counter,2)));
        loop_counter := loop_counter + 2;
    END LOOP;
 
    RETURN char_data;
 
  END;
 
END;

Listo, ahora solo le aplico esta función y ya veo información más acorde:

1
2
3
4
5
6
7
8
SQL> SELECT rawtochar.rawtochar(DBMS_LOB.SUBSTR(campo_blob, 100, 1)) campo_xml
  2    FROM tabla_con_campo_blob
  3   WHERE identificador = 1;
 
CAMPO_XML
--------------------------------------------------------------------------------
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE workflow PUBLIC "-//...

Para los que acabaron de leer el post y llegaron hasta acá, como moraleja déjenme decirles que no se vallan con la primera solución que encuentren, siempre habrá mejores maneras de hacer las cosas, algo que ya sabia pero que en esta ocasión por las prisas no considere, resulta que después de solucionado el problema me quede con la espinita, realmente no habrá pensado oracle en este problema ya?, la lógica me decía que seguramente si, y que creen? Así era, ya existe la manera de convertir un raw a varchar2 por lo que la función rawtochar no era necesaria:

1
2
3
4
5
6
7
8
SQL> SELECT UTL_RAW.cast_to_varchar2(DBMS_LOB.SUBSTR(campo_blob, 100, 1)) campo_xml
  2    FROM tabla_con_campo_blob
  3   WHERE identificador = 1;
 
CAMPO_XML
--------------------------------------------------------------------------------------
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE workflow PUBLIC "-//...
Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (1 valoraciones, media: 4.00 de 5)
Loading ... Loading ...

No estaba muerto, andaba de…

Hace exactamente un año de mi ultimo post, fue un año lleno de cambios, emprendimientos, exitos y fracasos, ingresos y gastos, acostumbrarse y desacostumbrarse, perdidas y ganancias, personas que llegan y personas que se van, diversiones y enojos, aprendizaje, trabajo, personas, etc. sin duda, uno de mis años mas contrastantes ¿de eso se trata no?, al principio fue por un proyecto que consumía casi completamente mi tiempo, después se vino fin de año 2007 y una muy buena temporada para las ventas por Internet, después principios de 2008 con otro proyecto diferente, después decidí escribir mi siguiente post hasta después de un año y ahora a mediados de año otro proyecto mas, pero decidido a escribir mas seguido.

Tengo muchas cosas de las que quiero escribir, muchas cosas nuevas, mucho del “mexican style” de corruptelas que me he topado, mucho de Oracle, de Internet, Tiendas virtuales, Open Source, Música, en fin, todo del mundo en el que me muevo.

Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Loading ... Loading ...

¡Faltaron dos!

Hoy leyendo las noticias me topo con una un poco fuera de lo normal, resulta que publicaron en Internet la lista de pasajeros del Titanic, si, nada mas y nada menos de aquel majestuoso trans-atlántico que se hundió hace 95 años, aquí la noticia:

Los nombres, edades y profesiones de los pasajeros del Titanic fueron publicados en internet por primera vez, 95 años después de que el crucero se hundiera en aguas del Atlántico durante su viaje inaugural.

De acuerdo con la página electrónica de El País docenas de hojas con la lista original de pasajeros, escritas a mano, están disponibles en la red, incluida la clasificación de quienes viajaban en el barco.

La lista recoge los planes de muchas personas que partieron de Southampton buscando una nueva vida en Estados Unidos en 1912. Sin embargo, el crucero de la White Star, considerado “insumergible”, zarpó el 10 de abril y se hundió cinco días después, tras chocar con un iceberg; en el naufragio murieron mil 523 personas.

El documento de 34 páginas se encontraba hasta el momento en los Archivos Nacionales de Kew, al suroeste de Londres, en el Reino Unido, y solo podía ser consultado bajo supervisión.

En la lista se encuentran los detalles de personas que compraron un boleto para viajar a Nueva York en el Titanic pero que nunca llegaron a subir.

Nota completa

Tengo poco que comentar al respecto, solo que les faltaron dos personas, en la lista nunca encontré a Leonardo DiCaprio ni a Kate Winslet, ¿Cómo? Si yo los vi en el cine y como 400 veces (mas las que se acumulen) en la tele arriba del barco, yo vi como volaba en la punta del barco agarrada del Dicaprio, yo vi como se aventaban un rapidin en un coche, yo vi como resultaba que ella lo salvaba de morir ahogado para al final morir congelado por salvarla (película tenia que ser) en fin, muchas cosas mas bien mamilas que hicieron y no están en la lista, ha que cosas tiene la vida.

Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Loading ... Loading ...

Trabajo mental

Me encontré esta imagen en la red, solo tienen que fijar su atención en la cruz del centro, primero aparecerá el circulo verde y después desaparecerán los demás, en realidad no se que explique este fenómeno pero esta interesante.

mental
Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Loading ... Loading ...