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

Consultas en arrays en plsql

Estas en el tema de Consultas en arrays en plsql en el foro de Oracle en Foros del Web. Hola a todos. Queria dejar un comentario a ver si alguien me puede dar un poco de luz sobre el tema. Os comento: Tengo un ...
  #1 (permalink)  
Antiguo 15/04/2009, 01:10
 
Fecha de Ingreso: marzo-2008
Mensajes: 7
Antigüedad: 16 años, 1 mes
Puntos: 0
Consultas en arrays en plsql

Hola a todos.

Queria dejar un comentario a ver si alguien me puede dar un poco de luz sobre el tema. Os comento:

Tengo un array de numeros llamado ARRAY1 con estos datos (1,2,3,4,5,1,2,3)

Voy a generar una función que pasando un numero me valla rellenando un ARRAY2 con los numeros del ARRAY1 que no se repiten, es decir mi resultado en el arrya 2 deberia ser (1,2,3,4,5)

Mi problemas es que al pasar-consultar , por ejemplo , el número 1 sobre el ARRAY1 en el ARRAY2 me lo mete 2 veces.

¿Como podria evitar esto? ¿Existe alguna funcion de oracle que pasando un valor (number o varchar2) me diga si existe ese valor dentro de un array?

Gracias a todos de antemano.

Un saludo
  #2 (permalink)  
Antiguo 15/04/2009, 01:36
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Consultas en arrays en plsql

En forma nativa no existe ninguna función, lo que tienes que hacer es recorrer el array preguntando por cada uno de sus valores. Si esto es muy habitual, podrías crear tu propia funcion, por ejemplo.

Código:
....
FOR i IN mi_array.FIRST .. mi_array.LAST
LOOP
    IF mi_array(i) = 'VALOR_BUSCADO' THEN
      RETURN TRUE;
    END IF;
END LOOP;
....
Saludos
  #3 (permalink)  
Antiguo 15/04/2009, 03:32
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Consultas en arrays en plsql

Matanga, creo que eso no es del todo así ( si he entendido lo que pones tu y lo que pone el compañero y no se me ha ido la olla de mala manera )

Hay que recorrer el array 1 desde la primera posición +1 tantas veces como valores tiene el array 1. Es decir , cojes el valor de la posición 1 , lo almacenas en algún lado y buscas a partir de la 2. Si terminas de recorrerlo ( mi_array.LAST ) y no hay ninguna ocurrencia, lo metes en el array 2 y vuelta a empezar, pero cogiendo el valor de la posición 2, partir de la 1 e ignorar el valor de la dos y así hasta que leas el ultimo valor.

Creo que una funcion que haga llamadas recursivas o algo parecido te lo solucionaría
  #4 (permalink)  
Antiguo 15/04/2009, 03:50
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Consultas en arrays en plsql

La realidad es que estoy tan vago que solo estaba respondiendo a la pregunta..

Cita:
¿Existe alguna funcion de oracle que pasando un valor (number o varchar2) me diga si existe ese valor dentro de un array?
Todo lo demás lo leí muy por arriba :P

Saludos
  #5 (permalink)  
Antiguo 15/04/2009, 06:24
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Consultas en arrays en plsql

Y yo soy tan tocino, que he leido el enunciado y he saltado las preguntas...........

En cualquier caso, creo que con nuestros comentarios podrá solucionar su duda.

Saludos
  #6 (permalink)  
Antiguo 15/04/2009, 07:50
 
Fecha de Ingreso: marzo-2008
Mensajes: 7
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Consultas en arrays en plsql

Chicos daros las gracias por vuestras ayuda

Al final he generado la siguiente funcion con dos parametros el array con todos mis numeros y en numero que quiero buscar en el:

FUNCTION existen_numeros(numero1_varray IN numero1_array,
wsnumero2 IN NUMBER) RETURN NUMBER IS

v_numero NUMBER(14);

BEGIN

--(1,2,3,4,5,1,2,3)
FOR i IN numero1_varray.FIRST .. numero1_varray.LAST
LOOP

v_numero := numero1_varray(i);

IF v_numero = wsnumero2 THEN

RETURN(1); -- ESTA REPETIDO

ELSE

RETURN(0); -- NO ESTA REPETIDO

END IF;
END LOOP;

END existen_numeros;

me sigue fallando a si que voy a intentar meter un nuevo parametro out que sea un array de numeros que se vaya rellenado cuando v_numero <> wsnumero2 y a ver si en ese array de salida solo contiene los no repetidos. ya os contaré.

Gracias de nuevo
  #7 (permalink)  
Antiguo 15/04/2009, 20:42
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Consultas en arrays en plsql

Cita:
Iniciado por matanga Ver Mensaje
En forma nativa no existe ninguna función, lo que tienes que hacer es recorrer el array preguntando por cada uno de sus valores. Si esto es muy habitual, podrías crear tu propia funcion, por ejemplo.

Código:
....
FOR i IN mi_array.FIRST .. mi_array.LAST
LOOP
    IF mi_array(i) = 'VALOR_BUSCADO' THEN
      RETURN TRUE;
    END IF;
END LOOP;
....
Saludos
sabia que lo habia leido en algun lado, checate la funcion exists, el primer resultado de google que encontre es

http://www.devjoker.com/asp/ver_cont...o_contenido=59
__________________
Blogzote.com :-) Mi blog
  #8 (permalink)  
Antiguo 16/04/2009, 01:36
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Consultas en arrays en plsql

La función Exists confunde, es para ver si existe un subindice dentro de un array, pero no su valor, cosa que también podría haber desarrollado Oracle. La idea es evitar errores como index out of range, muy típico de los arrays.

Código:
IF ( my_array(i).exists ) THEN
  Hacer algo;
END IF;
Saludos

Pd, ¿que onda con el usuario alexluz? :)
  #9 (permalink)  
Antiguo 17/04/2009, 14:42
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Consultas en arrays en plsql

Cita:
Iniciado por matanga Ver Mensaje
La función Exists confunde, es para ver si existe un subindice dentro de un array, pero no su valor, cosa que también podría haber desarrollado Oracle. La idea es evitar errores como index out of range, muy típico de los arrays.

Código:
IF ( my_array(i).exists ) THEN
  Hacer algo;
END IF;
Saludos

Pd, ¿que onda con el usuario alexluz? :)

buen punto, voy a releer el tema, hasta ahorita no habia necesitado el exists y me fui con la primera

<sarcasmo>el usuario alexluz anda en un viaje y todavia no regresa</sarcasmo>
__________________
Blogzote.com :-) Mi blog
  #10 (permalink)  
Antiguo 27/04/2009, 03:57
 
Fecha de Ingreso: marzo-2008
Mensajes: 7
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Consultas en arrays en plsql

Hola a todos,

Os dejo mi solución final, seguro habrá maneras mejores de hacerlo pero por ahora a mi me ha funcionado.

No muestro toda mi función PLSQL pero si como he declarado y la solucion final.

Gracias a todos los que me habeis aportado algo de luz.

-- ZONA DE DECLARACION

DECLARE

v_numeros_varray numeros_array := numeros_array();
v_existe NUMBER;
v_count PLS_INTEGER;
k PLS_INTEGER;
p PLS_INTEGER;
v_numero NUMBER;--1,2,3,4,5,1,2,3

BEGIN

export_numeros_varray := export_numeros_array();

v_count := v_numeros_varray.count;

IF v_count = 0 THEN

k := k + 1;

v_numeros_varray.extend;
v_numeros_varray(k) := v_numero;

ELSE

-- funcion privada dentro de mi paquete PLSQL que comprueba que exista un determinado valor (numero) dentro de un array
-- de datos.

v_existe := existe_numero_array(v_numeros_varray, v_numero);

-- Código de la función privada

/*FUNCTION existe_numero_array(v_numeros_varray IN v_numeros_array,
v_numero IN NUMBER) RETURN NUMBER IS

v_idut NUMBER(14);
v_log VARCHAR2(2000);
v_existe NUMBER(1);

BEGIN

FOR i IN v_numeros_varray.FIRST .. v_numeros_varray.LAST
LOOP

v_valor := v_numeros_varray(i);

IF v_valor = v_numero THEN

RETURN(1); -- ESTA REPETIDO

ELSE

v_existe := 0;

END IF;
END LOOP;

IF v_existe = 0 THEN

RETURN(0); -- NO ESTA REPETIDO

END IF;

END existe_numero_array;*/

IF v_existe = 0 THEN

k := k + 1;

v_numeros_varray.extend;
v_numeros_varray(k) := v_numero;

END IF;

END IF;

-- Si no existe el valor en el array v_numeros_varray relleno otro array con los valores no repetidos.(1,2,3,4,5).

IF v_existe = 0 OR v_count = 0 THEN

p := p + 1;
export_numeros_varray.extend;
export_numeros_varray(p) := export_numeros_array(v_numero)(1);

END IF;

-- Como parametro de salida de mi funcion PLSQL es el array export_numeros_varray que contiene los valores no repetidos.

END; -- fin del bloque.
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 12:35.