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

Problemas con el update helpppp

Estas en el tema de Problemas con el update helpppp en el foro de PostgreSQL en Foros del Web. Saludos de nuevo, aqui en lo mismo no puedo realizar el update y eso que estoy colocando solamente una instruccion en el update no estoy ...
  #1 (permalink)  
Antiguo 05/10/2009, 14:35
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Problemas con el update helpppp

Saludos de nuevo, aqui en lo mismo no puedo realizar el update y eso que estoy colocando solamente una instruccion en el update no estoy haciendo select ni nada de eso solo un update help..helppppppppppppppppppppppppppppp..... les muestro la parte del codigo...

-- Function: act_concepto(id_sede int4, id_concepto int4, concepto "varchar", descripcion "varchar", clase int4, tipo int4, status_convenio int4, afecta_prestaciones int4, afecta_utilidades int4, afecta_vacaciones int4, unidad int4, formula "varchar", afecta_liquidacion int4, afecta_sueldomensual int4, ingreso_mensual float8, vigente int4, asociado int4)

-- DROP FUNCTION act_concepto(id_sede int4, id_concepto int4, concepto "varchar", descripcion "varchar", clase int4, tipo int4, status_convenio int4, afecta_prestaciones int4, afecta_utilidades int4, afecta_vacaciones int4, unidad int4, formula "varchar", afecta_liquidacion int4, afecta_sueldomensual int4, ingreso_mensual float8, vigente int4, asociado int4);

CREATE OR REPLACE FUNCTION act_concepto1(idsede integer, idconcepto integer,clase integer)
RETURNS SETOF conceptos AS
$BODY$
DECLARE

fila conceptos%rowtype;
sql character varying;
BEGIN
sql = 'UPDATE CONCEPTOS SET idsede = idsede,
idconcepto = idconcepto,
clase = clase

WHERE idconcepto like ''%' || ltrim(rtrim(idconcepto)) || '%''';
execute sql;
FOR fila IN EXECUTE sql
LOOP
RETURN NEXT fila;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION act_concepto1(idsede integer, idconcepto integer,clase integer) OWNER TO postgres;

Nada mas estoy actualizando no estoy haciendo el select y cuando lo ejecuto me da el sigiente error::

ERROR: cannot open non-SELECT query as cursor
CONTEXT: PL/pgSQL function "act_concepto1" line 12 at for over execute statement


Si me pueden ayudar se lo agradeceria
  #2 (permalink)  
Antiguo 05/10/2009, 14:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problemas con el update helpppp

chimaria...
No es posible recorrer la variable sql que tiene un update con un for.

Si requieres hacer primero un update y luego consultarlo prueba algo como:
Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION act_concepto1(idsede INTEGER, idconcepto INTEGER,clase INTEGER)
  2. RETURNS SETOF conceptos AS
  3. $BODY$
  4. DECLARE
  5.  
  6. fila conceptos%rowtype;
  7. SQL CHARACTER VARYING;
  8. sql2 CHARACTER VARYING;
  9. BEGIN
  10. SQL = 'UPDATE CONCEPTOS SET idsede = idsede,
  11. idconcepto = idconcepto,
  12. clase    = clase
  13.  
  14. WHERE idconcepto like ''%' || ltrim(rtrim(idconcepto)) || '%''';
  15. EXECUTE SQL;
  16. sql2 = 'select *from CONCEPTOS WHERE idconcepto like ''%' || ltrim(rtrim(idconcepto)) || '%''';
  17.  
  18. FOR fila IN EXECUTE sql2
  19. LOOP
  20. RETURN NEXT fila;
  21. END LOOP;
  22. RETURN;
  23. END;
  24. $BODY$
  25. LANGUAGE 'plpgsql' VOLATILE;
  26. ALTER FUNCTION act_concepto1(idsede INTEGER, idconcepto INTEGER,clase INTEGER) OWNER TO postgres;

También deberías concatenar laS VARIABLES CLASE e idsede
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 05/10/2009, 15:21
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problemas con el update helpppp

Hola huesos mira sabes que copie el codigo no me da error cuando lo ejecuto perno no me actualiza y otra pregunta porwque concatenar las variables????
  #4 (permalink)  
Antiguo 05/10/2009, 15:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problemas con el update helpppp

chimaria... poco conozco9 de tu sistema y el objetivo de lo que quieres hacer.
En pocas paklabras, para hacer un retorno mediante set of es necesario ir recorriendo los valores de una consulta. No de una actualización.

Cita:
I think this is the easiest way to make this function work:
Drop the function
Change the function return type from "setof record" to "setof <table-name>"
("setof area" in this case)
Optionally, you may also like to change declaration "ret_row record;" to "ret_row area%rowtype;"
(it should work either way)
Recompile, and don't forget that functions returning setof must be called as
select * from func_name (...)
select func_name (...) will not work.
Tomado de http://bytes.com/topic/postgresql/an...-setof-plpgsql

Según este ejemplo que funciona, estas manejando bien las sentencias. Pero al tratar de hacer uso de la función execute, debes tener en cuenta, que las variables están dentro de una cadena y podrías tener errores al momento de ejecutarlo. En teoría no debería pasar, pero hace poco me dí cuenta que al hacer un execute, no se toman los verdaderos valores de entrada de una función sino que lo toma como texto.
Por el contrario, si haces lo mismo con las variables idsede a lo que haces con id_concepto, la cadena se creará limpia y se ejecutará satisfactoriamente.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 05/10/2009, 16:03
 
Fecha de Ingreso: marzo-2009
Mensajes: 121
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problemas con el update helpppp

Listo huesos gracias en la asignacion de las variables se lo coloque de esta forma

sql = 'UPDATE CONCEPTOS SET
idsede = idsede,
idconcepto = idconcepto,
clase =' || ltrim(rtrim(clase)) || '

WHERE idconcepto like ''%' || ltrim(rtrim(idconcepto)) || '%''';
y funciono muchas gracias
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 05:48.