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

Crear Procedimiento Almacenado

Estas en el tema de Crear Procedimiento Almacenado en el foro de PostgreSQL en Foros del Web. Les comento mi problema, miren tengo una tabla de ciudades y sus respectivos datos , mas o menos de la siguiente manera. ID_CIUDAD ANO VAL1 ...
  #1 (permalink)  
Antiguo 23/06/2008, 16:24
 
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años, 10 meses
Puntos: 2
Crear Procedimiento Almacenado

Les comento mi problema, miren tengo una tabla de ciudades y sus respectivos datos , mas o menos de la siguiente manera.

ID_CIUDAD ANO VAL1 VAL2 VAL3 VAL4 . . . VAL(N)
1 2002 3 6 0 'NULL' . . . .
1 2004 0 'NULL' 'NULL' 'NULL' . . . .

la idea es actualizar los datos del 2004 para que tome la siguiente secuencia
1 2004 0 6 0 'NULL' . . . .

cada que aparezca un NULL en cualquier campo del año 2004, de la ciudad 1, este campo deberia de copiar del año 2002

ya cree un PA, pero no se cual es mi problemilla, haber si me ayudan con esto,

create function ronald(character) returns integer as $$
declare
valor2004 float;
valor2002 float;
valores tipo001;
flag float;
val float;
CamposTabla NameCampo;
NCampo character;
BEGIN
FOR valores IN SELECT DISTINCT(id) FROM humano ORDER BY id ASC LOOP
SELECT valora INTO valor2002 FROM humano WHERE year = 2002 AND id = valores.tipo001_01;
SELECT valora INTO valor2004 FROM humano WHERE year = 2004 AND id = valores.tipo001_01;
IF valor2004 IS NULL THEN
UPDATE humano SET valora = valor2002 WHERE year = 2004 AND id = valores.tipo001_01;
END IF;
IF (valor2004 = 0) THEN
UPDATE humano SET valora = valor2002 WHERE year = 2004 AND id = valores.tipo001_01;
END IF;
END LOOP;

RETURN 0;

END;
$$
LANGUAGE plpgsql;

el detalle es que solo funciona para el campo valora, la idea es hacerlo un PA que lea todos los campos a su vez
  #2 (permalink)  
Antiguo 24/06/2008, 02:05
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: Crear Procedimiento Almacenado

En information_schema.columns tienes las columnas de las tablas, con esto puedes hacerlo generico para todos los campos de la tabla.

De todas formas, todo el procedimiento que tienes ahora mismo es innecesario, se puede hacer todo con un UPDATE.

Salu2
  #3 (permalink)  
Antiguo 24/06/2008, 12:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Crear Procedimiento Almacenado

Como nada sé de store procedures, te pongo una consulta de actualización que creo que lo hace:
update ciudades c1, ciudades c2 SET c1.VAL1 = IF(c1.val1 is null or c1.val1 = 0, c2.val1, c1.val1), c1.VAL2 = IF(c1.val2 is null or c1.val2 = 0, c2.val2, c1.val2) WHERE c1.ANO = 2004 AND c2.ANO = 2002 AND c1.id_ciudad = c2.id_ciudad

Te he puesto valor null y 0, porque al borrar un número queda 0 y no null, aunque al principio si no se ha escrito nada tengas null. Y sólo te he incluido la sintaxis para VAL1 y VAL2
No sé si tendrá buen rendimiento. La he probado con pocos datos, pero creo que funciona. Esto va en la línea de lo que te decía seyko.

PERDÓN: te he puesto sintaxis mysql. Tendrás que adaptar los IF a POSGRESQL, que no sé si es escriben igual.

Última edición por jurena; 24/06/2008 a las 23:50
  #4 (permalink)  
Antiguo 25/06/2008, 11:18
 
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 73
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Crear Procedimiento Almacenado

BUeno gracias de todas maneras por el ejemplo, el detalle esta en que como puedo hacer para recorrer automaticamente los campos de mi tabla, que dicho sea de paso son como 700 campos aprox, y la tabla tiene 100000 registros, espero me puedas ayudar con eso, claro que usando el update que mencionan
  #5 (permalink)  
Antiguo 25/06/2008, 11:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Crear Procedimiento Almacenado

Los nombres de los 700 campos puedes cargarlos mediante esta consulta:

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'nombretabla'

Luego con ese array de datos puedes servirte de programción, pero, como te digo, yo no trabajo con PostgreSQL.
  #6 (permalink)  
Antiguo 26/06/2008, 01:10
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Respuesta: Crear Procedimiento Almacenado

rquilca, ya te conteste sobre el tema antes, pero te detallo un poco más como lo haría yo.

Dentro de una funcion PLpgsql, en una variable text y recorriendo un cursor con (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'nombretabla')
vas construyendo el UPDATE que quieres lanzar (cuidado con el escape de 'comillas' dentro de la variable).
Al final tienes el UPDATE completo que puedes ejecutar con EXECUTE variable_texto;


Salu2
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 18:47.