Re: [pgbr-geral] Retorno de uma funcao como tabela
From: Ursulino Barboza Sent: Wednesday, August 31, 2016 10:15 AM To: Comunidade PostgreSQL Brasileira Subject: Re: [pgbr-geral] Retorno de uma funcao como tabela Segue outra sugestão: Você pode dividir uma matriz para um conjunto de resultados usando a função unnest, e você pode transformar uma string literal em uma matriz usando a função string_to_array. Combine os dois e você começa a seguinte:select unnest(string_to_array('the quick lazy fox', ' ')); unnest the quick lazy fox (4 filas)Na versão 8.2 não existe a função UNNEST, segue script que cria: create or replace function unnest(anyarray) returns setof anyelement language sql as $$ select $1[i] from generate_series(array_lower($1, 1), array_upper($1, 1)) as i; $$; Ok, Ursulino. Agradeço a ajuda. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Segue outra sugestão: Você pode dividir uma matriz para um conjunto de resultados usando a função unnest, e você pode transformar uma string literal em uma matriz usando a função string_to_array. Combine os dois e você começa a seguinte: select unnest(string_to_array('the quick lazy fox', ' ')); unnest the quick lazy fox(4 filas) Na versão 8.2 não existe a função UNNEST, segue script que cria: create or replace function unnest(anyarray) returns setof anyelement language sql as $$ select $1[i] from generate_series(array_lower($1, 1), array_upper($1, 1)) as i;$$; Em 30 de agosto de 2016 20:14, Carlos Antônio Pereira < carlosanto...@utivida.com.br> escreveu: > Em 30/08/2016 19:50, Euler Taveira escreveu: > > On 30-08-2016 15:59, Carlos Antônio Pereira wrote: > > Pessoal, estou querendo construir uma função assim: select > tb_dominio('Masculino; Feminino') > > Não precisa de função; ela já existe. O que parece que você quer é: > > # select row_number() over(), a FROM > regexp_split_to_table('um;dois;tres', ';') a; > row_number | a > +-- > 1 | um > 2 | dois > 3 | tres > (3 registros) > > Da próxima vez, descreva melhor entrada e saída. Não estava claro de > onde vinha o "código" (ainda não sei se é exatamente isso que você quer). > > > É isso mesmo Euler. Obrigado. > > > > ___ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > -- Att, Ursulino Barboza de Souza Neto ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Em 30/08/2016 19:50, Euler Taveira escreveu: > On 30-08-2016 15:59, Carlos Antônio Pereira wrote: > >> Pessoal, estou querendo construir uma função assim: select >> tb_dominio('Masculino; Feminino') > > Não precisa de função; ela já existe. O que parece que você quer é: > > # select row_number() over(), a FROM > regexp_split_to_table('um;dois;tres', ';') a; > row_number | a > +-- > 1 | um > 2 | dois > 3 | tres > (3 registros) > > Da próxima vez, descreva melhor entrada e saída. Não estava claro de > onde vinha o "código" (ainda não sei se é exatamente isso que você quer). É isso mesmo Euler. Obrigado. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
On 30-08-2016 15:59, Carlos Antônio Pereira wrote: > Pessoal, estou querendo construir uma função assim: > > select tb_dominio(‘Masculino; Feminino’) > Não precisa de função; ela já existe. O que parece que você quer é: # select row_number() over(), a FROM regexp_split_to_table('um;dois;tres', ';') a; row_number | a +-- 1 | um 2 | dois 3 | tres (3 registros) Da próxima vez, descreva melhor entrada e saída. Não estava claro de onde vinha o "código" (ainda não sei se é exatamente isso que você quer). -- Euler Taveira Timbira - http://www.timbira.com.br/ PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Está retornando este erro. ERROR: syntax error at or near "$1" LINE 1: CREATE TEMP TABLE public.dominio( $1 INTEGER, $2 TEXT ) ^ QUERY: CREATE TEMP TABLE public.dominio( $1 INTEGER, $2 TEXT ) CONTEXT: SQL statement in PL/PgSQL function "dominio" near line 9 ** Erro ** ERROR: syntax error at or near "$1"___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Ola amigo, me de um feedback, deu certo a funcao que eu enviei??? [image: Foto] *LuMoraes* *O mais completo para seu comércio.* Em 30 de agosto de 2016 17:41, lu moraes santosescreveu: > ola amigo agora entendi , segue abaixo sua solucao: > > CREATE OR REPLACE FUNCTION public.dominio ( > p_dominio text, > p_sequencia text > ) > RETURNS TABLE ( > codigo INTEGER, > descricao TEXT > ) AS > $body$ > DECLARE > rQtde RECORD; > vetDescricao TEXT[]; > vetCodigo INTEGER[]; > i INTEGER; > BEGIN > CREATE TEMP TABLE dominio( > codigo INTEGER, > descricao TEXT ); > > i:=1; > SELECT INTO vetDescricao string_to_array(p_dominio,','); > SELECT INTO vetCodigo string_to_array(p_sequencia,','); > FOR rQtde IN SELECT unnest(string_to_array(p_dominio,',')) as dominio > LOOP >INSERT INTO dominio(codigo,descricao) VALUES(vetCodigo[i], > vetDescricao[I]); > i:=i+1; > END LOOP; > RETURN query SELECT * FROM dominio; > DROP TABLE dominio; > END; > $body$ > LANGUAGE 'plpgsql' > VOLATILE > CALLED ON NULL INPUT > SECURITY INVOKER > COST 100 ROWS 1000; > > PARA USAR: > > SELECT * from dominio('UM,DOIS,TRES','1,2,3') > > > [image: Foto] > *LuMoraes* > *O mais completo para seu comércio.* > > 2016-08-30 17:17 GMT-03:00 Carlos Antônio Pereira < > carlosanto...@utivida.com.br>: > >> >> Ola boa tarde amigo >> >> Veja uma funcao exemplo: >> >> CREATE OR REPLACE FUNCTION teste(pSeuParaMetro) >> RETURNS TABLE(id_produto integer, codfor character varying, codbar >> character varying, descricao character varying, qtd_minima integer, estoque >> numeric, reposicao numeric, prateleira character varying) AS >> $BODY$ >> BEGIN >> RETURN QUERY SELECT id_produto , codfor , codbar , descricao, >> qtd_minima , estoque , reposicao , prateleira FROM tabela WHERE >> campo=pSeuParaMetro; >> END; >> $BODY$ >> LANGUAGE plpgsql VOLATILE >> COST 100 >> ROWS 1000; >> >> veja se isto te ajuda. >> >> >> >> Obrigado pela dica. >> Mas a idéia é construir um record e retorná-lo a partir do parâmetro >> passado para a função, sem que tenha uma tabela relacionada ao retorno. >> >> Algo como: >> >> select dominio(‘Sim;Não’); >> >> Retorno: >> codigo descricao >> 1 Sim >> 2 Não >> >> select dominio(‘CPF;CNPJ’); >> codigo descricao >> 1 CPF >> 2 CNPJ >> >> >> >> >> >> >> >> >> >> >> >> >> ___ >> pgbr-geral mailing list >> pgbr-geral@listas.postgresql.org.br >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >> > > ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
ola amigo agora entendi , segue abaixo sua solucao: CREATE OR REPLACE FUNCTION public.dominio ( p_dominio text, p_sequencia text ) RETURNS TABLE ( codigo INTEGER, descricao TEXT ) AS $body$ DECLARE rQtde RECORD; vetDescricao TEXT[]; vetCodigo INTEGER[]; i INTEGER; BEGIN CREATE TEMP TABLE dominio( codigo INTEGER, descricao TEXT ); i:=1; SELECT INTO vetDescricao string_to_array(p_dominio,','); SELECT INTO vetCodigo string_to_array(p_sequencia,','); FOR rQtde IN SELECT unnest(string_to_array(p_dominio,',')) as dominio LOOP INSERT INTO dominio(codigo,descricao) VALUES(vetCodigo[i],vetDescricao[I]); i:=i+1; END LOOP; RETURN query SELECT * FROM dominio; DROP TABLE dominio; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER COST 100 ROWS 1000; PARA USAR: SELECT * from dominio('UM,DOIS,TRES','1,2,3') [image: Foto] *LuMoraes* *O mais completo para seu comércio.* 2016-08-30 17:17 GMT-03:00 Carlos Antônio Pereira < carlosanto...@utivida.com.br>: > > Ola boa tarde amigo > > Veja uma funcao exemplo: > > CREATE OR REPLACE FUNCTION teste(pSeuParaMetro) > RETURNS TABLE(id_produto integer, codfor character varying, codbar > character varying, descricao character varying, qtd_minima integer, estoque > numeric, reposicao numeric, prateleira character varying) AS > $BODY$ > BEGIN > RETURN QUERY SELECT id_produto , codfor , codbar , descricao, > qtd_minima , estoque , reposicao , prateleira FROM tabela WHERE > campo=pSeuParaMetro; > END; > $BODY$ > LANGUAGE plpgsql VOLATILE > COST 100 > ROWS 1000; > > veja se isto te ajuda. > > > > Obrigado pela dica. > Mas a idéia é construir um record e retorná-lo a partir do parâmetro > passado para a função, sem que tenha uma tabela relacionada ao retorno. > > Algo como: > > select dominio(‘Sim;Não’); > > Retorno: > codigo descricao > 1 Sim > 2 Não > > select dominio(‘CPF;CNPJ’); > codigo descricao > 1 CPF > 2 CNPJ > > > > > > > > > > > > > ___ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Ola boa tarde amigo Veja uma funcao exemplo: CREATE OR REPLACE FUNCTION teste(pSeuParaMetro) RETURNS TABLE(id_produto integer, codfor character varying, codbar character varying, descricao character varying, qtd_minima integer, estoque numeric, reposicao numeric, prateleira character varying) AS $BODY$ BEGIN RETURN QUERY SELECT id_produto , codfor , codbar , descricao, qtd_minima , estoque , reposicao , prateleira FROM tabela WHERE campo=pSeuParaMetro; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; veja se isto te ajuda. Obrigado pela dica. Mas a idéia é construir um record e retorná-lo a partir do parâmetro passado para a função, sem que tenha uma tabela relacionada ao retorno. Algo como: select dominio(‘Sim;Não’); Retorno: codigo descricao 1 Sim 2 Não select dominio(‘CPF;CNPJ’); codigo descricao 1 CPF 2 CNPJ Pensei nisto: CREATE TYPE type_dominio AS ( codigo INT, descricao VARCHAR ); CREATE FUNCTION dominio(varchar) RETURNS SETOF type_dominio AS $$ DECLARE dados_dominio type_dominio; BEGIN FOR ... LOOP ...; END LOOP; RETURN; END; $$ LANGUAGE 'plpgsql' SELECT * FROM dominio(‘Sim;Não’); Não sei o que fazer dentro do loop... Talvez se passar um array como parametro... ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Ola boa tarde amigo Veja uma funcao exemplo: CREATE OR REPLACE FUNCTION teste(pSeuParaMetro) RETURNS TABLE(id_produto integer, codfor character varying, codbar character varying, descricao character varying, qtd_minima integer, estoque numeric, reposicao numeric, prateleira character varying) AS $BODY$ BEGIN RETURN QUERY SELECT id_produto , codfor , codbar , descricao, qtd_minima , estoque , reposicao , prateleira FROM tabela WHERE campo=pSeuParaMetro; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; veja se isto te ajuda. Obrigado pela dica. Mas a idéia é construir um record e retorná-lo a partir do parâmetro passado para a função, sem que tenha uma tabela relacionada ao retorno. Algo como: select dominio(‘Sim;Não’); Retorno: codigo descricao 1 Sim 2 Não select dominio(‘CPF;CNPJ’); codigo descricao 1 CPF 2 CNPJ ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Retorno de uma funcao como tabela
Ola boa tarde amigo Veja uma funcao exemplo: CREATE OR REPLACE FUNCTION teste(pSeuParaMetro) RETURNS TABLE(id_produto integer, codfor character varying, codbar character varying, descricao character varying, qtd_minima integer, estoque numeric, reposicao numeric, prateleira character varying) AS $BODY$ BEGIN RETURN QUERY SELECT id_produto , codfor , codbar , descricao, qtd_minima , estoque , reposicao , prateleira FROM tabela WHERE campo=pSeuParaMetro; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000; veja se isto te ajuda. Saudacoes LUMORAES [image: Foto] *LuMoraes* *O mais completo para seu comércio.* Em 30 de agosto de 2016 15:59, Carlos Antônio Pereira < carlosanto...@utivida.com.br> escreveu: > Pessoal, estou querendo construir uma função assim: > > select tb_dominio(‘Masculino; Feminino’) > > Onde o retorno seja tipo record mais ou menos assim: > > codigo descricao > 1Masculino > 2Feminino > > > Alguma idéia? > > Att Carlos > > ___ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Retorno de uma funcao como tabela
Pessoal, estou querendo construir uma função assim: select tb_dominio(‘Masculino; Feminino’) Onde o retorno seja tipo record mais ou menos assim: codigo descricao 1Masculino 2Feminino Alguma idéia? Att Carlos___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral