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

Duda Con Array

Estas en el tema de Duda Con Array en el foro de PostgreSQL en Foros del Web. Hola amigos Tengo el siguiente codigo @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE OR REPLACE FUNCTION VehiculosFinalizados ( IDTaller CHARACTER VARYING ) RETURNS INTEGER AS ...
  #1 (permalink)  
Antiguo 09/09/2010, 11:11
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Duda Con Array

Hola amigos
Tengo el siguiente codigo

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION VehiculosFinalizados(IDTaller CHARACTER VARYING)RETURNS INTEGER AS $$
  2. DECLARE
  3.     IDVeh INTEGER [];
  4.     IDVehiculo INTEGER = 0;
  5.     NumTareas  INTEGER = 0;
  6.     TareasFinalizadas INTEGER = 0;
  7.     finalizados INTEGER = 0;
  8. BEGIN
  9.     SELECT INTO IDVeh id_vehiculo FROM vehiculos,locales WHERE vehiculos.id_local = locales.id_local AND id_estado = 14
  10.     AND id_taller = ''||IDTaller||'';
  11.     FOR i IN 1 .. array_length(IDVeh, 1)LOOP
  12.         IDVehiculo:= IDVeh;
  13.         SELECT INTO NumTareas COUNT(id_tarea) FROM tareas WHERE id_vehiculo = IDVehiculo;
  14.         IF NumTareas > 0 THEN
  15.             SELECT INTO TareasFinalizadas COUNT(id_tarea) FROM TAREAS WHERE finalizada = 1 AND id_vehiculo = IDVehiculo;
  16.             IF NumTareas = TareasFinalizadas THEN
  17.                 finalizados:= finalizados + 1;
  18.             END IF;
  19.         END IF;
  20.     END LOOP;
  21.     RETURN finalizados;
  22. END;
  23. $$
  24. LANGUAGE 'plpgsql';

y me da este error


Cita:
ERROR: array value must start with "{" or dimension information
CONTEXT: PL/pgSQL function "vehiculosfinalizados" line 8 at SQL statement

********** Error **********

ERROR: array value must start with "{" or dimension information
Estado SQL:22P02
Contexto:PL/pgSQL function "vehiculosfinalizados" line 8 at SQL statement
Alguien sabe por que da ese error y como arreglarlo?
  #2 (permalink)  
Antiguo 09/09/2010, 12:09
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Duda Con Array

el campo id_vehiculo en la tabla de que tipo es?
Para que lo quieres volvar en un array?

pareciera que ese es el error.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/09/2010, 12:45
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: Duda Con Array

Cita:
Iniciado por huesos52 Ver Mensaje
el campo id_vehiculo en la tabla de que tipo es?
Para que lo quieres volvar en un array?

pareciera que ese es el error.

saludos
es de tipo integer, es que es una lista de de valores que va a devolver la query segun la condicion entonces al guardar esos IDs despues quiero preguntar por ellos en las consultas que siguen, por ejemplo


SELECT id_vehiculo FROM vehiculos,locales WHERE vehiculos.id_local = locales.id_local AND id_estado = 14 AND id_taller = '1234';

resultados id_vehiculo
1
2
3
4

despues quiero preguntar asi en cada vuelta que de el for
vuelta 1
SELECT COUNT(id_tarea) FROM tareas WHERE id_vehiculo = 1
vuelta 2
SELECT COUNT(id_tarea) FROM tareas WHERE id_vehiculo = 2
.........
  #4 (permalink)  
Antiguo 09/09/2010, 12:57
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Duda Con Array

death_nemesis
te explico mas o menos como afrontar el problema, ya que lo que tratas de hacer no se puede.

Debes recurrir a los cursores y en vez de recorrer en un for las posiciones del vector, debes recorrer el cursor y usar cada valor.

sería algo así:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION ejemplo()
  2.   RETURNS text AS
  3. $BODY$
  4. DECLARE
  5. cur CURSOR FOR SELECT campo FROM tabla;
  6. BEGIN
  7. OPEN cur;
  8. WHILE found LOOP
  9.     FETCH cur INTO variable;
  10.         SELECT COUNT(*) FROM tabla WHERE valor=variable;
  11. END LOOP;
  12. CLOSE cur;
  13. RETURN 'listo';
  14. END;
  15. $BODY$
  16.   LANGUAGE 'plpgsql' VOLATILE

revisa bien la documentación de cursores.

espero haberte ayudado
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 10/09/2010, 07:28
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: Duda Con Array

vale huesos52 al final me sirvio tu recomendacion y el codigo quedo asi

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION vehiculosfinalizados(idtaller CHARACTER VARYING)
  2.   RETURNS INTEGER AS
  3. $BODY$
  4. DECLARE
  5.     IDVehi  CURSOR FOR SELECT id_vehiculo FROM vehiculos,locales WHERE vehiculos.id_local = locales.id_local AND id_estado = 14 AND id_taller = ''||IDTaller||'';
  6.     IDVehiculo INTEGER = 0;
  7.     NumTareas  INTEGER = 0;
  8.     TareasFinalizadas INTEGER = 0;
  9.     finalizados INTEGER = 0;
  10. BEGIN
  11.     OPEN IDVehi;
  12.     FETCH IDVehi INTO IDVehiculo;  
  13.     WHILE (found) LOOP     
  14.         SELECT INTO NumTareas COUNT(id_tarea) FROM tareas WHERE id_vehiculo = IDVehiculo;
  15.         IF NumTareas > 0 THEN
  16.             SELECT INTO TareasFinalizadas COUNT(id_tarea) FROM TAREAS WHERE finalizada = 1 AND id_vehiculo = IDVehiculo;       
  17.             IF NumTareas = TareasFinalizadas THEN          
  18.                 finalizados:= finalizados + 1;
  19.             END IF;
  20.         END IF;
  21.         FETCH IDVehi INTO IDVehiculo;
  22.     END LOOP;
  23.     CLOSE IDVehi;
  24.     RETURN finalizados;
  25. END;
  26. $BODY$
  27.   LANGUAGE 'plpgsql';
  #6 (permalink)  
Antiguo 10/09/2010, 07:41
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Duda Con Array



death_nemesis para funciones que retornan varios registros los cursores explicitos (Los que haz aplicado) son supremamente eficientes. cuando utilizas una variable y la volcas con la palabra INTO directamente de la consulta se le conocen como cursores implicitos. Hace unos años estaba reacio a aprender el tema de cursores y siempre me valía de las variables record y los cursores implicitos para recorrer mis registros. En una aplicaión que hice en su momento mejoré el rendimiento de 5 minutos que tardaba con cursores implicitos a 15 segundos utilizando cursores explicitos.

vale la pena profundizar el tema

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: Ninguno
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 15:49.