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; |