Quem me conhece, sabe que eu sempre implico com os vícios dos DBAs que iniciam a sua carreira no desenvolvimento. Mas os DBAs que começam como sysadmin também tem seus vícios. Um dos pontos fracos costuma ser a baixa familiaridade com o SQL.

Bom, vou mostrar aqui um alguns exemplos de SQLs que tive que desenvolver recentemente. Alguns foram feitos para ajudar a equipe de desenvolvimento, outros para resolverem problemas de performance e tem um que foi feito por solicitação dos  sysadmins. Na verdade, eu deveria mesmo é organizar estes scripts de uma forma lógica, mas são coisas realmente simples para merecerem tanto coidado…

Então chega de blá, blá, blá e vamos a eles:

INSERT INTO tabela2
    SELECT * FROM tabela1 t1
        WHERE campo_pk NOT IN(SELECT campo_pk FROM tabela_origem);

Você tem de carregar a tabela2, com os dados da tabela1 sem repetir os dados que já estejam lá. Utilizar o NOT IN é bem intuitivo, mas quando a tabela2 é grande, se torna um pesadelo, pois a subconsulta uma vez para cada registro na tabela1 e não consegue utilizar índices para isso. Um verdadeiro pesadelo. Então vamos a solução clássica:

INSERT INTO tabela2
    SELECT * FROM tabela1 t1
        WHERE not exists (SELECT NULL FROM tabela2 t2 WHERE t2.campo_pk = t1.campo_pk );
SELECT
        SUBSTR(nome,0,INSTR(TRIM(nome),' ')) primeiro_nome
        SUBSTR(nome,INSTR(TRIM(nome),' ',-1) + 1) ultimo_nome,
    FROM tabela_cadastro;
SELECT SUBSTR(LTRIM(regexp_replace(telefone,'[^0-9]'),0),0,10) fone_tratado
    FROM tabela_cadastro;
SELECT TRIM(email) email
    FROM tabela_cadastro
    WHERE REGEXP_LIKE (TRIM(email),'^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$','i');
SELECT
        i.instance_name,
        l.sessions_current,
        ROUND(l.sessions_current * COUNT(l.inst_id) OVER () / SUM(l.sessions_current) OVER (),2) var
    FROM gv$license l, gv$instance i
    WHERE l.inst_id = i.inst_id;

Aqui, um valor entre digamos 0,9 e 1,1 para o campo VAR significa que o nó está relativamente bem balanceado. Esta consulta foi utilizada para uma ferramenta de monitoramento do Oracle RAC.

OBS: Os scripts aqui foram escritos e testados em Oracle 10g e 11g, sorry.

Deixe uma resposta