Ниже я использую простой пример, реальные таблицы больше, я не могу хранить устройства в одной таблице, я не могу объединить таблицы device1 и device2.
У меня есть три таблицы: устройство1, устройство2, компьютер (устройство3), устройство1 и устройство2 имеют идентификаторы из одной и той же последовательности, устройство3 - это компьютер. Таблица device3 может быть связана с device1 и device2 (многие-ко-многим), поэтому у меня есть две таблицы с отношениями: rel1with3 и rel2with3.
CREATE SEQUENCE device_1or2;
CREATE SEQUENCE device_3;
CREATE TABLE device1
( d_id NUMBER, d_data VARCHAR2(20)
, CONSTRAINT device1_pk PRIMARY KEY (d_id));
CREATE TABLE device2
( d_id NUMBER, d_data VARCHAR2(20)
, CONSTRAINT device2_pk PRIMARY KEY (d_id));
CREATE TABLE computer
( d_id NUMBER, d_data VARCHAR2(20)
, CONSTRAINT device3_pk PRIMARY KEY (d_id));
CREATE TABLE rel1with3
( d_id_1 NUMBER, d_id_3 NUMBER
, CONSTRAINT rel13_fk_1 FOREIGN KEY (d_id_1) REFERENCES device1 (d_id)
, CONSTRAINT rel13_fk_3 FOREIGN KEY (d_id_3) REFERENCES computer (d_id)
);
CREATE UNIQUE INDEX I_REL_13 ON rel1with3 (d_id_1, d_id_3);
CREATE TABLE rel2with3
( d_id_2 NUMBER, d_id_3 NUMBER
, CONSTRAINT rel23_fk_2 FOREIGN KEY (d_id_2) REFERENCES device2 (d_id)
, CONSTRAINT rel23_fk_3 FOREIGN KEY (d_id_3) REFERENCES computer (d_id)
);
CREATE UNIQUE INDEX I_REL_23 ON rel2with3 (d_id_2, d_id_3);
Я хочу создать хранимую процедуру с двумя параметрами (устройство1 или устройство2 в качестве первого параметра, компьютер в качестве второго) и добавить / удалить отношение (вставить / удалить строку в таблице отношений).
CREATE OR REPLACE PROCEDURE Add_Relation
( COMPUTER NUMBER
, DEVICE NUMBER
, ERR OUT NUMBER
) IS
PRAGMA AUTONOMOUS_TRANSACTION;
device_data VARCHAR2(20);
BEGIN
-- detect which device it is, insert record
-- stored procedure, the same for both device type, BUT uses device data from additional table field
WRITE_LOG(device, device_data, computer);
COMMIT;
EXCEPTION
WHEN OTHERS THEN ERR := TO_CHAR(SQLCODE);
END;
Вопрос: КАК лучше организовать это? Используете другую функцию? Используя IF-ELSE? Как быстрее выполнить и т.д.?