Buenas pessoal!
Seguinte. Tem um projeto em q criei uma tabela para cadastro de dentistas. Nesta tabela consta o código (gerado por uma sequence), nome do dentista e a sua especialidade (list item). Na hora de cadastrar o dentista sem stress, o negócio funciona perfeito. O problema q encontro é q eu não estou conseguindo montar uma restrição para q o mesmo dentista não seja cadastrado novamente com a mesma especialidade. seria como duplicar informação porém com outro código, entendem?
Até montei aqui uma query porém sem êxito algum, segue ela:
Declare
Cursor cInserir is (Select NOME_DENTISTA
,ESPECIALIDADE
From CO_DENTISTAS);
rInserir cInserir%rowtype;
Begin
Open cInserir;
Loop
Fetch cInserir into rInserir;
Exit when cInserir%notfound;
If (:CO_DENTISTAS.NOME_DENTISTA = rInserir.NOME_DENTISTA)
and (:CO_DENTISTAS.ESPECIALIDADE = rInserir.ESPECIALIDADE)
Then
message ('Atenção: Dentista já cadastrado nesta especialidade.');
message ('Atenção: Dentista já cadastrado nesta especialidade.');
raise form_trigger_failure;
End If;
End Loop;
Close cInserir;
End;
Se alguém aí puder me dar uma luz eu agradeço e muito!
Select count(*)
into vCont
From CO_DENTISTAS x
where (:CO_DENTISTAS.NOME_DENTISTA = x.NOME_DENTISTA)
and (:CO_DENTISTAS.ESPECIALIDADE = x.ESPECIALIDADE)
if (nvl(vCont,0) >= 1) then
raise form_trigger_failure;
end if;
No seu caso você está validando pelo nome, aí Pedro será diferente de PEDRO, talvez seja o caso de forçar um UPPER nos campos...
DECLARE
V_REG NUMBER;
BEGIN
SELECT COUNT(*)
INTO V_REG
FROM CO_DENTISTAS T
WHERE NOME_DENTISTA = :T.NOME_DENTISTA AND
ESPECIELIDADE = :T.ESPECIALIDADE;
IF V_REG > 0 THEN
MESSAGE('Dentista já cadastrado para a especialidade');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
Ou pode criar uma trigger de banco memo, depois é só tratar o erro ao mostrar para o usuário.
CREATE OR REPLACE TRIGGER NOME_TRIGGER
BEFORE INSERT ON CO_DENTISTAS
FOR EACH ROW
DECLARE
V_REG NUMBER(5);
BEGIN
SELECT COUNT(*)
INTO V_REG
FROM CO_DENTISTAS WHERE NOME_DENTISTA = :NEW.NOME_DENTISTA AND ESPECIELIDADE = :NEW.ESPECIELIDADE;
IF V_REG > 0 THEN
RAISE_APPLICATION_ERROR(-20000,'Dentista já cadastrado para a especialidade');
END IF;
END;