[pgbr-geral] Função SQL com condicionais com d iversos SQL.
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/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/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