Вопреки ответам Мартина Драутцбурга, нет внешнего ключа для номера заказа на столе Order_Errors
. Существует столбец Ono
, который, как представляется, служит этой цели, но он не является иностранным до Oracle. Чтобы сделать его внешним ключом, вам нужно добавить ограничение, подобное Cno_FK
, на Orders
. Пример:
CREATE TABLE Order_Errors
(
Ono Number Not Null,
Transaction_Date Date Not Null,
Message VARCHAR(100) Not Null,
CONSTRAINT Order_Errors_Orders_FK FOREIGN KEY (Ono) REFERENCES Orders (Ono)
);
Или, если ваш Order_Errors
таблица уже существует, и вы не хотите, чтобы бросить его, вы можете использовать ALTER TABLE
заявление:
ALTER TABLE Order_Errors
ADD CONSTRAINT Order_Errors_Orders_FK FOREIGN KEY (Ono) REFERENCES Orders (Ono)
;
Что касается процедуры, я склонный сказать, что вы пытаетесь сделать, не поддается хорошо PROCEDURE
. Если вы хотите, чтобы строка использовала значения по умолчанию при вставке, триггер лучше подходит для этой цели.(Существует некоторое падение производительности, чтобы с помощью триггера, так что это соображение.)
-- Create sequence to be used
CREATE SEQUENCE Order_Number_Sequence
START WITH 1
INCREMENT BY 1
/
-- Create trigger for insert
CREATE TRIGGER Orders_Insert_Trigger
BEFORE INSERT ON Orders
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.Ono IS NULL
THEN
SELECT Order_Number_Sequence.NEXTVAL INTO :NEW.Ono FROM DUAL;
END IF;
IF :NEW.Received IS NULL
THEN
SELECT CURRENT_DATE INTO :NEW.O_Received FROM DUAL;
END IF;
END;
/
Этот триггер будет выполняться на каждой отдельной строки, вставленной в Orders
таблице. Он проверяет, был ли столбец Ono
NULL
и заменяет его идентификатором из последовательности, если это так. (Будьте осторожны, чтобы вы никогда не предоставляли идентификатор, который позже будет сгенерирован последовательностью, он получит ошибку конфликта основного ключа.) Затем он проверяет, была ли полученная дата NULL
и устанавливает ее на текущую дату, используя CURRENT_DATE
функция (которая, я считаю, была одной из вещей, которые вы пытались выяснить), если это так.
(Примечание стороны:. Другие базы данных не может требовать триггер, чтобы сделать это, и вместо того, чтобы можно было использовать значение по умолчанию, я считаю, PostgreSQL, например, позволяет использовать вызовы функций в своих DEFAULT
пунктах, и это, как его SERIAL
используется автоматический тип инкремента.)
Если вы просто пытаетесь обновить существующие данные, я бы подумал, что самим заявлениям достаточно было бы UPDATE
. Есть ли причина, по которой это должно быть PROCEDURE
?
Еще одно примечание. Order_Errors
не имеет первичного ключа. Вероятно, вы хотите иметь автоинкрементный суррогатный ключевой столбец или, по крайней мере, создать индекс в своем столбце Ono
, если вы когда-либо собираетесь выбрать этот столбец.
Почему вы хотите создать последовательность ** каждый раз, когда вы вызываете процедуру **? –