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

Problemas para desarrollar una funcion

Estas en el tema de Problemas para desarrollar una funcion en el foro de PostgreSQL en Foros del Web. Hola amigos llevo todo el día intentando realizar una función que me haga lo siguiente: es algo como lo siguiente tengo una tabla con productos ...
  #1 (permalink)  
Antiguo 03/06/2009, 05:12
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Exclamación Problemas para desarrollar una funcion

Hola amigos llevo todo el día intentando realizar una función que me haga lo siguiente: es algo como lo siguiente tengo una tabla con productos y sus valores además del código del producto, ahora quiero hacer un update sumándoles 20 a los productos cuyos precios esten por debajo de 65 y además deseo saber cuales son los suministradores que de estos productos que se enlazan con dicha tabla a trabes de id_ suministrador espero entiendan.
  #2 (permalink)  
Antiguo 03/06/2009, 05:22
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: Problemas para desarrollar una funcion

Comparte lo que has hecho hasta el momento.
pon la función y en que parte te falla... así será mas facil para alguien ayudarte.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 03/06/2009, 05:43
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Problemas para desarrollar una funcion

bueno he intentado con esto.

CREATE OR REPLACE FUNCTION "public"."actualizar" (hora bigint) RETURNS boolean AS
$body$
DECLARE
hora ALIAS FOR $1;
BEGIN
UPDATE tipocomponente SET tipocomponente."Precio" = tipocomponente."Precio" + 20 WHERE tipocomponente."Maximo_horas_uso" >= hora;

END;
$body$
LANGUAGE 'plpgsql'

pero no me funciona, ni siquiera me actualiza los registros esta sería la primera parte después bueno vendría una segunda que es devolver los nombre de los usuarios
  #4 (permalink)  
Antiguo 03/06/2009, 06:31
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: Problemas para desarrollar una funcion

No te falta el return?
añade a la función return true;

Otra cosa que podrías mirar, es encerrar entre parentesis
SET tipocomponente."Precio" = (tipocomponente."Precio" + 20)

Y no estoy seguro si es necesario el ; despues de LANGUAGE 'plpgsql';
Yo lo pongo a todas mis funciones.

Todos los campos, están encerrados entre comillas?

el campo Maximo_horas_uso es un bigint? o es tipo time? recuerda que le estas pasando un bigint como parametro de entrada.

Cita:
hora ALIAS FOR $1;
Cuando se refiere al parametro $1, es por que no se sabe el nombre del campo que viene en la función, en este caso, esta sentencia es innecesaria. Tendría validez si la función estuviera declarada así:
CREATE OR REPLACE FUNCTION "public"."actualizar" (bigint) RETURNS boolean AS

En este caso, estas declarando una variable que ya existe y viene como parámetro.

Prueba todo esto y nos cuentas.

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

Última edición por huesos52; 03/06/2009 a las 07:16
  #5 (permalink)  
Antiguo 03/06/2009, 08:40
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Problemas para desarrollar una funcion

mira arregle lo que me dices ahora lo tengo así:


CREATE OR REPLACE FUNCTION "public"."actualizar" (hora bigint) RETURNS boolean AS
$body$
DECLARE

BEGIN
UPDATE tipocomponente SET tipocomponente."Precio" = (tipocomponente."Precio" + 20) WHERE tipocomponente."Maximo_horas_uso" >= hora;

END;
$body$
LANGUAGE 'plpgsql'


y me da el siguiente error cuando la ejecuto

ERROR: no existe la columna «tipocomponente» en la relación «tipocomponente» at character 27
QUERY: UPDATE tipocomponente SET tipocomponente."Precio" = (tipocomponente."Precio" + 20) WHERE tipocomponente."Maximo_horas_uso" >= $1
CONTEXT: PL/pgSQL function "actualizar" line 4 at SQL statement
  #6 (permalink)  
Antiguo 03/06/2009, 15:02
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: Problemas para desarrollar una funcion

Cita:
ERROR: no existe la columna «tipocomponente» en la relación «tipocomponente» at character 27
Si creas la función logueado en la base de datos, no es necesario anteceder el nombre de la base de datos en el llamado a las tablas ni campos. Ademas, cuando llamas a precio (supongo que es una columna) lo llamas como bd.campo... a que tabla pertenecería precios?? debería ser bd.tabla.campo... pero como te digo, esto no es necesario si estas conectado a la base de datos al momento de ejecutar la función.

Prueba y nos cuentas.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 03/06/2009, 15:08
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Problemas para desarrollar una funcion

mira probe de esta forma

CREATE OR REPLACE FUNCTION "public"."actualizar" (hora bigint) RETURNS boolean AS
$body$
DECLARE

BEGIN
UPDATE tipocomponente SET Precio = (Precio + 20) WHERE Maximo_horas_uso >= hora;

END;
$body$
LANGUAGE 'plpgsql'

y mira lo que me da

ERROR: no existe la columna «precio» at character 37
QUERY: UPDATE tipocomponente SET Precio = (Precio + 20) WHERE Maximo_horas_uso >= $1
CONTEXT: PL/pgSQL function "actualizar" line 4 at SQL statement
  #8 (permalink)  
Antiguo 03/06/2009, 15:31
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: Problemas para desarrollar una funcion

haz un

\d tipocomponente

Para ver que campos tiene tu tabla. El error dice que ese campo no existe.

Poco a poco, vamos solucionando esto.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 03/06/2009, 15:42
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Problemas para desarrollar una funcion

esta es mi tabla tipocomponente

CREATE TABLE "public"."tipocomponente" (
"ComponenteCod" CHAR(12) DEFAULT ''::bpchar NOT NULL,
"ComponenteDscrip" VARCHAR(50) DEFAULT ''::character varying NOT NULL,
"Maximo_horas_uso" BIGINT,
"Precio" NUMERIC,
"FabricanteCod" CHAR(10) DEFAULT ''::bpchar NOT NULL,
CONSTRAINT "tipocomponente_pkey" PRIMARY KEY("ComponenteCod"),
CONSTRAINT "tipocomponente_fk" FOREIGN KEY ("FabricanteCod")
REFERENCES "public"."fabricante"("FabricanteCod")
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
) WITHOUT OIDS;
  #10 (permalink)  
Antiguo 03/06/2009, 16:01
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: Problemas para desarrollar una funcion

Tu problema debe estar en como nombras las funciones y la llamada a campos.
Nunca he sido amigo de utilizar comillas en mis tablas, asi que ahí debe estar el problema.

Probé el codigo y me ha funcionado.

Código sql:
Ver original
  1. CREATE TABLE tipocomponente (
  2. ComponenteCod CHAR(12) DEFAULT ''::bpchar NOT NULL,
  3. ComponenteDscrip VARCHAR(50) DEFAULT ''::CHARACTER VARYING NOT NULL,
  4. Maximo_horas_uso BIGINT,
  5. Precio NUMERIC,
  6. FabricanteCod CHAR(10) DEFAULT ''::bpchar NOT NULL,
  7. CONSTRAINT tipocomponente_pkey PRIMARY KEY(ComponenteCod)
  8. ) WITHOUT OIDS;
  9.  
  10. INSERT INTO tipocomponente VALUES('cod1','desc1',12,25000,'codfab1');
  11. INSERT INTO tipocomponente VALUES('cod2','desc2',8,35000,'codfab2');
  12. INSERT INTO tipocomponente VALUES('cod3','desc3',15,15000,'codfab3');
  13.  
  14. CREATE OR REPLACE FUNCTION actualizar(hora BIGINT) RETURNS BOOLEAN AS
  15. $body$
  16. BEGIN
  17. UPDATE tipocomponente SET Precio = (Precio + 20) WHERE Maximo_horas_uso >= hora;
  18. RETURN TRUE;
  19. END;
  20. $body$
  21. LANGUAGE 'plpgsql'
  22.  
  23. SELECT actualizar(10);

Efectivamente, me actualiza el precio de los que tienen 12 y 15 horas sumandoles 20.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 03/06/2009, 16:10
Avatar de Osay  
Fecha de Ingreso: febrero-2005
Mensajes: 10
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: Problemas para desarrollar una funcion

Amigo al final dimos con el problema solo le agregué las comillas a Precio y a Maximo_horas_uso y wuala funcionó aqui dejo la respuesta por si a alguien algún día le pasa lo mismo muchas gracias huesos52; pero ahora viene la otra parte como puedo retornar el resultado de la unión de los campos afectados con otra tabla que se relaciona con esta y tiene el nombre de los fabricantes y los paises de los mismos


CREATE OR REPLACE FUNCTION "public"."actualizar" (hora bigint) RETURNS boolean AS
$body$
DECLARE

BEGIN
UPDATE tipocomponente SET "Precio" = ("Precio" + 20) WHERE "Maximo_horas_uso" >= hora;
return true;
END;
$body$
LANGUAGE 'plpgsql'

Última edición por Osay; 03/06/2009 a las 16:17 Razón: Agregar unas cosas
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 09:42.