[pgbr-geral] Função SQL com condicionais com d iversos SQL.

2010-01-04 Por tôpico GABRIEL DOS SANTOS

Boa noite turma,

 

Objetivo: Estou desenvolvendo uma função que retorna os dados do Locatario de 
contrato de locação, so que

o locatario pode ser um Cliente, um Funcionario ou um Solicitante(que como se 
fosse um parceiro da empresa). Nesta função

eu passo o Tipo de locatario e o codigo do mesmo, e de acordo com o tipo do 
mesmo, é para a função dar um SELECT na 

tabela correspondente e retornar os dados do locatario.

 

Erro: Não esta aceitando retornar mais de coluna nos sub-selects de cada WHEN...

Por isto que eu estou querendo utilizar uma estrutura de IF...THEN...END 
IF...dentro de uma função SQL.

Alguem sabe como escrevo a sintaxe correta. Um colega da comunidade me indicou 
para utilizar o CASE...

mais esta dando certo.. 

 

O corpo da função esta logo abaixo.

 

Gabriel.

-

 

CREATE OR REPLACE FUNCTION get_dados_locatario( TEXT, INTEGER) RETURNS SETOF 
RECORD AS
$$


--Parametros: tipo_locatario (C = Cliente, S = Solicitante ou F = Funcionario); 
o ID do mesmo(Codcliente, CodSolicitante, MatriculaFuncionario)

 

 SELECT CASE

 

WHEN ($1 = 'C') THEN 

 

(SELECT c.codcliente AS codlocatario
, c.razaonome AS locatario
, CASE
 WHEN c.tipopessoa = 'F' THEN fmt_cpf(c.cpf)
 WHEN c.tipopessoa = 'J' THEN c.cnpj
END AS cnpj_cpf
, CASE
 WHEN c.tipopessoa = 'F' THEN c.rg
 WHEN c.tipopessoa = 'J' THEN c.ie
END AS ie_rg
, c.tipopessoa, c.endereco, c.bairro, c.num
, fmt_fone(c.tel1) AS tel1, fmt_fone(c.fax) AS tel2
, ci.cidade, ci.uf 
, CASE
 WHEN c.cep IS NOT NULL THEN fmt_cep(c.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dscliente c LEFT JOIN dscidade ci
ON (c.codcidade = ci.codcidade) 
WHERE c.codcliente = $2) 
  
 WHEN ($1 = 'F') THEN
 
(SELECT f.matricula AS codlocatario
, f.nome AS locatario
, fmt_cpf(f.cpf) AS cnpj_cpf, f.rg AS ie_rg
, 'F', f.endereco, f.bairro, f.num
, fmt_fone(f.telres) AS tel1, fmt(f.cel) AS tel2
, c.cidade, c.uf
, CASE
 WHEN c.cep IS NOT NULL THEN fmt_cep(f.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dsfuncionario f LEFT JOIN dscidade c
ON (f.codcidade = c.codcidade) 
WHERE f.matricula = $2)
  
 WHEN ($1 = 'S') THEN

 

 (SELECT s.codsolicitante AS codlocatario
 , s.solicitante AS locatario
, CASE
 WHEN s.tipopessoa = 'F' THEN fmt_cpf(s.cpf)
 WHEN s.tipopessoa = 'J' THEN s.cnpj
END AS cnpj_cpf
, CASE
 WHEN s.tipopessoa = 'F' THEN s.rg
 WHEN s.tipopessoa = 'J' THEN s.ie
END AS ie_rg
, s.tipopessoa, s.endereco, s.bairro, s.num
, fmt_fone(s.tel1) AS tel1, fmt_fone(s.fax) AS tel2
, c.cidade, c.uf
, CASE
 WHEN s.cep IS NOT NULL THEN fmt_cep(s.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dssolicitante s LEFT JOIN dscidade c ON(s.codcidade = 
c.codcidade) 
WHERE s.codsolicitante = $2)

 END;
$$
LANGUAGE 'SQL';

 


 
  
_
Faça transações bancárias de maneira segura. Baixe agora o Novo Internet 
Explorer 8.
http://brasil.microsoft.com.br/IE8/mergulhe/?utm_source=MSN%3BHotmailutm_medium=Taglineutm_content=Tag2utm_campaign=IE8___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Função SQL com condicionais com d iversos SQL.

2010-01-04 Por tôpico Osvaldo Kussama
2010/1/4 GABRIEL DOS SANTOS gabrielworks...@hotmail.com:
 Boa noite turma,

 Objetivo: Estou desenvolvendo uma função que retorna os dados do Locatario
 de contrato de locação, so que
 o locatario pode ser um Cliente, um Funcionario ou um Solicitante(que como
 se fosse um parceiro da empresa). Nesta função
 eu passo o Tipo de locatario e o codigo do mesmo, e de acordo com o tipo do
 mesmo, é para a função dar um SELECT na
 tabela correspondente e retornar os dados do locatario.

 Erro: Não esta aceitando retornar mais de coluna nos sub-selects de cada
 WHEN...
 Por isto que eu estou querendo utilizar uma estrutura de IF...THEN...END
 IF...dentro de uma função SQL.
 Alguem sabe como escrevo a sintaxe correta. Um colega da comunidade me
 indicou para utilizar o CASE...
 mais esta dando certo..

 O corpo da função esta logo abaixo.



Esta não é a maneira correta de utilizar uma Expressão Condicional.
Considere a  opção mais adequada que é utilizar PL/pgSQL [1].
Observe que em [2] é dada a dica:
Tip:  If your needs go beyond the capabilities of these conditional
expressions, you might want to consider writing a stored procedure in
a more expressive programming language.

Osvaldo

[1] 
http://www.postgresql.org/docs/current/interactive/functions-conditional.html
[2] http://www.postgresql.org/docs/current/interactive/plpgsql.html
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Função SQL com condicionais com d iversos SQL.

2010-01-04 Por tôpico Osvaldo Kussama
2010/1/4 Osvaldo Kussama osvaldo.kuss...@gmail.com:
 2010/1/4 GABRIEL DOS SANTOS gabrielworks...@hotmail.com:
 Boa noite turma,

 Objetivo: Estou desenvolvendo uma função que retorna os dados do Locatario
 de contrato de locação, so que
 o locatario pode ser um Cliente, um Funcionario ou um Solicitante(que como
 se fosse um parceiro da empresa). Nesta função
 eu passo o Tipo de locatario e o codigo do mesmo, e de acordo com o tipo do
 mesmo, é para a função dar um SELECT na
 tabela correspondente e retornar os dados do locatario.

 Erro: Não esta aceitando retornar mais de coluna nos sub-selects de cada
 WHEN...
 Por isto que eu estou querendo utilizar uma estrutura de IF...THEN...END
 IF...dentro de uma função SQL.
 Alguem sabe como escrevo a sintaxe correta. Um colega da comunidade me
 indicou para utilizar o CASE...
 mais esta dando certo..

 O corpo da função esta logo abaixo.



 Esta não é a maneira correta de utilizar uma Expressão Condicional.
 Considere a  opção mais adequada que é utilizar PL/pgSQL [1].
 Observe que em [2] é dada a dica:
 Tip:  If your needs go beyond the capabilities of these conditional
 expressions, you might want to consider writing a stored procedure in
 a more expressive programming language.

 Osvaldo

 [1] 
 http://www.postgresql.org/docs/current/interactive/functions-conditional.html
 [2] http://www.postgresql.org/docs/current/interactive/plpgsql.html


Se quiser usar uma função SQL no lugar da PL/pgSQL verifique se funciona:

CREATE OR REPLACE FUNCTION get_dados_locatario( TEXT, INTEGER) RETURNS
SETOF RECORD AS
$$

--Parametros: tipo_locatario (C = Cliente, S = Solicitante ou F =
Funcionario); o ID do mesmo(Codcliente, CodSolicitante,
MatriculaFuncionario)

SELECT 
codlocatario,locatario,cnpj_cpf,ie_rg,tipopessoa,endereco,bairro,num,tel1,tel2,cidade,uf,cep
FROM
CASE

WHEN ($1 = 'C') THEN

(SELECT c.codcliente AS codlocatario
, c.razaonome AS locatario
, CASE
 WHEN c.tipopessoa = 'F' THEN fmt_cpf(c.cpf)
 WHEN c.tipopessoa = 'J' THEN c.cnpj
END AS cnpj_cpf
, CASE
 WHEN c.tipopessoa = 'F' THEN c.rg
 WHEN c.tipopessoa = 'J' THEN c.ie
END AS ie_rg
, c.tipopessoa, c.endereco, c.bairro, c.num
, fmt_fone(c.tel1) AS tel1, fmt_fone(c.fax) AS tel2
, ci.cidade, ci.uf
, CASE
 WHEN c.cep IS NOT NULL THEN fmt_cep(c.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dscliente c LEFT JOIN dscidade ci
ON (c.codcidade = ci.codcidade)
WHERE c.codcliente = $2) AS
fooc(codlocatario,locatario,cnpj_cpf,ie_rg,tipopessoa,endereco,bairro,num,tel1,tel2,cidade,uf,cep)

 WHEN ($1 = 'F') THEN

(SELECT f.matricula AS codlocatario
, f.nome AS locatario
, fmt_cpf(f.cpf) AS cnpj_cpf, f.rg AS ie_rg
, 'F' AS tipopessoa, f.endereco, f.bairro, f.num
, fmt_fone(f.telres) AS tel1, fmt(f.cel) AS tel2
, c.cidade, c.uf
, CASE
 WHEN c.cep IS NOT NULL THEN fmt_cep(f.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dsfuncionario f LEFT JOIN dscidade c
ON (f.codcidade = c.codcidade)
WHERE f.matricula = $2) AS
foof(codlocatario,locatario,cnpj_cpf,ie_rg,tipopessoa,endereco,bairro,num,tel1,tel2,cidade,uf,cep)

 WHEN ($1 = 'S') THEN

 (SELECT s.codsolicitante AS codlocatario
 , s.solicitante AS locatario
, CASE
 WHEN s.tipopessoa = 'F' THEN fmt_cpf(s.cpf)
 WHEN s.tipopessoa = 'J' THEN s.cnpj
END AS cnpj_cpf
, CASE
 WHEN s.tipopessoa = 'F' THEN s.rg
 WHEN s.tipopessoa = 'J' THEN s.ie
END AS ie_rg
, s.tipopessoa, s.endereco, s.bairro, s.num
, fmt_fone(s.tel1) AS tel1, fmt_fone(s.fax) AS tel2
, c.cidade, c.uf
, CASE
 WHEN s.cep IS NOT NULL THEN fmt_cep(s.cep)
 WHEN ci.cep IS NOT NULL THEN fmt_cep(ci.cep)
END AS cep
FROM dssolicitante s LEFT JOIN dscidade c
ON(s.codcidade = c.codcidade)
WHERE s.codsolicitante = $2) AS
foos(codlocatario,locatario,cnpj_cpf,ie_rg,tipopessoa,endereco,bairro,num,tel1,tel2,cidade,uf,cep)

END;
$$
LANGUAGE 'SQL';

Osvaldo

PS.: não testado
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral