Encontrando registros duplicados

Um colega meu veio me questionar como encontrar campos duplicados no oracle, segue um passo a passo de como posso encontrar estes registros.

Primeiramente fiz uma tabela de exemplo bem simples;

CREATE TABLE T1 
    (CODIGO NUMBER(11)
    ,CPF NUMBER(14)
    ,NOME VARCHAR2(200)
    ,DT_NASC DATE);

ALTER TABLE T1 
  ADD CONSTRAINT PK_T1 
  PRIMARY KEY (CODIGO);

ALTER TABLE T1 
  ADD CONSTRAINT 
  UK_CPF_T1 UNIQUE (CPF);

E após criar a tabela populei com alguns registros.
Continue lendo em oraclehome.com.br


FAPESP-Microsoft Research abrem nova chamada

Agência FAPESP – O Instituto Virtual de Pesquisas FAPESP-Microsoft Research lançou nova chamada pública de propostas para apoio à pesquisa fundamental e de classe mundial em tecnologias de informação e comunicações.

No âmbito da chamada, a pesquisa acadêmica tem dois ingredientes essenciais: criação de novo conhecimento científico e comunicação de resultados na comunidade acadêmica mundial. Os projetos devem ter impacto por meio de: 1) pesquisa nova, criativa e interessante para o avanço das TIC; 2) Publicação e disseminação do conhecimento e de experiências para a comunidade acadêmica mundial.

As propostas devem ser apresentadas por pesquisadores de Instituições de Ensino Superior e de Pesquisa, públicas ou privadas sem fins lucrativos, no Estado de São Paulo.

O total de recursos disponível para atender às propostas selecionadas é de R$ 1 milhão. As propostas deverão considerar projetos com duração de no máximo dois anos e serão recebidas pela FAPESP até o dia 7 de agosto.

O Instituto Virtual de Pesquisas FAPESP-Microsoft Research, resultado de um convênio assinado entre as duas instituições em abril de 2007, é uma iniciativa pioneira no Brasil que associa os setores público e privado de modo a estimular a geração e a aplicação de conhecimento em TIC.

A proposta do instituto é formar uma rede de pesquisadores capazes de criar novos conhecimentos que contribuam para expandir as capacidades da tecnologia de computação para atender mais e melhor às questões-chave para beneficiar as pessoas, a sociedade e a sustentabilidade do planeta.

Mais informações sobre a chamada e o convênio: www.fapesp.br/convenios/microsoft


Funções analiticas LAG/LEAD

Ambas as funções tem como sua sintaxe parecidas:

  1. LAG (value_expression [,offset] [,DEFAULT]) OVER ([query_partition_clase] order_by_clause)
  2. LEAD (value_expression [,offset] [,DEFAULT]) OVER ([query_partition_clase] order_by_clause)

LAG

Esta é uma função analitica. Que provem o acesso a mais que um registro de uma tabela ao mesmo tempo sem precisar fazer um join na própria tabela self join. A busca irá retornar uma ou mais registros anteriores a da possição atual (current). Continue lendo →


Fake/Virtual Index (Indice Virtual)

Após muitas leituras sobre tuning e performance, achei algo interessante e rápido para postar aqui no site e que possa ser muito util para os programadores e administradores de Banco Oracle.
Preciso melhorar a performance do meu SQL, será que esse indice vai me ajudar?

Uma boa pergunta, pois até então criar um indice em uma tabela sempre há um custo.
Porem como irei saber se aquele indice vai ser útil mesmo sem poder testar na prática?
Uma das novas features do 11g é criar indices invisiveis, não interferindo no ambiente(produção como no exemplo), uhuuuu claro estou dizendo em produção nada em ambiente teste, pois nem todo mundo tem essa maravilha que é um ambiente de teste bom e legal p/ testar sua aplicação.
Ai vem o X da questão, nas versões anteriores(8i, 9i e 10g) não tem nada para nos ajudar?
Isso mesmo lendo um bucado achei o FAKE INDEX ou VIRTUAL INDEX.

Ok, agora vou mostrar com um exemplo simples do seu funcionamento.

1. Lembrando que esta prática serve para o Oracle informar, se o indice a ser criado, realmente será usado pelo otimizador e seu custo.
2. Ao ser criado, estara somente no dicionario de dados e não será criado o indice mesmo, não haverá segmentos (NOSEGMENT).
3. Há um parametro não documentado pela oracle, que faz parte do Oracle Enterprise Manager Tuning Wizard para que esta pratica seja bem sucessida.

Ex.:
Tabela teste com 398698 registros Continue lendo →


Query’s SQL para XML

Rapidinha: O oracle tem como default a função de transformar query's sql para XML

Exemplo:

  1.  
  2. SET long 5000
  3. SET pagesize 5000
  4. SET linesize 132
  5. SELECT
  6. dbms_xmlgen.getxml(SELECT * FROM user_tables’) XMLQUERY
  7. FROM dual;
  8.  

Pivot ou CrossTab (invertendo linhas em colunas)

Imagine você está tentando para criar um jogo de resultados onde os registros precisam ser colunas, ou vice-versa.
A essência, você precisa "girar" os registros em colunas, ou vice-versa.
Muitas vezes há relatorios que exigêm isto e para que não precisarmos de criar functions ou qualquer outra coisa para solucionar isso podemos usar o chamado pivot ou crosstab queries.

Uma questão de pivot simples é realizada fazendo o seguinte:
1. Acrescente algum tipo de conta ou número de fila ao seu questionamento, se necessário para o agrupamento;
2. Então use sua query original como uma sub-query;
3. Use "decode" para se transformar os registros em colunas;
4. Use "MAX ou SUM" para "agrupar" os registros múltiplos em únicas coluna. E não pode ser esquecido de agrupar.

Exemplo prático: Continue lendo →


Criptografando em MD5 no Oracle

Esses dias um cliente me solicitou algo para criptografar senhas, já conhecia a package dba_obfuscation_toolkit e ai fui pesquisar mais sobre e achei uma forma otima para criptografar a senha em MD5, assim fiz a função dentro do owner do sistema que faz esta conversão:

  1. v_input VARCHAR2(2000) := valor;
  2. hexkey VARCHAR2(32) := NULL;
  3. hexkey := RAWTOHEX(DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_RAW.cast_to_raw(v_input)));
  4. RETURN NVL(hexkey,'');
  5.  

Exemplo da utilização:

  1. sql> SELECT md5('senhadorafael') FROM dual;
  2. 70CB17EBF6A8DF8525016F7866075794
  3.  

Falha de injeção HTML no GTalk

Em meados de 1997, um israelense criou o ICQ, então programinha desconhecido que fazia com que pessoas de qualquer lugar do planeta se comunicasse instantaneamente [fora o delay]. Em 1999, prevendo a expansão do mercado de comunicadores instantâneos, a Yahoo comprou a Mirabilis [empresa do ICQ] e assim, a Microsoft, para não perder tempo, criou o MSN para concorrer com o Yahoo que já tinha o ICQ _o mais usado na época_ e o seu AIM.

Logo, um pouco mais tarde [6 anos], a prodígio com ares de 'dona da internet' [Google] lançou mais um serviço para concorrer com a Yahoo e a MS; era o GTalk, comunicador instantâneo que apostava na tecnologia VoIP. Com um visual limpo, carregamento rápido e recursos simples, mas bem trabalhados, conseguiu tirar um pouco da fatia desse mercado, que até hoje a Microsoft abocanha com o seu MSN.

O especialista em segurança, Alec Storm, que trabalha para o site syhunt.com, declarou que achou um erro no GTalk. Erro de injeção HTML quando se envia um arquivo para a pessoa. Executando o código, mesmo não aceitando o arquivo. Já que o GTalk desenha a janela do chat em HTML usando um plugin do navegador da Microsoft [IE].

Usando o IESpy [18kb] para visualizar o código fonte de qualquer aplicativo _até o próprio Internet Explorer_ usando o plugin do mesmo para visualização de páginas web.

O erro ocorre, quando se recebe um arquivo com uma extensão específica e com um código HTML malicioso. Causado no atributo DXImageTransform, contido no código da página, especificamente, onde o ícone de mostragem do tipo de arquivo a ser recebido.

Aqui está o código conseguido com a ajuda do IESpy, no ato do recebimento de um arquivo malicioso.

Fonte: C9 Security Blog


Benchmark de velocidade com diversas linguagens

Como de costume estava lendo hoje alguns posts sobre PHP e tals. achei esse muito interessante:

um benchmark simples, envolvendo diversas linguagens: C, C++, AWK, Perl, Python, Ruby, Lua, Java, JavaScript, C# .NET. Apesar de simples, ele revelou resultados interessantes.

Para ter mais detalhes sobre o teste pode acessar o site PHPAvançado.net que irá ter o artigo na integra, mas o mais legal que o nosso PHP está ai na frente...

Fonte: PHPAvançado.net


Parte 2 – Smarty PHP

2. Smarty PHP para programadores PHP

Agora vou entrar em mais detalhes técnicos, como instalar, configurar e sair usando.

2.1 Instalação

Primeiro baixe a ultima versão do smarty, descompacte todas as pastas. Eu crio dentro
da minha aplicação uma pasta smarty onde tem que ter a pasta libs para funcionar corretamente o smartyPHP.

2.2 Organizando a casa

  /            - raiz, onde estarão os seus aplicativos em php
  /cache       - caso queira aplicar cache na sua aplicação esta é a pasta onde ficará o arquivo de cache (chmod 755)
  /configs     - pasta onde ficará os arquivos de configurações, do tipo, nome do site(title) entre outras coisas.
  /templates   - pasta onde o WebDesigner vai trabalhar, mais propriamente dito como o diretório dos templates (HTML's)
  /templates_c - pasta onde o ficará a compilação do template + php, onde o proprio smarty irá gerar os arquivos ali listados. (chmod 755)

2.3 Configuração básica
Vou mostrar de uma forma mais complexa/simples para que depois o desenvolvimento do site funcione mais tranquilamente, fez uma vez nao
há necessidade de alterar tudo novamente.
«---- config.php ----»

// Diretório onde vão estar as bibliotecas do smarty
define(SMARTY_DIR,'/sitepedidos/smarty/libs/');
// Biblioteca do smarty
require_once(SMARTY_DIR.'Smarty.class.php');

/* Função de construção do objeto
Setando alguns parametros para o smartyPHP
caching -> habilitando o cache
cache_lifetime -> tempo de vida do cache
compile_check -> sempre antes de compilar para a tela ele faz uma checagem dos fontes
debugging -> mostra ao WebDesigner as variáveis que ele poderá utilizar
*/
function Smarty_Site() {
$sBasedir = '/sitepedidos/';
$this->Smarty();
$this->template_dir = $sBasedir."templates/";
$this->compile_dir = $sBasedir."templates_c/";
$this->cache_dir = $sBasedir."cache/";
$this->config_dir = $sBasedir."configs/";
$this->caching = false;
$this->cache_lifetime = 0;
$this->compile_check = true;
$this->debugging = true;
}

/* Função de display, melhor dizendo o relacionamento entre o TPL e o PHP */
function show(){
preg_match('/^(.*)\.php$/', basename($_SERVER['SCRIPT_FILENAME']), $r);
$tela = $r[1];
$this->assign('tela', $tela.".tpl");
$this->display('fixo/site.tpl'); // Vou utilizar o site.tpl como a cara do site, mais para frente eu explico melhor.
}
}

// Criação do objeto e pronto para ser utilizado.
$smarty =new Smarty_Site();

Agora que já fizemos o nosso arquivo de configuração para o smarty funcionar, vamos fazer o nosso primeiro index.php

«---- index.php ----»

require_once('./config.php');

// Declaracao das variaveis para o webDesigner
$smarty->assign('nome','Rafael Stoever');

$smarty->show();

Feito isso, temos que falar com o nosso webdesigner para ele fazer o template(HTML).
«---- index.tpl (este arquivo vai ficar dentro da pasta templates) ----»

Este é o meu nome: {$nome}

Ah e tem um cara que é o principal, o que nao muda nunca, o site.tpl, esse site.tpl que está configurado lá no nosso config.php é o corpo do site, aquela parte que nunca muda.

«---- index.tpl ----»

 


{include file=$tela}

E ai está agora conforme o arquivo.php ele vai dar um include no arquivo.tpl ao mesmo tempo que fizeres um php vais programar um template para este.
Simples ? se tiver dúvidas soh comentar.