lunes, 23 de diciembre de 2013

Obtener el valor de un nodo de un xml en Oracle

Espero por vuestro bien que a nadie se le haya ocurrido guardar un fichero xml con una serie de datos que vayas a necesitar en un blob... pero si a alguno de vuestros compañeros le ha poseido Satán y ha hecho tan atroz fechoría os dejo una forma de obtener dichos datos.

Supongamos que tenemos una tabla_del_demonio con un id y un campo_blob. Para el id 1816 dentro del campo blob guardas un fichero xml de este tipo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes xmlns="http://www.sat.an/attributes/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ns3="http://www.sat.an/attributes/trabajadores/1.0">
    <trabajador>
        <nombre>Daniel</nombre>
        <apellido1>Garcia</apellido1>
        <apellido2>Fernandez</apellido2>
        <ns3:dni>123456789B</ns3:dni>
    </specificData>
</attributes>

Para quedarnos con el valor del dni habría que hacer lo siguiente:

select extractvalue(X.XML, '/attributes/trabajador/ns3:dni', 'xmlns="http://www.sat.an/attributes/1.0" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:ns3="http://www.sat.an/attributes/trabajadores/1.0"')
from (select XMLType(campo_blob,178) XML
  from tabla_del_demonio
  where id=1816) X;

viernes, 20 de diciembre de 2013

Transformar Clob a Varchar2 en Oracle

Muchas veces te encuentras por misterios de la naturaleza que nadie comprende que en una tabla se está guardando un string de pequeñas dimensiones en un clob.

Si necesitas hacer alguna búsqueda con él, la manera más sencilla es la siguiente:
select * from tabla_misteriosa t where dbms_lob.substr(t.campo_clob,length(t.campo_clob),1) = 'abcdefg';

Si lo que hay dentro del campo_clob tiene un tamaño menor de 4000 caracteres no tendrás ningún problema; pero si es mayor y menor de 32767 caracteres todavía te queda otro camino relativamente facil: usar pl/sql en vez de sql

declare
   ristra varchar2;
begin
   for t in ( select * from tabla_misteriosa )
   loop
       ristra  := dbms_lob.substr( t.campo_clob, length(t.campo_clob), 1 );
       -- Via libre a lo que quieras hacer con ristra

miércoles, 18 de diciembre de 2013

Eclipse ERROR: No generator named “xxx” is defined in the persistence unit

Usando Eclipse con las herramientas de Hibernate te puede salir el error "No generator named “xxx” is defined in the persistence" unit a la hora de usar @GenericGenerator sin que realmente haya dicho error debido a un bug.

Ejemplo:
@Id
@GeneratedValue(generator = “informeGenerator“)
@GenericGenerator(name = “informeGenerator“, strategy = “foreign”, parameters = { @Parameter(name = “property”, value = “informeId”) })
public String getId() {
    return id;
}

En el ejemplo anterior Eclipse te marcará un error en la línea
@GeneratedValue(generator = “informeGenerator“)
indicando No generator named “informeGenerator” is defined in the persistence unit

Actualmente no hay una solución limpia a este bug, pero si quieres que no te moleste puedes desactivarlo desde la opción de menú Preferences -> Java Persistence -> JPA -> Error/Warnings
y marcar Generator is not defined in the persistence unit con Warning.