Re: [pgbr-geral] SQL SELECT dinâmico em Pl/PgSQL

2009-09-30 Por tôpico Roberto Mello
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

2009-09-30 Por tôpico Tiago Adami
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

2009-09-30 Por tôpico Tiago Adami
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-09-30 Por tôpico Tiago Adami
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-09-30 Por tôpico Fabrízio de Royes Mello
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