Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/03/2010, 14:04
Avatar de 8vio
8vio
 
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: funcion que devuelva un array ó un tipo record

Hola,

A ver si entiendo, tienes un string con varios vuelos o data y quieres sacar un valor o una cantidad de valores segun un separador ejm (;)

yo para esos casos utilizo esta funcion:

Código:
FUNCTION GetToken(stringvalues  VARCHAR2,
                  indice        NUMBER,
                  delim         VARCHAR2 
                 )
RETURN VARCHAR2
   
IS

   start_pos NUMBER; -- Posición inicial de cada substring
   end_pos   NUMBER; -- Posición final de cada substring
   
BEGIN

   -- Si el primer indice es uno
   IF indice = 1 THEN
   
         start_pos := 1; -- La posición inicial sera 1
       
   ELSE
       
         /* Se calcula la posición del delimitador segun el substring que se desea conseguir  */
         /*             Ejm: 12;13;  Se desea el inidice 2 del delim ; --> start_pos=3        */
        
         start_pos := instr(stringvalues, delim, 1, indice - 1);
         
         -- Si la posicion inicial es 0 se retorna null
         IF start_pos = 0 THEN
         
             RETURN NULL;
             
         ELSE
         
             -- Se calcula la posición inicial del substring sin importar el largo del delimitador
             start_pos := start_pos + length(delim);
             
         END IF;
       
   END IF;

   -- Se calcula la posición final del substring 
   end_pos := instr(stringvalues, delim, start_pos, 1);

   IF end_pos = 0 THEN -- Se retorna el ultimo valor del arreglo
   
         RETURN substr(stringvalues, start_pos);
       
   ELSE -- Se retorna el valor del arreglo segun el inidice y delim indicado
   
         RETURN substr(stringvalues, start_pos, end_pos - start_pos);
       
   END IF;

END GetToken;
En ella pasas el delimitador ejm ; y el valor de coincidencia que quieres, por ejm el primero valor antes de un ;---> indice=1 delim=; stringvalues= string de caracteres.

Si son varios.... facil, cuenta la cantidad de delim que existen

Código:
SELECT length(stringvalues) - length(REPLACE(stringvalues,';'))                
                  INTO count
                  FROM dual;
y luego llamas al gettoken tantos delim existan y vas incrementando con un contador, usando ese mismo contador vas guardando cada valor en tu variable de salida tipo tabla

Código:
salida(cont):=GetTokenGetToken('11;12;',cont,';');
recuerda declarar primero que nada el tipo tabla

Código:
TYPE tstring IS TABLE OF VARCHAR2(30)
             INDEX BY BINARY_INTEGER;


Para leer los valores con un simple loop tienes


Código:
 FOR i IN 1 .. salida.LAST  LOOP  


-- Ves que haces con los resultados

END LOOP;

Saludos y suerte,