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;
Resoluciones de bugs y expedientes X del día a día que aparecen en tu código cuando menos te lo esperas.
lunes, 23 de diciembre de 2013
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
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:
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.
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.
Suscribirse a:
Comentarios (Atom)