2013-05-05 2 views
-1

Я пытаюсь выполнить процедуру, которая делает потенциальные пустые «полученные» поля, используя текущую дату. Я сделал последовательность под названием Order_number_seq, которая заполняет номер заказа (Ono). Я не знаю, как связать ошибки в таблице заказов с записью в таблице Orders_errors.Confused with Oracle Процедура с последовательностью, связывание ошибок и заполнение нулевых полей

это то, что я до сих пор:

CREATE PROCEDURE Add_Order 
    AS BEGIN 
    UPDATE Orders 
    CREATE Sequence Order_number_seq 
    Start with 1,   
    Increment by 1; 
    UPDATE Orders SET received = GETDATE WHERE received = null; 

Эти таблицы я работаю с: стол

Заказы

(
Ono Number Not Null, 
Cno Number Not Null, 
Eno Number Not Null, 
Received Date Null, 
Shipped_Date Date Null, 
Creation_Date Date Not Null, 
Created_By VARCHAR2(10) Not Null, 
Last_Update_Date Date Not Null, 
Last_Updated_By VARCHAR2(10) Not Null, 
CONSTRAINT Ono_PK PRIMARY KEY (Ono), 
CONSTRAINT Cno_FK FOREIGN KEY (Cno) 
REFERENCES Customers_Proj2 (Cno) 
); 

и

Order_Errors стол

(
Ono Number Not Null, 
Transaction_Date Date Not Null, 
Message VARCHAR(100) Not Null 
); 

Любая помощь приветствуется, особенно при связывании ошибок таблицы заказов, чтобы создать новую запись в таблице OrderErrors.

Заранее спасибо.

+0

Почему вы хотите создать последовательность ** каждый раз, когда вы вызываете процедуру **? –

ответ

1

Есть целый ряд запутанных вещей в вашем вопросе:

(1) Вы создаете последовательность внутри процедуры. Это даже компилируется?

(2) У вашей процедуры нет параметров. Он просто обновляет столбец RECEIVED всех строк.

(3) Вы не сообщаете нам, что хотите, в столбце СООБЩЕНИЕ.

Мое впечатление, что вы должны сначала вернуться к книгам, прежде чем задавать вопросы здесь.

Что касается исходного вопроса

как связать ошибки в таблице заказов на запись в таблице Orders_errors .

Это aleady (правильно) сделано. Таблица Orders_error содержит внешний ключ ONO, который указывает на заказ.

+0

@ martin drautzburg Спасибо за помощь. Я учусь, это процесс. Я буду «ударять по книгам», как вы это выразите. –

+0

Я не могу обвинить парня в том, что он запутался и потерялся, если Oracle - это первая база данных, с которой он работал, или у него нет хорошей основы для работы. Я нахожу Oracle сбивающим с толку даже с некоторым приличным знанием реляционных принципов и некоторой работой с базами данных. – jpmc26

2

Вопреки ответам Мартина Драутцбурга, нет внешнего ключа для номера заказа на столе 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 таблице. Он проверяет, был ли столбец OnoNULL и заменяет его идентификатором из последовательности, если это так. (Будьте осторожны, чтобы вы никогда не предоставляли идентификатор, который позже будет сгенерирован последовательностью, он получит ошибку конфликта основного ключа.) Затем он проверяет, была ли полученная дата NULL и устанавливает ее на текущую дату, используя CURRENT_DATE функция (которая, я считаю, была одной из вещей, которые вы пытались выяснить), если это так.

(Примечание стороны:. Другие базы данных не может требовать триггер, чтобы сделать это, и вместо того, чтобы можно было использовать значение по умолчанию, я считаю, PostgreSQL, например, позволяет использовать вызовы функций в своих DEFAULT пунктах, и это, как его SERIAL используется автоматический тип инкремента.)

Если вы просто пытаетесь обновить существующие данные, я бы подумал, что самим заявлениям достаточно было бы UPDATE. Есть ли причина, по которой это должно быть PROCEDURE?

Еще одно примечание. Order_Errors не имеет первичного ключа. Вероятно, вы хотите иметь автоинкрементный суррогатный ключевой столбец или, по крайней мере, создать индекс в своем столбце Ono, если вы когда-либо собираетесь выбрать этот столбец.