Oracle - dicas sql

Top  Previous  Next

Atualizado em 02/10/97

---------------------------------------------------------------

Otimizações SQL 

===============

1) Todas as vezes que for utilizar um SQL que possua condições 

   de OR, é mais aconselhável e mais rápido utilizar IN

   como no exemplo: 

 

   AO INVÉS DE 

   -----------

   Select * from projint 

   where sit_projint = "DEMO1" or sit_projint = "DEMO2" 

 

   COLOQUE 

   -------

   Select * from projint where sit_projint IN ("DEMO1","DEMO2")

---------------------------------------------------------------

2) Quando existem duas ou mais condições AND juntas, 

   especifique primeiro sempre a que possui o maior limite de 

   ocorrências 

 

   AO INVÉS DE 

   -----------

   Select count(*) from pessoa 

   where sit_pessoa = 11 AND cod_munic > 1100155 

 

   COLOQUE 

   -------

   select count(*) from pessoa 

   where cod_munic > 1100155 AND sit_pessoa = 11 

---------------------------------------------------------------

3) Quando existem duas ou mais condições OR juntas, 

   especifique primeiro sempre a que possui o maior limite 

   de ocorrências 

 

   AO INVÉS DE 

   -----------

   Select count(*) from pessoa 

   where cod_munic > 1100155 OR sit_pessoa = 11 

 

   COLOQUE 

   -------

   Select count(*) from pessoa 

   where sit_pessoa = 11 OR cod_munic > 1100155 

---------------------------------------------------------------

4) Tenha cuidado com o sinal de <> 

   

   AO INVÉS DE 

   -----------

   Select count(*) from pessoa

   where cod_munic < > 1100155 

 

   COLOQUE 

   -------

   Select count(*) from pessoa

   where cod_munic < 1100155 OR cod_munic > 1100155 

---------------------------------------------------------------

Excluindo registros de uma tabela 

=================================

 

Desejo excluir registro de uma tabela que dependem da 

existência de outros de outra(s) tabela(s), como fazer? 

 

DELETE FROM <tabela1> 

 WHERE (<campo1>, <campo2>,<campo3>) 

    IN 

 (SELECT <campo1>, <campo2>,<campo3> 

   FROM <tabela1> a, <tabela2> b 

     WHERE a.<campo1> = b.<campo1> 

     AND b.<campo4> = 'AP' ) 

---------------------------------------------------------------

Selecionando registros de uma tabela que não existam 

em outra tabela 

 

(SELECT * FROM <tabela1>, <tabela2> 

  WHERE <tabela1>.<campo1> = <tabela2>.<campo1> 

    AND <tabela2>.<campo2> = 'AP' 

  MINUS 

(SELECT * FROM <tabela1>@remoto1, <tabela2>@remoto1 

  WHERE <tabela1>@remoto1.<campo1> = <tabela2>@remoto1.<campo1> 

    AND <tabela2>@remoto1.<campo2> = 'AP' 

 

obs: todos os campos retornados no SELECT secundário 

     deverá conter os mesmos campos do SELECT primário 

  

---------------------------------------------------------------

Uso da cláusula HAVING 

======================

Quando usamos a clausula GROUP BY temos por vezes a 

tendencia em usar o HAVING para especificar uma condicao 

simples como especificado abaixo: 

 

SELECT 

    META_GB.COD_PROJINT, 

    META_GB.COD_METPADRAO, 

    METAPADRAO.DES_METPADRAO, 

    METAPADRAO.COD_UNIDMED, 

    UNIDMED.SIG_UNIDMED 

FROM 

    META_GB, 

    METAPADRAO, 

    UNIDMED 

WHERE 

    ( META_GB.COD_METPADRAO = METAPADRAO.COD_METPADRAO ) and 

    (METAPADRAO.COD_UNIDMED = UNIDMED.COD_UNIDMED) 

GROUP BY 

    META_GB.COD_PROJINT, 

    META_GB.COD_METPADRAO, 

    METAPADRAO.DES_METPADRAO, 

    METAPADRAO.COD_UNIDMED, 

   UNIDMED.SIG_UNIDMED 

HAVING ( META_GB.COD_PROJINT = :Param1 ) 

 

ao inves de usar a clausula having para condicionar 

coloque esta condicao na clausula WHERE como especificado abaixo 

 

SELECT 

    META_GB.COD_PROJINT, 

    META_GB.COD_METPADRAO, 

    METAPADRAO.DES_METPADRAO, 

    METAPADRAO.COD_UNIDMED, 

    UNIDMED.SIG_UNIDMED 

FROM 

    META_GB, 

    METAPADRAO, 

    UNIDMED 

WHERE 

    ( META_GB.COD_METPADRAO = METAPADRAO.COD_METPADRAO ) and 

    (METAPADRAO.COD_UNIDMED = UNIDMED.COD_UNIDMED) and 

    ( META_GB.COD_PROJINT = :Param1 ) 

GROUP BY 

    META_GB.COD_PROJINT, 

    META_GB.COD_METPADRAO, 

    METAPADRAO.DES_METPADRAO, 

    METAPADRAO.COD_UNIDMED, 

   UNIDMED.SIG_UNIDMED 

 

obs: caso a condicionante seja de grupo esta tem que ficar 

     obrigatoriamente na clausula HAVING 

 

---------------------------------------------------------------

Bloco PL/SQL para inserção de dados 

===================================

Pergunta 

--------

Criar um bloco pl/sql que insira um novo dep na tabela s_dept 

- use a sequencia s_dept_id para o campo id da tabela 

- solicite ao usuario o nome do dep 

- insira valores nulos p/ o campo region_id 

 

Resposta 

--------

-> no banco de dados... 

create or replace 

procedure insere_departamento (v_nome char) is 

v_id  number; 

begin 

   SELECT sequenciaID.NEXTVAL INTO v_id FROM DUAL; 

   insert into tabela (id,dep,region_id) 

          values (v_id,v_nome,null); 

end insere_departamento; 

 

-> no delphi... 

- coloque o objeto TStoredProc dentro do formulario que ira disparar esta 

procedure

- no evento que voce quiser que dispare coloque o seguinte codigo: 

 var 

    v_nome : String[50]; 

    begin 

 

{caso vc queira informar o nome do departamento 

 atraves de uma caixa de dialogo} 

 

   V_nome := inputbox('Informe o nome do departamento.',

             'Depto:',''); 

   <ObjetoTStoredProc>.Params[0].AsString := v_nome; 

   {caso vc queira buscar o nome atraves de um TEdit já preenchido} 

   <ObjetoTStoredProc>.Params[0].AsString := <NomeDoTEdit>.Text; 

   <ObjetoTStoredProc>.ExecProc; 

end