2010/1/4 Osvaldo Kussama <[email protected]>:
> 2010/1/4 GABRIEL DOS SANTOS <[email protected]>:
>> 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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral