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

Sustituir datos en el SELECT de una Funcion

Estas en el tema de Sustituir datos en el SELECT de una Funcion en el foro de PostgreSQL en Foros del Web. Hola compañeros, buenas las tengan y mejor las pasen!! Este es mi primer post en la pagina que me ha ayudado bastante en otras ocasiones ...
  #1 (permalink)  
Antiguo 03/06/2011, 11:37
Avatar de manuelpsx  
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Sustituir datos en el SELECT de una Funcion

Hola compañeros, buenas las tengan y mejor las pasen!! Este es mi primer post en la pagina que me ha ayudado bastante en otras ocasiones al googlear mi problema y llegar a forosdelweb.com Espero aprender mucho y compartir lo que se cuando sea de utilidad.

Luego de la breve introducción quiero plantearles mi problemita y ver si alguien me puede orientar un poco, es sobre postgres lenguaje que apenas voy trabajando y si bien no es difícil hay cosas que como cualquier novato se me pasan o simplemente no las se.

Tengo una función que me hace un SELECT a varios campos de diferentes tablas y me devuelve el resultado del query, hasta ahí funciona perfectamente ahora lo que necesito es sustituir algunos valores de dos campos en especial. Les pongo mi función y después continuo detallando..

Código:
CREATE OR REPLACE FUNCTION obtenerreporte()
  RETURNS SETOF tdatos AS
$BODY$

DECLARE 
	linea tDatos;

BEGIN
	FOR linea IN
	SELECT 
	tr.fecha_emision,
	es.nombre,
	m.nombre,
	e.medio,
	c.nombre,
	c.siglas,
	tr.tiempo_inicio,
	tr.tiempo_fin,
	tr.tiempo_fin - tr.tiempo_inicio,
	te.nombre,
	tr.contenido,
	tr.calificacion 
	FROM transcripcion AS tr
	INNER JOIN transcripcion_ubicacion AS tu ON (tr.id = tu.transcripcion)
	INNER JOIN estado AS es ON (tu.estado = es.id)
	INNER JOIN municipio AS m ON (tu.municipios = m.id)
	INNER JOIN emisora AS e ON (tr.emisora = e.id)
	INNER JOIN canal AS c ON (tr.canal = c.id)
	INNER JOIN transcripcion_tema AS tt ON (tr.id = tt.transcripcion)
	INNER JOIN tema AS te ON (tt.tema = te.id)
	ORDER BY tr.fecha_emision DESC

	LOOP
	
	RETURN NEXT linea;

	END LOOP;

	--UPDATE linea SET linea.medio = 'RADIO' WHERE lista.medio = '1';
	--UPDATE linea SET linea.medio = 'TELEVISION' WHERE lista.medio = '2';
	--UPDATE linea SET linea.medio = 'PRENSA ESCRITA' WHERE lista.medio = '3';

	END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION obtenerreporte() OWNER TO postgres;
Bien pues lo que trato es cambiar los valores en mi campo linea.medio, este campo siempre me traerá ya sea un 1 o un 2 o un 3, quiero reemplazar esos números y que me aparezca la palabra RADIO si es 1, la palabra TELEVISION si trae un 2 o que diga PRENSA ESCRITA si contiene un 3.

Al final del LOOP pueden ver que tengo comentados unos UPDATE es porque ya probé utilizando ese comando y me genera un error, cabe destacar que eh intentado poner los UPDATE dentro del LOOP antes y después del RETURN pero siempre me marca el mismo error. Aquí se los muestro..

Código:
ERROR:  error de sintaxis en o cerca de «$1»
LÍNEA 1: UPDATE  $1  SET  $2  = 'RADIO' WHERE lista.medio = '1'
                 ^
CONSULTA:  UPDATE  $1  SET  $2  = 'RADIO' WHERE lista.medio = '1'
CONTEXTO:  SQL statement in PL/PgSQL function "obtenerreporte" near line 41

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

ERROR: error de sintaxis en o cerca de «$1»
SQL state: 42601
Context: SQL statement in PL/PgSQL function "obtenerreporte" near line 41
Si alguien me pudiera orientar o ayudar con este problema le agradeceré bastante, tal vez lo estoy haciendo mal y ya no puedo modificar esa tabla, cualquier sugerencia es bienvenida, espero haber sido claro o si les queda alguna duda preguntenme para dejar mas claro mi problema. Gracias y un saludo a todos el foro es excelente.
  #2 (permalink)  
Antiguo 03/06/2011, 13:03
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: Sustituir datos en el SELECT de una Funcion

Siempre me dió muy duro esta forma de devolver valores. Y mas que al ser linea una variable tipo de registro no se le pueden aplicar tecnicas SQL al resultado.

Si trabajas con una versión superir a 8.3 te recomiendo la función RETURN_QUERY.
De esta forma si puedes hacer uso de CASE en la columna medio para la salida que esperas.

Si no te da... te sugiero crear una vista de la consulta y simplemente que linea sea de tipo de la vista que construiste.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 06/06/2011, 11:23
Avatar de manuelpsx  
Fecha de Ingreso: junio-2011
Mensajes: 2
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Sustituir datos en el SELECT de una Funcion

Muchas gracias huesos52 una disculpa no haber entrado antes pero se atravesó el fin y no pude realizar pruebas hasta hoy.

Me funciono bastante eso de utilizar el RETURN QUERY, ya que manejo la versión 8.4 de postgres y de esta forma pude resolver lo que quería. Por si alguien le sirve lo que hice fue cargar una tabla temporal con mi select, sobre esta tabla aplique los updates y después regrese su contenido. Que muy bien, gracias nuevamente por la ayuda.

Seguimos por acá en contacto..

Etiquetas: funcion, select, sustituir
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 08:13.