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
