Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

funcion que devuelva un array ó un tipo record

Estas en el tema de funcion que devuelva un array ó un tipo record en el foro de Oracle en Foros del Web. Buenos días a todos estoy intentando crear una función que me devuelva un array pero a la hora de tratarlo en el procedimiento o paquete ...
  #1 (permalink)  
Antiguo 02/03/2010, 03:53
 
Fecha de Ingreso: febrero-2008
Mensajes: 10
Antigüedad: 16 años, 9 meses
Puntos: 0
funcion que devuelva un array ó un tipo record

Buenos días a todos estoy intentando crear una función que me devuelva un array pero a la hora de tratarlo en el procedimiento o paquete no me está funcionando de un modo correcto. Gracias de antemano a tod@s.
FUNCTION CALCULA_VUELO (P_VUELO VARCHAR2,P_SEPARADOR VARCHAR2 DEFAULT ',') RETURN MAR_ARRAY_TYPE IS
/* DECLARACION DEL ARRAY DONDE QUEREMOS INTRODUCIR LOS VALORES */
RESULTADO_DEVUELTO MAR_ARRAY_TYPE:=MAR_ARRAY_TYPE();
/* STRINGS CON LOS QUE MANEJAMOS LA CADENA INICIAL */
R_VUELO VARCHAR(20);
DEFINI VARCHAR(20);
V_ELEMENT VARCHAR(4);
BEGIN
R_STRING:=P_STRING;
LOOP

DEFINI:= instr(R_VUELO,P_SEPARADOR );
EXIT WHEN (NVL(DEFINI,0)=0);
RESULTADO_DEVUELTO.EXTEND;
RESULTADO_DEVUELTO(RESULTADO_DEVUELTO.COUNT):=LTRI M(RTRIM(SUBSTR(R_VUELO,1,DEFINI-1)));
R_VUELO:= SUBSTR(R_VUELO,DEFINI+LENGTH(P_SEPARADOR));
V_ELEMENT:= RESULTADO_DEVUELTO(RESULTADO_DEVUELTO.COUNT);
END LOOP;
/* SI TODAVIA QUEDA EL ULTIMO ELEMENTO */
IF LENGTH(R_VUELO) > 0 THEN
RESULTADO_DEVUELTO.EXTEND;
RESULTADO_DEVUELTO(RESULTADO_DEVUELTO.COUNT):=R_VU ELO;
END IF;
RETURN RESULTADO_DEVUELTO;
EXCEPTION WHEN OTHERS THEN RETURN RESULTADO_DEVUELTO;
END CALCULA_VUELO;


esta es la función que me he definido como prueba pero quiero saber cuando la llame dentro del procedimiento cómo recuperar los valores y como pasar el vuelo como parámetro.
  #2 (permalink)  
Antiguo 02/03/2010, 14:04
Avatar de 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,

Etiquetas: funcion, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:58.