How to code an ARC (tested with Oracle 12c)
Example "skeleton" consisting of 4 tables.


S Binder 2015


code for testing ->
<- home
/*

DROP ... statements are used here
to avoid error messages due to existing tables.

CAVEAT: Tables can only be DROPped
when they are "empty"!
DO NOT write drop table statements
for live tables
ie tables that are already populated and in use.

*/
DROP TABLE arc_ CASCADE CONSTRAINTS;
DROP TABLE arc_reftbl1 CASCADE CONSTRAINTS;
DROP TABLE arc_reftbl2 CASCADE CONSTRAINTS;
DROP TABLE arc_reftbl3 CASCADE CONSTRAINTS;

CREATE TABLE arc_ (
arcid NUMBER
, fkcol1 NUMBER
, fkcol2 NUMBER
, fkcol3 NUMBER
);

ALTER TABLE arc_ ADD CONSTRAINT arc_pk PRIMARY KEY (arcid);

CREATE TABLE arc_reftbl1 ( rpk1 NUMBER );
CREATE TABLE arc_reftbl2 ( rpk2 NUMBER );
CREATE TABLE arc_reftbl3 ( rpk3 NUMBER );

ALTER TABLE arc_reftbl1 ADD CONSTRAINT arc_reftbl1_pk PRIMARY KEY ( rpk1 );
ALTER TABLE arc_reftbl2 ADD CONSTRAINT arc_reftbl2_pk PRIMARY KEY ( rpk2 );
ALTER TABLE arc_reftbl3 ADD CONSTRAINT arc_reftbl3_pk PRIMARY KEY ( rpk3 );
ALTER TABLE arc_
ADD CONSTRAINT arc_fk1
FOREIGN KEY (fkcol1) REFERENCES arc_reftbl1( rpk1 );

ALTER TABLE arc_
ADD CONSTRAINT arc_fk2
FOREIGN KEY (fkcol2) REFERENCES arc_reftbl2( rpk2 );

ALTER TABLE arc_
ADD CONSTRAINT arc_fk3
FOREIGN KEY (fkcol3) REFERENCES arc_reftbl3( rpk3 );
/*

CHECK constraint: table arc_ only

*/
ALTER TABLE arc_
ADD CONSTRAINT check_xor
CHECK (
( fkcol1 IS NOT NULL AND fkcol2 IS NULL AND fkcol3 IS NULL )
OR ( fkcol1 IS NULL AND fkcol2 IS NOT NULL AND fkcol3 IS NULL )
OR ( fkcol1 IS NULL AND fkcol2 IS NULL AND fkcol3 IS NOT NULL )
);
code for testing ->
<- home
Last update 2025-09-22 by SB