Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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á.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 --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)

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