Discussion:
Problema con una funcion
Luis A. Zevallos Cárdenas
2009-05-21 14:04:45 UTC
Permalink
Hola a todos tengo un problema con una funcion alguien podria ayudarme:

FUNCION
****************************************************************************************************************
CREATE OR REPLACE FUNCTION sch_desarrollo.fn_size_tables()
RETURNS record AS
$BODY$DECLARE
reg RECORD;
BEGIN

--Tamaño de los objetos en megabytes
select into reg * from (SELECT relname, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;

return reg;
END;$BODY$
LANGUAGE 'plpgsql'
****************************************************************************************************************
select * FROM sch_desarrollo.fn_size_tables() --- CONSULTA

ERROR
*****************************************************************************************************************
ERROR: se requiere una lista de definición de columnas para funciones que
retornan «record»

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

ERROR: se requiere una lista de definición de columnas para funciones que
retornan «record»
Estado SQL:42601
*****************************************************************************************************************

Gracias
--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com
Jose Luis Balle
2009-05-21 14:11:41 UTC
Permalink
Solo google y Alvaro a la cabeza. Que bueno tener este tipo en la comunidad.
Fijate si esto te sirve:
http://markmail.org/message/txedjvxjsfs3q4xy

El 21 de mayo de 2009 11:04, Luis A. Zevallos Cárdenas <
Post by Luis A. Zevallos Cárdenas
se requiere una lista de definición de columnas para funciones que
retornan «record»
Gilberto Castillo Martínez
2009-05-21 14:22:09 UTC
Permalink
El jue, 21-05-2009 a las 09:04 -0500, Luis A. Zevallos Cárdenas
Post by Luis A. Zevallos Cárdenas
Hola a todos tengo un problema con una funcion alguien podria
El jue, 21-05-2009 a las 09:04 -0500, Luis A. Zevallos Cárdenas
Post by Luis A. Zevallos Cárdenas
Hola a todos tengo un problema con una funcion alguien podria
Sustituye tu SELECT por este.

SELECT MB into reg from (SELECT relname, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;

Select * from reg;

0.39
0.31
0.29
0.26
0.22
0.20
0.20
0.14
0.13
--
Saludos,
Gilberto Castillo
Edificio Beijing. Miramar Trade Center. Etecsa.
Miramar, La Haban.Cuba.

--
TIP 7: no olvides aumentar la configuraci�n del "free space map"
Luis A. Zevallos Cárdenas
2009-05-21 14:34:42 UTC
Permalink
gracias por responder pero necesito que me sirva la funcion

select * FROM sch_desarrollo.fn_size_tables()


El 21 de mayo de 2009 9:22, Gilberto Castillo Martínez <
Post by Gilberto Castillo Martínez
El jue, 21-05-2009 a las 09:04 -0500, Luis A. Zevallos Cárdenas
El jue, 21-05-2009 a las 09:04 -0500, Luis A. Zevallos Cárdenas
Sustituye tu SELECT por este.
SELECT MB into reg from (SELECT relname, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;
Select * from reg;
0.39
0.31
0.29
0.26
0.22
0.20
0.20
0.14
0.13
--
Saludos,
Gilberto Castillo
Edificio Beijing. Miramar Trade Center. Etecsa.
Miramar, La Haban.Cuba.
--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com
Gilberto Castillo Martínez
2009-05-21 14:44:23 UTC
Permalink
El jue, 21-05-2009 a las 09:34 -0500, Luis A. Zevallos Cárdenas
Post by Luis A. Zevallos Cárdenas
gracias por responder pero necesito que me sirva la funcion
select * FROM sch_desarrollo.fn_size_tables()
Tu función quedaría así:

REATE OR REPLACE FUNCTION fn_size_tables()
RETURNS record AS
$BODY$DECLARE
reg RECORD;
BEGIN

--Tamaño de los objetos en megabytes
select MB into reg from (SELECT relname, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;

return reg;
END;$BODY$
LANGUAGE 'plpgsql'
****************************************************************************************************************
select fn_size_tables() --- CONSULTA

o así,

CREATE OR REPLACE FUNCTION fn_size_tables()
RETURNS record AS
$BODY$DECLARE
reg RECORD;
BEGIN

--Tamaño de los objetos en megabytes
select relname, MB into reg from (SELECT relname,
round(((relpages*8)::double precision/1024::double
precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;

return reg;
END;$BODY$
LANGUAGE 'plpgsql'
****************************************************************************************************************
select fn_size_tables() --- CONSULTA

"(0.39,pg_proc)"

Pero puede ser que desees implementar otra cosa y no es devolviendo un
record como se logra .... prueba SETOF ... algo
--
Saludos,
Gilberto Castillo
Edificio Beijing. Miramar Trade Center. Etecsa.
Miramar, La Haban.Cuba.

--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
Emanuel Calvo Franco
2009-05-21 16:10:23 UTC
Permalink
El día 21 de mayo de 2009 11:04, Luis A. Zevallos Cárdenas
Post by Luis A. Zevallos Cárdenas
FUNCION
****************************************************************************************************************
 CREATE OR REPLACE FUNCTION sch_desarrollo.fn_size_tables()
 RETURNS record AS
 $BODY$DECLARE
 reg RECORD;
 BEGIN
--Tamaño de los objetos en megabytes
select into reg * from (SELECT relname, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as MB
FROM pg_class
ORDER BY relpages DESC) as foo;
 return reg;
 END;$BODY$
 LANGUAGE 'plpgsql'
****************************************************************************************************************
 select *  FROM sch_desarrollo.fn_size_tables() --- CONSULTA
ERROR
*****************************************************************************************************************
ERROR:  se requiere una lista de definición de columnas para funciones que
retornan «record»
********** Error **********
ERROR: se requiere una lista de definición de columnas para funciones que
retornan «record»
Estado SQL:42601
*****************************************************************************************************************
Gracias
Esa consulta esta tratando de retornar un SET OF no un record.
Inclusive podrías retornar directamente la consulta en vez de utilizar un into.
--
Emanuel Calvo Franco
Sumate al ARPUG !
( www.arpug.com.ar)
ArPUG / AOSUG Member
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
Jaime Casanova
2009-05-21 18:08:54 UTC
Permalink
Post by Luis A. Zevallos Cárdenas
 select *  FROM sch_desarrollo.fn_size_tables() --- CONSULTA
ERROR
*****************************************************************************************************************
ERROR:  se requiere una lista de definición de columnas para funciones que
retornan «record»
Debes indicarle a postgres cuantas y de que tipo son las columnas que
se regresan en el record, eso lo puedes hacer al momento de ejecutar
el select haciendo algo como:

select * FROM sch_desarrollo.fn_size_tables() AS (col1 tipodato1 [,
col2 tipodato2, ...])

o bien al definir la funcion usando parametros OUT

CREATE FUNCTION fn_size_tables(OUT col1 tipodato1 [, OUT col2
tipodato2, ...]) RETURNS RECORD AS ...

si escoges la segunda forma la manera de invocar tu select no cambia a
lo que tienes ahora...
--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157
--
TIP 1: para suscribirte y desuscribirte, visita http://archives.postgresql.org/pgsql-es-ayuda
Luis A. Zevallos Cárdenas
2009-05-21 19:28:51 UTC
Permalink
Muchas gracias a todos
lo resolvi asi:

drop FUNCTION sch_clinica.fn_size_tables();
CREATE OR REPLACE FUNCTION sch_clinica.fn_size_tables(out nombre_objeto
text, out tamano_mg numeric)
RETURNS
SETOF
RECORD
AS
$body$
DECLARE
rec record;
BEGIN
FOR rec IN (
SELECT relname as nombre, round(((relpages*8)::double
precision/1024::double precision)::numeric,2) as campo2
FROM pg_class
ORDER BY relpages DESC)
LOOP
nombre_objeto:=rec.nombre;
tamano_mg:=rec.campo2;
RETURN NEXT;
END LOOP;
RETURN;
END;
$body$
LANGUAGE 'plpgsql';

select * from sch_clinica.fn_size_tables();

Gracias y saludos.

El 21 de mayo de 2009 13:08, Jaime Casanova
Post by Luis A. Zevallos Cárdenas
Post by Luis A. Zevallos Cárdenas
select * FROM sch_desarrollo.fn_size_tables() --- CONSULTA
ERROR
*****************************************************************************************************************
Post by Luis A. Zevallos Cárdenas
ERROR: se requiere una lista de definición de columnas para funciones
que
Post by Luis A. Zevallos Cárdenas
retornan «record»
Debes indicarle a postgres cuantas y de que tipo son las columnas que
se regresan en el record, eso lo puedes hacer al momento de ejecutar
select * FROM sch_desarrollo.fn_size_tables() AS (col1 tipodato1 [,
col2 tipodato2, ...])
o bien al definir la funcion usando parametros OUT
CREATE FUNCTION fn_size_tables(OUT col1 tipodato1 [, OUT col2
tipodato2, ...]) RETURNS RECORD AS ...
si escoges la segunda forma la manera de invocar tu select no cambia a
lo que tienes ahora...
--
Atentamente,
Jaime Casanova
Soporte y capacitación de PostgreSQL
Asesoría y desarrollo de sistemas
Guayaquil - Ecuador
Cel. +59387171157
--
Luis Zevallos
DBA Administrador de DB & SRVR
Lobo Sistemas S.A.C
tel: +5154958310833
http://www.lobosistemas.com
Continúe leyendo en narkive:
Loading...