Re: [pgbr-geral] SQL SELECT dinâmico em Pl/PgSQL
2009/9/30 Tiago Adami adam...@gmail.com: iValor ALIAS FOR $3; BEGIN -- E aqui, o que fazer??? -- SELECT cNomeColuna FROM cNomeTabela WHERE cNomeColuna = iValor; corte Pergunta: Há como executar um SQL SELECT de forma dinâmica dentro da função que possa retornar um valor? Sim, veja o EXECUTE na documentação do PL/pgSQL. Roberto ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] SQL SELECT dinâmico em Pl/PgSQL
Já estudei o EXECUTE antes de postar a pergunta. Não encontrei um meio de colocar o nome da tabela e o nome da coluna de forma dinâmica, apenas os valores. Como disse anteriormente, preciso passar o nome da tabela (FROM) e o nome da coluna como parâmetros da função, assim como o seu valor. -- ** Tiago J. Adami http://www.adamiworks.com ** 2009/9/30 Roberto Mello roberto.me...@gmail.com 2009/9/30 Tiago Adami adam...@gmail.com: iValorALIAS FOR $3; BEGIN -- E aqui, o que fazer??? -- SELECT cNomeColuna FROM cNomeTabela WHERE cNomeColuna = iValor; corte Pergunta: Há como executar um SQL SELECT de forma dinâmica dentro da função que possa retornar um valor? Sim, veja o EXECUTE na documentação do PL/pgSQL. Roberto ___ 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] SQL SELECT dinâmico em Pl/PgSQL
Obrigado, Fabrízio. Gostaria de fazer mais duas perguntas a respeito da sua resposta: 1) Existem duas funções EXECUTE no PostgreSQL? Estive consultando a documentação em [1] e pelo o que entendi, é apenas para códigos preparados (prepared statements); 2) A função agora ficou assim: CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER ) RETURNS BOOLEAN AS $f_valor_existe$ DECLARE cNomeTabelaALIAS FOR $1; cNomeColunaALIAS FOR $2; iValorALIAS FOR $3; cSQLTEXT; nIDINTEGER; BEGIN cSQL = 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE '||cNomeColuna || ' = ' || CAST(iValor AS TEXT); RAISE INFO 'Comando SQL: %', cSQL; EXECUTE cSQL; IF FOUND THEN return true; END IF; RETURN false; END; $f_valor_existe$ LANGUAGE 'plpgsql' VOLATILE; Compila e executa perfeitamente. Mas mesmo existindo o valor na tabela, o resultado de FOUND sempre é FALSE. Alguma sugestão para contornar este comportamento? Obrigado mais uma vez. [1] http://www.postgresql.org/docs/8.4/static/sql-execute.html -- ** Tiago J. Adami http://www.adamiworks.com ** 2009/9/30 Fabrízio de Royes Mello fabriziome...@gmail.com 2009/9/30 Tiago Adami adam...@gmail.com Já estudei o EXECUTE antes de postar a pergunta. Não encontrei um meio de colocar o nome da tabela e o nome da coluna de forma dinâmica, apenas os valores. Como disse anteriormente, preciso passar o nome da tabela (FROM) e o nome da coluna como parâmetros da função, assim como o seu valor. Quem sabe algo parecido com: EXECUTE 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE '||cNomeColuna =' || CAST(iValor AS TEXT); Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com ___ 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] SQL SELECT dinâmico em Pl/PgSQL
Achei a documentação. Estava tão obcecado pelo EXECUTE que entrei no lugar errado da documentação. Talvez pudesse existir um link para [2] dentro da documentação do comando EXECUTE. Agora sim está funcionando perfeitamente. A versão final da função ficou: CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER ) RETURNS BOOLEAN AS $f_valor_existe$ DECLARE cNomeTabelaALIAS FOR $1; cNomeColunaALIAS FOR $2; iValorALIAS FOR $3; cSQLTEXT; nCountINTEGER; BEGIN cSQL = 'SELECT COUNT('||cNomeColuna||') AS _ID FROM '||cNomeTabela||' WHERE '||cNomeColuna || ' = ' || CAST(iValor AS TEXT); RAISE INFO 'Comando SQL: %', cSQL; EXECUTE cSQL INTO nCount; IF nCount 0 THEN return true; END IF; RETURN false; END; $f_valor_existe$ LANGUAGE 'plpgsql' VOLATILE; [2] http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN -- ** Tiago J. Adami http://www.adamiworks.com ** 2009/9/30 Tiago Adami adam...@gmail.com Obrigado, Fabrízio. Gostaria de fazer mais duas perguntas a respeito da sua resposta: 1) Existem duas funções EXECUTE no PostgreSQL? Estive consultando a documentação em [1] e pelo o que entendi, é apenas para códigos preparados (prepared statements); 2) A função agora ficou assim: CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER ) RETURNS BOOLEAN AS $f_valor_existe$ DECLARE cNomeTabelaALIAS FOR $1; cNomeColunaALIAS FOR $2; iValorALIAS FOR $3; cSQLTEXT; nIDINTEGER; BEGIN cSQL = 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE '||cNomeColuna || ' = ' || CAST(iValor AS TEXT); RAISE INFO 'Comando SQL: %', cSQL; EXECUTE cSQL; IF FOUND THEN return true; END IF; RETURN false; END; $f_valor_existe$ LANGUAGE 'plpgsql' VOLATILE; Compila e executa perfeitamente. Mas mesmo existindo o valor na tabela, o resultado de FOUND sempre é FALSE. Alguma sugestão para contornar este comportamento? Obrigado mais uma vez. [1] http://www.postgresql.org/docs/8.4/static/sql-execute.html -- ** Tiago J. Adami http://www.adamiworks.com ** 2009/9/30 Fabrízio de Royes Mello fabriziome...@gmail.com 2009/9/30 Tiago Adami adam...@gmail.com Já estudei o EXECUTE antes de postar a pergunta. Não encontrei um meio de colocar o nome da tabela e o nome da coluna de forma dinâmica, apenas os valores. Como disse anteriormente, preciso passar o nome da tabela (FROM) e o nome da coluna como parâmetros da função, assim como o seu valor. Quem sabe algo parecido com: EXECUTE 'SELECT '||cNomeColuna||' FROM '||cNomeTabela||' WHERE '||cNomeColuna =' || CAST(iValor AS TEXT); Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com ___ 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] SQL SELECT dinâmico em Pl/PgSQL
2009/9/30 Tiago Adami adam...@gmail.com Obrigado, Fabrízio. Gostaria de fazer mais duas perguntas a respeito da sua resposta: 1) Existem duas funções EXECUTE no PostgreSQL? Estive consultando a documentação em [1] e pelo o que entendi, é apenas para códigos preparados (prepared statements); É isso ai... dentro de uma PL/PgSQL o EXECUTE tem uma função [1] e no que diz respeito a Prepared Statments tem outra função [2]. corte Compila e executa perfeitamente. Mas mesmo existindo o valor na tabela, o resultado de FOUND sempre é FALSE. Alguma sugestão para contornar este comportamento? O EXECUTE não atualiza a variável especial FOUND numa PL/PgSQL, veja em [3] quando a variável FOUND é atualizada. Mas você pode reescrever a tua PL da seguinte maneira para atender o requisito: CREATE OR REPLACE FUNCTION f_valor_existe( VARCHAR, VARCHAR, INTEGER ) RETURNS BOOLEAN AS $f_valor_existe$ DECLARE cNomeTabelaALIAS FOR $1; cNomeColunaALIAS FOR $2; iValor ALIAS FOR $3; cSQL TEXT; lRetorno BOOLEAN DEFAULT false; BEGIN cSQL := 'SELECT EXISTS(SELECT 1 FROM '||cNomeTabela||' WHERE '||cNomeColuna || ' = ' || CAST(iValor AS TEXT)||')'; RAISE INFO 'Comando SQL: %', cSQL; EXECUTE cSQL INTO lRetorno; RETURN lRetorno; END; $f_valor_existe$ LANGUAGE 'plpgsql' VOLATILE; [1] http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN [2] http://www.postgresql.org/docs/8.4/static/sql-execute.html [3] http://www.postgresql.org/docs/8.4/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral