Vamos ver se consigo ajudar. Esta é uma dúvida do Juliano Fischer:
"Ola, estou com um problema em uma implementação e creio que pode me ajudar.
Preciso criar um subprograma armazenado que crie um indice,se já existir, informar o usuario, cado contratio, crie um indice.
criaIndice(campo,tabela);"
Não é tão difícil! A solução está abaixo, mas cuidado pois o meu código pode e deve ser melhorado. Nomes de parâmetros, métodos e variáveis e bons comentários podem ser adicionados.
Além disso, o exemplo só verifica um campo e exige que se tenha cuidado na nomenclatura dos campos, pois utiliza a cláusula LIKE.
1 - Recuperar informações dos índices.
A dica é utilizar a pg_indexes, visão de sistema mais amigável para saber se o índice existe:
select * from pg_indexes;
2 - Criar uma função parametrizada que indica se os índices existem. Observem que utilizei a linguagem SQL, e não Pl/ PgSql. Poderia utilizar qualquer outra liguagem, mas a lógica seria similar.
-- Verifica se existe o índice. Retorna ZERO se o índice não for encontrado
CREATE OR REPLACE FUNCTION retindex(in tabela varchar, in campo varchar) RETURNS bigint AS $$
select count(*) from pg_indexes where tablename = $1 and indexdef like '%' || $2 || '%'
$$
LANGUAGE SQL;
3 - Criar função parametrizada que cria o índice caso o mesmo não exista, e que utilize a função anterior. Linguagem Pl/ PgSQL.
-- Verifica e cria novo índice se for o caso
CREATE OR REPLACE FUNCTION criaindex (tabela varchar, campo varchar) RETURNS VARCHAR AS $$
DECLARE
func_cmd VARCHAR;
BEGIN
if retindex($1,$2) > 0 then
RETURN 'OK';
else
func_cmd := 'CREATE INDEX ' || $1 || '_IDX ON ' || $1 || ' (' || $2 || ')';
EXECUTE func_cmd;
RETURN func_cmd;
end if;
END;
$$ LANGUAGE plpgsql;
4 - Testando tudo
select retindex ('teste','c1');
select criaindex ('teste', 'c1');
Companheiros, quem pode dar um código que melhore ainda mais esta criação de índices com função armazenada? Juliano, resolvi seu problema?
No ar desde 2007! Blog com informações e notícias sobre o banco de dados PostgreSQL, aquele que todos adoramos usar. Trata-se de uma ferramenta livre e de código aberto, mantida por uma comunidade ativa de usuários da qual você é convidado fazer parte. Textos, ideias e outras contribuições podem ser enviadas para Cláudio Bezerra Leopoldino: claudiob_br@yahoo.com.br
segunda-feira, 29 de outubro de 2007
sexta-feira, 19 de outubro de 2007
A Função DATE_PART
Esta utilíssima função retorna parte de uma data, hora ou timestamp para manipulação. É bastante prática e utilizada nas aplicações PostgreSQL. Equivale à função EXTRACT.
Aceita como parâmetros um texto com a parte da data a ser extraída e outro parâmetro com a data/ hora/ timestamp da qual será extraída parte.
Sintaxe:
1- date_part(text, timestamp) double precision
2 - date_part(text, interval) double precision
Exemplos:
1 - Date_part com current_date. Retornando dia da semana, dia, mês e ano.
SELECT date_part('dow', current_date); --DAY OF WEEK
SELECT date_part('day', current_date);
SELECT date_part('month', current_date);
SELECT date_part('year', current_date);
2 - Data_part com current_date retornando dia da semana, dia, mês e ano na mesma linha.
SELECT date_part('day', current_date) as dia, date_part('month', current_date) as mês, date_part('year', current_date) as ano;
3 - Data_part com current_time.
SELECT date_part('hour', current_time);
SELECT date_part('minute', current_time);
SELECT date_part('second', current_time);
SELECT date_part('milliseconds', current_time);
4 - Data_part com current_time retornando hora, minuto, segundo e milésimos de segundo em uma só linha.
SELECT date_part('hour', current_time), date_part('minute', current_time), date_part('second', current_time), date_part('milliseconds', current_time);
5 - Date_part com current_timestamp.
SELECT date_part('dow', current_timestamp);
SELECT date_part('day', current_timestamp);
SELECT date_part('month', current_timestamp);
SELECT date_part('milliseconds', current_timestamp);
6 - Date_part com current_timestamp, retornando dia da semana, dia, mês e os milisegundos da hora corrente.
SELECT date_part('dow', current_timestamp), date_part('day', current_timestamp), date_part('month', current_timestamp), date_part('milliseconds', current_timestamp);
7 - Date_part com conversão da string para campos data/ hora/ timestamp.
SELECT date_part('day', date '12-12-2007');
SELECT date_part('month', date '12-12-2007');
SELECT date_part('hour', time '02:12:45');
SELECT date_part('minute', time '02:12:45');
SELECT date_part('year', timestamp '12-12-2007 02:12:45');
SELECT date_part('hour', timestamp '12-12-2007 02:12:45');
8 - Sintaxes utilizando interval.
SELECT date_part('year', interval '4 years 3 months');
SELECT date_part('month', interval '4 years 3 months');
SELECT date_part('hour', interval '12 hour 10 minutes 12 seconds');
SELECT date_part('minute', interval '12 hour 10 minutes 15 seconds');
SELECT date_part('second', interval '12 hour 10 minutes 15 seconds');
Aceita como parâmetros um texto com a parte da data a ser extraída e outro parâmetro com a data/ hora/ timestamp da qual será extraída parte.
Sintaxe:
1- date_part(text, timestamp) double precision
2 - date_part(text, interval) double precision
Exemplos:
1 - Date_part com current_date. Retornando dia da semana, dia, mês e ano.
SELECT date_part('dow', current_date); --DAY OF WEEK
SELECT date_part('day', current_date);
SELECT date_part('month', current_date);
SELECT date_part('year', current_date);
2 - Data_part com current_date retornando dia da semana, dia, mês e ano na mesma linha.
SELECT date_part('day', current_date) as dia, date_part('month', current_date) as mês, date_part('year', current_date) as ano;
3 - Data_part com current_time.
SELECT date_part('hour', current_time);
SELECT date_part('minute', current_time);
SELECT date_part('second', current_time);
SELECT date_part('milliseconds', current_time);
4 - Data_part com current_time retornando hora, minuto, segundo e milésimos de segundo em uma só linha.
SELECT date_part('hour', current_time), date_part('minute', current_time), date_part('second', current_time), date_part('milliseconds', current_time);
5 - Date_part com current_timestamp.
SELECT date_part('dow', current_timestamp);
SELECT date_part('day', current_timestamp);
SELECT date_part('month', current_timestamp);
SELECT date_part('milliseconds', current_timestamp);
6 - Date_part com current_timestamp, retornando dia da semana, dia, mês e os milisegundos da hora corrente.
SELECT date_part('dow', current_timestamp), date_part('day', current_timestamp), date_part('month', current_timestamp), date_part('milliseconds', current_timestamp);
7 - Date_part com conversão da string para campos data/ hora/ timestamp.
SELECT date_part('day', date '12-12-2007');
SELECT date_part('month', date '12-12-2007');
SELECT date_part('hour', time '02:12:45');
SELECT date_part('minute', time '02:12:45');
SELECT date_part('year', timestamp '12-12-2007 02:12:45');
SELECT date_part('hour', timestamp '12-12-2007 02:12:45');
8 - Sintaxes utilizando interval.
SELECT date_part('year', interval '4 years 3 months');
SELECT date_part('month', interval '4 years 3 months');
SELECT date_part('hour', interval '12 hour 10 minutes 12 seconds');
SELECT date_part('minute', interval '12 hour 10 minutes 15 seconds');
SELECT date_part('second', interval '12 hour 10 minutes 15 seconds');
quinta-feira, 11 de outubro de 2007
Ótimo Livro Brasileiro de PostgreSQL!!!
O livro "Dominando o PostgreSQL", de Jorge Luiz Gonzaga, cobre as principais funções do banco, desde a instalação até a construção de funções e triggers. É uma ótima opção para quem utiliza versões 8.X. Não costumo comentar livros, mas ele tem se revelado uma ótima fonte.
Ficha técnica:
- Dominando o PostgreSQL
Autor: Gonzaga, Jorge Luiz
Editora: Ciência Moderna
ISBN: 9788573935592
Idioma: Português
Páginas: 244
Publicação: 2007
Edição: 1
Encadernação: Brochura
Peso: 512.00 gramas (!)
Pontos fortes:
- Grande Abrangência. São 36 capítulos falando de quase todos os aspectos desta tecnologia, incluindo instalação Linux e Windows.
- Suporte à linguagem SQL bastante detalhado, com muitos exemplos de sintaxes alternativas que aumentama produtividade.
- Cobre as versões 8.x, o que a maioria dos livros nacionais ainda não faz.
Pontos fracos:
- Ausência de índice remissivo (aquele que fica no fim da página)
- Certos temas mereciam maior detalhamento, como o WAL - Write-Ahead Log.
- O livro como um todo poderia ter textos mais detalhados. Os capítulos são muito curtos e os textos diretos demais, resultando em poucas páginas por capítulo.
Conclusão: é um ótimo livro. Não conheço melhor livro em português. E você?
segunda-feira, 8 de outubro de 2007
PostgreSQL 8.3 Beta Liberado para Testes
Não recomendada para uso comercial, estas versão aguarda que você faça seu download e testes. Ah, você já pode baixar na página do programa de beta testes do PostgreSQL: Seja um Beta Tester.
Novas funcionalidades:
- Melhorias de desempenho como alterações para o Distributed Checkpoint, Commit Assíncrono entre outros recursos
- TSearch2 para busca em texto passa a ser integrada ao código e sintaxe mais amigável. (Possível tema para próximos posts)
- SQL:XML syntax. (Precisa de comentário? Tenho de testar isso logo!!!)
- Logging para arquivos CSV carregáveis no banco.
- Rebuilding automático de planos de execução de consultas em cache. (ótima idéia de melhoria de desempenho)
- ENUMs, UUIDs and arrays of tipos complexos.
- Suporte de autenticação para GSSAPI e SSPI. (o que diabos é isso?)
Podemos colaborar bastante baixand, testando o beta e encaminhando as alterações.
Documentação completa das novidades nas Release Notes.
Novas funcionalidades:
- Melhorias de desempenho como alterações para o Distributed Checkpoint, Commit Assíncrono entre outros recursos
- TSearch2 para busca em texto passa a ser integrada ao código e sintaxe mais amigável. (Possível tema para próximos posts)
- SQL:XML syntax. (Precisa de comentário? Tenho de testar isso logo!!!)
- Logging para arquivos CSV carregáveis no banco.
- Rebuilding automático de planos de execução de consultas em cache. (ótima idéia de melhoria de desempenho)
- ENUMs, UUIDs and arrays of tipos complexos.
- Suporte de autenticação para GSSAPI e SSPI. (o que diabos é isso?)
Podemos colaborar bastante baixand, testando o beta e encaminhando as alterações.
Documentação completa das novidades nas Release Notes.
quinta-feira, 4 de outubro de 2007
A Função TIMEOFDAY
A função timeofday() retorna um texto com a data e hora. Não é muito utilizada.
Exemplos:
1 - Sintaxe básica.
select timeofday();
Retorno: "Thu Oct 04 12:33:55.953000 2007 BRT"
Exemplos:
1 - Sintaxe básica.
select timeofday();
Retorno: "Thu Oct 04 12:33:55.953000 2007 BRT"
Função NOW
Função equivalente a CURRENT_TIMESTAMP. Pode ser utilizada em consultas, alterações, inserções e exclusões de registros.
Exemplos:
1 - Sintaxe básica.
select now();
Retorno: "2007-10-04 11:24:15.718-03"
2 - Consulta com outra função.
select now(), current_timestamp;
Retorno: "2007-10-04 11:25:11.625-03";"2007-10-04 11:25:11.625-03"
3 - Uso de NOW() em inserção.
insert into testedata values (current_date, current_time, now());
4 - Uso de NOW() em consulta.
select * from testedata where ctimestamp = now();
Exemplos:
1 - Sintaxe básica.
select now();
Retorno: "2007-10-04 11:24:15.718-03"
2 - Consulta com outra função.
select now(), current_timestamp;
Retorno: "2007-10-04 11:25:11.625-03";"2007-10-04 11:25:11.625-03"
3 - Uso de NOW() em inserção.
insert into testedata values (current_date, current_time, now());
4 - Uso de NOW() em consulta.
select * from testedata where ctimestamp = now();
quarta-feira, 3 de outubro de 2007
CURRENT_DATE, CURRENT_TIME e CURRENT_TIMESTAMP
São funções que retornam respectivamente a data atual, a hora corrente e o timestamp (data + hora) registrado no relógio do computador. Podem ser utilizadas na inserção, atualização, consulta e exclusão de dados.
Exemplos:
1 - Retornando a data atual.
SELECT current_date;
2 - Retornando a hora atual.
SELECT current_time;
3 - Retornando o timestamp corrente.
SELECT current_timestamp;
4 - Consulta retornando current_date, current_time e current_timestamp.
SELECT current_date, current_time, current_timestamp;
5 - Utilização das funções para inserção, alteração e exclusão de dados.
CREATE TABLE testedata(
cdata DATE,
ctime TIME,
ctimestamp timestamp);
insert into testedata values (current_date, current_time, current_timestamp);
insert into testedata values ('2007-10-21', '11:04:50.123', '2007-10-21 11:04:50.123');
update testedata set cdata = current_date;
delete from testedata where cdata <> current_date;
6 - Utilização das funções para consultas aos dados.
select * from testedata where ctime <> current_time;
Exemplos:
1 - Retornando a data atual.
SELECT current_date;
2 - Retornando a hora atual.
SELECT current_time;
3 - Retornando o timestamp corrente.
SELECT current_timestamp;
4 - Consulta retornando current_date, current_time e current_timestamp.
SELECT current_date, current_time, current_timestamp;
5 - Utilização das funções para inserção, alteração e exclusão de dados.
CREATE TABLE testedata(
cdata DATE,
ctime TIME,
ctimestamp timestamp);
insert into testedata values (current_date, current_time, current_timestamp);
insert into testedata values ('2007-10-21', '11:04:50.123', '2007-10-21 11:04:50.123');
update testedata set cdata = current_date;
delete from testedata where cdata <> current_date;
6 - Utilização das funções para consultas aos dados.
select * from testedata where ctime <> current_time;
Comandos de Manipulação de DATA/ HORA
O PostgreSQL manipula campos tipo data e hora com muita desenvoltura. Apresenta ainda o tipo de dados timestamp que engloba data e hora no mesmo campo. As principais funções de manipulação de datas são:
- current_date
- current_time
- current_timestamp
- now()
- timeofday()
- date_part
- date_trunc
- extract
Estas funções podem ser utilizadas na inserção, atualizações e exclusão dos dados, como será exemplificado nos próximos posts.
- current_date
- current_time
- current_timestamp
- now()
- timeofday()
- date_part
- date_trunc
- extract
Estas funções podem ser utilizadas na inserção, atualizações e exclusão dos dados, como será exemplificado nos próximos posts.
Assinar:
Postagens (Atom)