Olá,

2009/12/21 Bruno Sales <[email protected]>

> Fala galera,
>  no sistema aqui, precisei criar uma stored procedure pra fazer um
> calculo, porem em varias colunas:
> ta tudo OK com o select, porém quando eu boto pra criar a procedure
> ele retorna o erro (veja abaixo do SQL)
> Stored procedure(Verificar abaixo):
>
>
> CREATE OR REPLACE FUNCTION social.soc_tx_mortalidadegeral_2000_2007_pa()
>  RETURNS double precision AS
> $BODY$
>
> SELECT distinct ((taxa_mortalidadegeral2000.num_masculino +
> taxa_mortalidadegeral2000.num_feminino +
> taxa_mortalidadegeral2000.num_ignorado) /
> populacao2000.populacao_total2000 * 1000::double precision) AS
> taxa_mortalidadegeral2000, ((taxa_mortalidadegeral2001.num_masculino +
> taxa_mortalidadegeral2001.num_feminino +
> taxa_mortalidadegeral2001.num_ignorado) /
> populacao2001.populacao_total2001 * 1000::double precision) AS
> taxa_mortalidadegeral2001, ((taxa_mortalidadegeral2002.num_masculino +
> taxa_mortalidadegeral2002.num_feminino +
> taxa_mortalidadegeral2002.num_ignorado) /
> populacao2002.populacao_total2002 * 1000::double precision) AS
> taxa_mortalidadegeral2002, ((taxa_mortalidadegeral2003.num_masculino +
> taxa_mortalidadegeral2003.num_feminino +
> taxa_mortalidadegeral2003.num_ignorado) /
> populacao2003.populacao_total2003 * 1000::double precision) AS
> taxa_mortalidadegeral2003, ((taxa_mortalidadegeral2004.num_masculino +
> taxa_mortalidadegeral2004.num_feminino +
> taxa_mortalidadegeral2004.num_ignorado) /
> populacao2004.populacao_total2004 * 1000::double precision) AS
> taxa_mortalidadegeral2004, ((taxa_mortalidadegeral2005.num_masculino +
> taxa_mortalidadegeral2005.num_feminino +
> taxa_mortalidadegeral2005.num_ignorado) /
> populacao2005.populacao_total2005 * 1000::double precision) AS
> taxa_mortalidadegeral2005, ((taxa_mortalidadegeral2006.num_masculino +
> taxa_mortalidadegeral2006.num_feminino +
> taxa_mortalidadegeral2006.num_ignorado) /
> populacao2006.populacao_total2006 * 1000::double precision) AS
> taxa_mortalidadegeral2006, ((taxa_mortalidadegeral2007.num_masculino +
> taxa_mortalidadegeral2007.num_feminino +
> taxa_mortalidadegeral2007.num_ignorado) /
> populacao2007.populacao_total2007 * 1000::double precision) AS
> taxa_mortalidadegeral2007
>   FROM ( SELECT soc_obitos_fxe_causas_2000.estado,
> sum(soc_obitos_fxe_causas_2000.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2000.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2000.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2000
>          GROUP BY soc_obitos_fxe_causas_2000.estado)
> taxa_mortalidadegeral2000, ( SELECT soc_obitos_fxe_causas_2001.estado,
> sum(soc_obitos_fxe_causas_2001.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2001.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2001.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2001
>          GROUP BY soc_obitos_fxe_causas_2001.estado)
> taxa_mortalidadegeral2001,( SELECT soc_obitos_fxe_causas_2002.estado,
> sum(soc_obitos_fxe_causas_2002.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2002.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2002.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2002
>          GROUP BY soc_obitos_fxe_causas_2002.estado)
> taxa_mortalidadegeral2002,( SELECT soc_obitos_fxe_causas_2003.estado,
> sum(soc_obitos_fxe_causas_2003.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2003.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2003.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2003
>          GROUP BY soc_obitos_fxe_causas_2003.estado)
> taxa_mortalidadegeral2003,( SELECT soc_obitos_fxe_causas_2004.estado,
> sum(soc_obitos_fxe_causas_2004.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2004.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2004.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2004
>          GROUP BY soc_obitos_fxe_causas_2004.estado)
> taxa_mortalidadegeral2004,( SELECT soc_obitos_fxe_causas_2005.estado,
> sum(soc_obitos_fxe_causas_2005.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2005.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2005.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2005
>          GROUP BY soc_obitos_fxe_causas_2005.estado)
> taxa_mortalidadegeral2005,( SELECT soc_obitos_fxe_causas_2006.estado,
> sum(soc_obitos_fxe_causas_2006.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2006.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2006.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2006
>          GROUP BY soc_obitos_fxe_causas_2006.estado)
> taxa_mortalidadegeral2006,( SELECT soc_obitos_fxe_causas_2007.estado,
> sum(soc_obitos_fxe_causas_2007.masculino) AS num_masculino,
> sum(soc_obitos_fxe_causas_2007.feminino) AS num_feminino,
> sum(soc_obitos_fxe_causas_2007.sexo_ignorado) as num_ignorado
>           FROM social.soc_obitos_fxe_causas_2007
>          GROUP BY soc_obitos_fxe_causas_2007.estado)
> taxa_mortalidadegeral2007, ( SELECT dem_pop_2000.estado,
> sum(dem_pop_2000.populacao_total) AS populacao_total2000
>           FROM demografia.dem_pop_2000 dem_pop_2000
>          GROUP BY dem_pop_2000.estado) populacao2000, ( SELECT
> dem_pop_2001.estado, sum(dem_pop_2001.populacao_total) AS
> populacao_total2001
>           FROM demografia.dem_pop_2001 dem_pop_2001
>          GROUP BY dem_pop_2001.estado) populacao2001, ( SELECT
> dem_pop_2002.estado, sum(dem_pop_2002.populacao_total) AS
> populacao_total2002
>           FROM demografia.dem_pop_2002 dem_pop_2002
>          GROUP BY dem_pop_2002.estado) populacao2002, ( SELECT
> dem_pop_2003.estado, sum(dem_pop_2003.populacao_total) AS
> populacao_total2003
>           FROM demografia.dem_pop_2003 dem_pop_2003
>          GROUP BY dem_pop_2003.estado) populacao2003, ( SELECT
> dem_pop_2004.estado, sum(dem_pop_2004.populacao_total) AS
> populacao_total2004
>           FROM demografia.dem_pop_2004 dem_pop_2004
>          GROUP BY dem_pop_2004.estado) populacao2004, ( SELECT
> dem_pop_2005.estado, sum(dem_pop_2005.populacao_total) AS
> populacao_total2005
>           FROM demografia.dem_pop_2005 dem_pop_2005
>          GROUP BY dem_pop_2005.estado) populacao2005, ( SELECT
> dem_pop_2006.estado, sum(dem_pop_2006.populacao_total) AS
> populacao_total2006
>           FROM demografia.dem_pop_2006 dem_pop_2006
>          GROUP BY dem_pop_2006.estado) populacao2006, ( SELECT
> dem_pop_2007.estado, sum(dem_pop_2007.populacao_total) AS
> populacao_total2007
>           FROM demografia.dem_pop_2007 dem_pop_2007
>          GROUP BY dem_pop_2007.estado) populacao2007, ( SELECT
> limitemunicipal.estado, limitemunicipal.the_geom, limitemunicipal.gid
>           FROM limitemunicipal) lm
>  WHERE taxa_mortalidadegeral2000.estado::text =  lm.estado::text AND
> populacao2000.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2001.estado::text =  lm.estado::text AND
> populacao2001.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2002.estado::text =  lm.estado::text AND
> populacao2002.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2003.estado::text =  lm.estado::text AND
> populacao2003.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2004.estado::text =  lm.estado::text AND
> populacao2004.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2005.estado::text =  lm.estado::text AND
> populacao2005.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2006.estado::text =  lm.estado::text AND
> populacao2006.estado::text = lm.estado::text and
>        taxa_mortalidadegeral2007.estado::text =  lm.estado::text AND
> populacao2007.estado::text = lm.estado::text;
>
> $BODY$
>  LANGUAGE 'sql' VOLATILE
>
>
> Erro:
>
> ERROR:  return type mismatch in function declared to return double
> precision
> DETAIL:  Final SELECT must return exactly one column.
> CONTEXT:  SQL function "soc_tx_mortalidadegeral_2000_2007_pa"
>
> ********** Erro **********
>
> ERROR: return type mismatch in function declared to return double precision
> SQL state: 42P13
> Detalhe: Final SELECT must return exactly one column.
> Contexto: SQL function "soc_tx_mortalidadegeral_2000_2007_pa"
>
>
>
>
>
>
> Pelo que vi, a stored procedure espera o retorno de uma coluna apenas?
> tem alguma forma que eu possa fazer com que o retorno sejam de mais
> colunas?
>

Não. Você mandou retornar um double precision, ou seja, sua função espera um
único valor de retorno e você está passando vários valores (1 valor em cada
coluna). Não vi toda a função porque é bem grande, mas acho que o mais
correto seria você criar um tipo de dado e retornar este tipo de dado.

CREATE TYPE meu_tipo AS (coluna1 double precision,coluna2 double
precision,...);

Uma outra coisa que não reparei é se o retorno vai ser uma única linha ou
será mais de uma linha, se for mais de uma linha você terá que colocar a
palavra SETOF após o RETUNRS.

e onde está: RETURNS double precision AS você substitui por RETURNS meu_tipo
AS

>
> agradeço desde ja!
>
>
> Bruno Sales
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>


[]s
-- 
JotaComm
http://jotacomm.wordpress.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a