Cada día me sigo sorprendiendo más y más del género humano.
Hoy me he encontrado con la necesidad de obtener un listado de dnis que vienen guardados en un clob para luego tener que recorrerlos para quedarme con los ids a los que corresponden dichos dnis.
La solución más limpia que he encontrado ha sido la siguiente:
DECLARE
dnis apex_application_global.vc_arr2;
persona_id number;
BEGIN
dnis := apex_util.string_to_table(dbms_lob.substr(:NEW.LISTADO,length(:NEW.LISTADO),1), ', ');
FOR i IN 1..dnis.count LOOP
SELECT id INTO persona_id FROM persona WHERE dnis(i) = dni;
END LOOP;
END;
Cuidado porque si el clob (:NEW.LISTADO) tiene mas de 4000 caracteres va a dar error en la función dbms_lob.substr (que pasa un clob a un varchar2). Como en mi caso se que no va a ser nunca tan grande no me he preocupado pero si no habría que evitarlo (próximamente en sus pantallas...).
Si lo usas dentro de una function o procedure entonces podrías guardar hasta 32767 caracteres en un varchar2.
La gracia del asunto es usar las librerias de apex que metieron en oracle 10, usando por un lado los vectores (apex_application_global.vc_arr2) y por otro lado apex_util.string_to_table que pasa un string a vector indicándole un separador (en mi caso era la ',').
No hay comentarios:
Publicar un comentario