Jump to content
Vinicius Dezem

IF se existe na tabela

Recommended Posts

Boa tarde pessoa,

 

Estou com o seguinte problema : 

 

Tenho uma trigger com IF e nele preciso verificar se o new.campo existe em outra tabela para executar o insert

 

Da seguinte forma :

  IF( :new.tpfis=6 or :new.icard in (select titular from controle_aux))then
  insert into telessvr.controle_aux
  values
    (:new.icard,
     :new.titular,
     :new.grupo,
     :new.grupo1,
     :new.grupo2,
     :new.grupo3,
     :new.grupo_sab,
     :new.grupo_dom,
     :new.grupo_fer);
end if;

Porem sei que dessa forma não é possível fazer, como poderia estar fazendo esta checagem ?

Procurei por cursor ou array, porem não consegui entender muito bem como funciona.

 

Obrigado desde já.

 

 

Share this post


Link to post
Share on other sites

Use a tabela de Metadata DBA_TAB_COLUMNS , requer GRANT , se a tabela e do próprio OWNER (user) pode ser usada a USER_TAB_COLUMNS

 

https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_4146.htm#REFRN23277

 

Um exemplo com ALL_TAB_COLUMNS (outro sinônimo)

 

https://dba.stackexchange.com/questions/93137/oracle-alter-column-if-exists

 

Share this post


Link to post
Share on other sites

Bom dia Motta, obrigado pela resposta vou ver com o metodo que você falou.

 

Eu "consegui" fazer mas com um cursor .. porem chega uma hora que ele se embaralha e a tabela fica enorme.

 

Trigger criada : ela alimenta o que foi inserido na tabela controle para a tabela controle_aux, porem apenas se ela atender as condições do IF :

create or replace trigger titular
  after insert or update on telessvr.controle
  for each row
declare
  --v_titular integer;

  CURSOR c_titular IS
    select titular from controle_aux where titular is not null;
  /* DECLARANDO A VARIAVEL QUE RECEBERÁ OS REGISTROS DA TABELA */
  r_tit char(12);

begin
 
  /*ABRE CURSOR*/
  OPEN c_titular;
  LOOP
    /*LÊ UM REGISTRO DO CURSOR*/
    FETCH c_titular
      into r_tit;
    /* SAI DO LOOP CASO SEJA O FINAL DO CURSOR */

    IF (:new.tpfis = 6 or :new.icard IN (r_tit)) then
      insert into telessvr.controle_aux
      values
        (:new.icard,
         :new.titular,
         :new.grupo,
         :new.grupo1,
         :new.grupo2,
         :new.grupo3,
         :new.grupo_sab,
         :new.grupo_dom,
         :new.grupo_fer);
    end if;
    EXIT WHEN c_titular%NOTFOUND;
  END LOOP;

  /* FECHA O CURSOR */

  CLOSE C_titular;
 
  
END;

SE eu tentar fazer uma trigger para atualizar a controle de volta, irá dar erro de tabela mutante, resolvi criar uma procedure que irá rodar a cada alguns segundos  "interval : (sysdate)+0,05/(1440)" ..

 

CREATE OR REPLACE PROCEDURE SP_PERMPROVISORIO IS

vicard            telessvr.controle.icard%type;
vtitular          telessvr.controle.titular%type;
vgrupo            telessvr.controle.grupo%type;
vgrupo1           telessvr.controle.grupo1%type;
vgrupo2           telessvr.controle.grupo2%type;
vgrupo3           telessvr.controle.grupo3%type;
vgrupo_sab        telessvr.controle.grupo_sab%type;
vgrupo_dom        telessvr.controle.grupo_dom%type;
vgrupo_fer        telessvr.controle.grupo_fer%type;
vcontador         integer;
 
BEGIN
      SELECT COUNT(*) INTO VCONTADOR FROM CONTROLE_AUX;
    dbms_output.put_line('CONTADOR: ' || vcontador);

                              dbms_output.put_line('vicard : ' || vicard);
                              dbms_output.put_line('vtitular : ' || vtitular);
                              dbms_output.put_line('vgrupo : ' || vgrupo);
                              dbms_output.put_line('vgrupo1 : ' || vgrupo1);
                              dbms_output.put_line('vgrupo2 : ' || vgrupo2);
                              dbms_output.put_line('vgrupo3 : ' || vgrupo3);
                              dbms_output.put_line('vgrupo_sab : ' || vgrupo_sab);
                              dbms_output.put_line('vgrupo_dom : ' || vgrupo_dom);
                              dbms_output.put_line('vgrupo_fer : ' || vgrupo_fer);

    IF(vcontador > 0) then
      SELECT A.ICARD,
             B.ICARD,
             B.GRUPO,
             B.GRUPO1,
             B.GRUPO2,
             B.GRUPO3,
             B.GRUPO_SAB,
             B.GRUPO_DOM,
             B.GRUPO_FER
        INTO vicard,
             vtitular,
             vgrupo,
             vgrupo1,
             vgrupo2,
             vgrupo3,
             vgrupo_sab,
             vgrupo_dom,
             vgrupo_fer
        FROM TELESSVR.CONTROLE_AUX A
       INNER JOIN CONTROLE_AUX B ON A.TITULAR = B.ICARD
       WHERE ROWNUM = 1;

    END IF;

        UPDATE CONTROLE
           SET grupo     = vgrupo,
               grupo1    = vgrupo1,
               grupo2    = vgrupo2,
               grupo3    = vgrupo3,
               grupo_sab = vgrupo_sab,
               grupo_dom = vgrupo_dom,
               grupo_fer = vgrupo_fer
         WHERE ICARD = VICARD;

        COMMIT;
        
        DELETE FROM CONTROLE_AUX WHERE ICARD= VICARD OR icard = vtitular;
        
        COMMIT;
END;

 

Quando é inserido na controle as outras trigger atualizam duas vezes nela que gera 2 registros na controle_aux: (3 por causa desse if, não sei o porque)

 

image.png.64389862e75a4683381928a454bb7ff4.png

 

Eu preciso atualizar o ICARD na controle os valores das colunas grupos do numero vinculado pelo TITULAR (onde é igual do icard da segunda linha), para que os dois fiquem iguais.

Desse forma que eu fiz, onde eu errei ? ou esse realmente não é um método recomendado ?

 

Obrigado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Viniciusr9
      Boa tarde pessoal,
      basicamente eu preciso do retorno de horas entre duas datas, porém tenho condições a tratar .
      basicamente tenho 2 colunas ( dt_fim e dt_ini ) que representam data final e data inicial. Preciso da diferença entre as duas retornada em uma outra coluna (hr_ausencias) , porém a cada dia posso computar no máximo 9 horas, e desconsiderar finais de semana e feriados( esses cadastrados em uma tabela) . Seria melhor tratar isso com uma Trigger , um Script PL/SQL , como me sugerem? Agradeço quem puder ajudar.
    • By edvaldo joviano de paula
      Prezados, boa tarde!
      Preciso de uma ajuda sendo possível:
       
      Tenho o seguinte cenário em uma consulta ( formação de kits de produtos tendo como produto principal um valor igual, ex: produto 1 é formado pelos produtos 2 e 3)
      select codkit, produtos from kit where codkit = 1
      ---   ----
      1    2
      1    3
      Percebem que o resultado traz o codigo do kit (1) e os produtos que compoem este kit (2,3), porem o produto 2 tambem faz parte do kit 4 junto com o produto 10 e produto 3 faz parte do kit 5 junto com o produto 11 sendo:
      kit 1 (2,3)
      kit 4 (2,10)
      kit 5 (3,11).
       
      Eu preciso de uma ajuda sobre alguma função que ao comprar os produtos 2 e 3 e estes estando na mesma nota fiscal (select produtos from notafiscal = x) traga o resultado do kit que estes dois produtos juntos formam, exemplo, ao pesquisar (select produtos from notafiscal = x) nesta nota existir os produtos 2 e 3 traga o resultado 1, se na nota existir os produtos 2 e 10 traga o resultado 4 e se existir na consulta dos itens da nota os itens 3 e 11 o resultado seja 5. Caso na pesquisa eventualmente existir por exemplo 10 unidades do item 2, 5 unidades do item 3 e 5 unidades do item 10, o resultado deve ser 1 e 4 pois 5 unidades do 2+5 unidades do 3 forma o kit 1 e 5 unidades do 2+ 5 unidades do 10 formam o kit 4.
       
      Espero ter explicado de forma a ser entendido e agradeço a ajuda.
       
    • By Viniciusr9
      Boa tarde pessoal,
      Sei que tem varios tópicos sobre esse erro, porém analisei todos e nenhum foi aplicável ao meu caso ( a maioria era porquê o pessoal esquecia do Group By ao final das Querys) . 
      Se alguém puder ajudar, agradeço . Os campos sem função estão inseridos no group by, porém o erro persiste .
       
       

       
      SELECT * FROM( select LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO, E.DS_EQUIPE as EQUIPE, SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO" from EQUIPE E, COLABORADOR C1, COMPETENCIA C, COMPETENCIA_COLABORADOR CC, AUSENCIAS AU where E.CD_EQUIPE=CC.CD_EQUIPE and C.CD_COMPETENCIA=CC.CD_COMPETENCIA and C1.CD_COLABORADOR=CC.CD_COLABORADOR and C1.STATUS = 1 AND C1.CD_GESTOR <> C1.CD_COLABORADOR AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR GROUP BY E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA ) VT WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))  
    • By massaotoda
      estou tentando fazer a conexão ao banco de dados oracle 11g no delphi 10.2 pelo fireDAC e está reportando o seguinte erro ao conectar:
      [FireDAC][Phys][Ora] Ora-12546: TNS: permission denied.

      já mandei para o DBA para verificar e ainda não consegui o retorno, fiz o teste conectando em outro banco de dados por exemplo do firebird e conectou ok...

      Alguém saberia me disse qual seria esta permissão para resolver o problema???
    • By Kikardo
      Pessoal, minha dúvida é bem simples, mas sou iniciante e estou com dificuldade de implementar.
      Eu tenho este código, que quando o botão é apertado, ele muda o estado1 para ligado, isso esta funcionando.
      Eu preciso criar uma funcão que, quando o estado1 estiver como ligado, ele mostre uma imagem dentro de uma outra div.
      Então terei vários botões iguais a esse, e quando por exemplo o estado 1 2 3 4 estiverem ligados, aparecerá uma imagem, quando o botao 1 2 3 4 e 5 aparecerá outra imagem.
      Tentei com if, mas não deu certo, pois estou iniciando em JS e HTML.
      Se alguém puder me dar uma ajuda.
      Obrigado.
      <script> var onoff1 = document.getElementById('onoff1'); var estado1 = document.getElementById('estado1'); onoff1.addEventListener('change', function() { estado1.innerHTML = this.checked ? 'ligado' : 'desligado'; }); </script> <html> <div> <input type="checkbox" class="toggle" id="onoff1"> <label for="onoff1"></label> </div> <p id="estado1">desligado</p> // quando clico no botão ele muda esse estado para ligado </html>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.