O problema é o seguinte:
Alguém "fez" o banco de um jeito onde o nome completo das pessoas está em apenas um registro.
Como exemplo temos a tabela pessoas e o campo nome que tem o nome completo. Seu diretor quer que as correspondências sejam enviadas com o nome abreviado e mandou criar o campo nome_abreviado no banco para isso. Como colocar os nomes abreviados nesse caso?
Use essa função para isso:
--Ajustar abreviação (criar função)
--drop function dbo.Abrevia; --Remover a função caso necessário
CREATE FUNCTION dbo.Abrevia
( @nome varchar(120) )
RETURNS varchar(25)
AS
BEGIN
declare @aux varchar(120)
declare @aux2 varchar(25)
declare @fim varchar(25)
set @fim=left(@nome,charindex(' ',@nome)) --Pegar o primeiro nome
set @aux=@fim --Inicializa variável
set @aux2='' --Inicializa variável
while len(@aux)>0 --Enquanto tem nomes do meio
begin
set @aux=left(@nome,charindex(' ',@nome)) --pega primeiro nome
set @nome=ltrim(replace(@nome,@aux,'')) --remove primeiro nome
if charindex(' ',@nome)>4--exclui de,da,dos(da silva, dos santos..)
begin
set @aux2=@aux2+substring(@nome,1,1)+'. ' --Abrevia com .
end
end
select @fim=@fim+@aux2+@nome --concatena tudo(primeiro nome+abreviações+último nome)
RETURN ( @fim )
END
GO
--Verificar nomes
select --top 10
nome,nome_abreviado,
dbo.Abrevia(nome) teste_funcao
from pessoas
where tipo=2 --Pessoas físicas
order by nome
--Ajustar nomes abreviados (update)
update pessoas set nome_abreviado=dbo.Abrevia(nome)
where tipo=2 --Pessoas físicas
Resultado:
nome | nomereduzido | teste_funcao
Abadia da Silva Naves | NULL | Abadia S. Naves
É isso aí, deve ter jeitos mais elegantes de fazer isso mas na pressa foi a solução que encontrei.
Fique à vontade para alterá-la de acordo com suas necessidades e não esqueça de comentar caso seja útil!
Mostrando postagens com marcador truques tricks tilts bd. Mostrar todas as postagens
Mostrando postagens com marcador truques tricks tilts bd. Mostrar todas as postagens
sábado, 27 de setembro de 2008
quarta-feira, 20 de agosto de 2008
Flashback query (Oracle)!
Se você é nerd e trabalha na área de banco de dados como nós, já deve ter se deparado com algumas situações inusitadas.
Por exemplo, são 8:02 da manhã e vc ainda ta tentando acordar tomando 500ml de café puro quando seu diretor entra na sala parecendo uma vaca louca e gritando "rápido, delete aqueles preços que estão aparecendo no site porque tá tudo errado!!vou verificar no setor de faturamento e já volto aqui, mas apague tudo agora!".
Vc ainda sonolento prepara e executa o script no Oracle depois de ser xingado pelo diretor por ter perguntado 4 vezes se ele tem certeza que quer que apague tudo:
sql>delete from precos;commit;
ou então
sql>update precos set precos.valor='';commit;
5 minutos depois ele volta gritando desesperadamente pra vc não apagar ou desfazer pois só tinha um erro de 1 centavo em 1 preço. E agora? Como você resolve isso se o backup foi feito antes da atualizaçao dos preços?
Não se preucupe!Primeiro coloque várias dificuldades e reclame da falta de organização da empresa e peça um aumento por isso, dpois, se ainda tiver vida e emprego, torça pro DBA ter habilitado (ou mantido) o ARCHIVELOG do banco e rode o sequinte script:
sql>insert into precos
select * from precos
as of timestamp
to_timestamp('20/08/2008 08:10:06','dd/mm/yyyy:hh24:mi:ss') ;
commit;
Onde como vc deve ter percebido, a data e hora você coloca antes de ter feito a besteira e vc pode colocar condições (where preco.valor>1000, por exemplo) o que seria necessário caso vc prefira fazer um update.
Se funcionar meus parabéns! Você acabou de aprender como funciona o flashback query no oracle, também conhecido como "Mantém pescoços" ou "Anulador de índices de desempregos".Caso não tenha funcionado, provavelmente o ARCHIVELOG do banco está desativado... nesse caso acenda uma vela pro seu santo protetor ou leve seu salário em alguma dessas igrejas que "trocam" milagres por dinheiro....e se sair dessa intacto, ATIVE O ARCHIVELOG!! Assim na próxima vc escapa ileso..
Como ativar o ARCHIVELOG? Google! Onde também tem mais informações sobre flashback...qd eu tiver com disposição posto um howto aqui...
Por hora é só, e não encham o saco pq estou de mal humor...(ressaca de ver o Brasil perder de 3x0 pra Argentina nas Olimpiadas...ninguém merece...)
Por exemplo, são 8:02 da manhã e vc ainda ta tentando acordar tomando 500ml de café puro quando seu diretor entra na sala parecendo uma vaca louca e gritando "rápido, delete aqueles preços que estão aparecendo no site porque tá tudo errado!!vou verificar no setor de faturamento e já volto aqui, mas apague tudo agora!".
Vc ainda sonolento prepara e executa o script no Oracle depois de ser xingado pelo diretor por ter perguntado 4 vezes se ele tem certeza que quer que apague tudo:
sql>delete from precos;commit;
ou então
sql>update precos set precos.valor='';commit;
5 minutos depois ele volta gritando desesperadamente pra vc não apagar ou desfazer pois só tinha um erro de 1 centavo em 1 preço. E agora? Como você resolve isso se o backup foi feito antes da atualizaçao dos preços?
Não se preucupe!Primeiro coloque várias dificuldades e reclame da falta de organização da empresa e peça um aumento por isso, dpois, se ainda tiver vida e emprego, torça pro DBA ter habilitado (ou mantido) o ARCHIVELOG do banco e rode o sequinte script:
sql>insert into precos
select * from precos
as of timestamp
to_timestamp('20/08/2008 08:10:06','dd/mm/yyyy:hh24:mi:ss') ;
commit;
Onde como vc deve ter percebido, a data e hora você coloca antes de ter feito a besteira e vc pode colocar condições (where preco.valor>1000, por exemplo) o que seria necessário caso vc prefira fazer um update.
Se funcionar meus parabéns! Você acabou de aprender como funciona o flashback query no oracle, também conhecido como "Mantém pescoços" ou "Anulador de índices de desempregos".Caso não tenha funcionado, provavelmente o ARCHIVELOG do banco está desativado... nesse caso acenda uma vela pro seu santo protetor ou leve seu salário em alguma dessas igrejas que "trocam" milagres por dinheiro....e se sair dessa intacto, ATIVE O ARCHIVELOG!! Assim na próxima vc escapa ileso..
Como ativar o ARCHIVELOG? Google! Onde também tem mais informações sobre flashback...qd eu tiver com disposição posto um howto aqui...
Por hora é só, e não encham o saco pq estou de mal humor...(ressaca de ver o Brasil perder de 3x0 pra Argentina nas Olimpiadas...ninguém merece...)
Assinar:
Postagens (Atom)