Re: [pgbr-geral] Retorno de uma funcao como tabela

2016-08-31 Por tôpico Carlos Antônio Pereira


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

2016-08-31 Por tôpico Ursulino Barboza
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

2016-08-30 Por tôpico Carlos Antônio Pereira
 

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

2016-08-30 Por tôpico Euler Taveira
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

2016-08-30 Por tôpico Carlos Antônio Pereira
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

2016-08-30 Por tôpico lu moraes santos
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 santos 
escreveu:

> 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

2016-08-30 Por tôpico lu moraes santos
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

2016-08-30 Por tôpico Carlos Antônio Pereira

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

2016-08-30 Por tôpico Carlos Antônio Pereira

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

2016-08-30 Por tôpico lu moraes santos
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

2016-08-30 Por tôpico Carlos Antônio Pereira
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