Edited: Here is another idea using DDL and not using a trigger:
create table phonenumber ( phonenum numeric(10,0) not null, primary key (phonenum) );
Create a function to manually verify the foreign key.
CREATE OR REPLACE FUNCTION call_check(p_src NUMBER, p_dst NUMBER) RETURN VARCHAR2 DETERMINISTIC IS BEGIN FOR x IN (SELECT COUNT(*) c FROM (SELECT 1 FROM phonenumber WHERE phonenum = p_src UNION ALL SELECT 1 FROM phonenumber WHERE phonenum = p_dst)) LOOP IF xc>=1 AND xc <= 2 THEN RETURN 'OK'; END IF; END LOOP; RETURN 'NOK'; END;
If you use 11g and above add a virtual column and add validation for that column
--drop table call_record create table call_record ( URID varchar(20) not null, c_src numeric(10,0) not null, c_dst numeric(10,0) not null, call_check_col GENERATED ALWAYS AS (call_check(c_src, c_dst)), primary key (URID) ); ALTER TABLE call_record ADD CONSTRAINT call_check_con CHECK (call_check_col='OK');
Let the test
SQL> INSERT INTO phonenumber VALUES ('123'); 1 row inserted SQL> INSERT INTO call_record (urid, c_src, c_dst) VALUES ('C1', '123', '321'); 1 row inserted SQL> INSERT INTO call_record (urid, c_src, c_dst) VALUES ('C3', '123', '123'); 1 row inserted SQL> INSERT INTO call_record (urid, c_src, c_dst) VALUES ('C2', '321', '321'); INSERT INTO call_record (urid, c_src, c_dst) VALUES ('C2', '321', '321') ORA-02290: check constraint (TST.CALL_CHECK_CON) violated