2013-05-05 48 views
-1

我試圖做一個過程,使潛在的空「收到」字段使用當前日期。我製作了一個名爲Order_number_seq的序列,填充訂單號(Ono)列。我不知道如何將訂單表中的錯誤鏈接到Orders_errors表中的條目。與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; 

這是我與工作表:

Orders表

(
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

爲什麼要在每次調用過程**時創建一個序列**? – 2013-05-05 22:36:50

回答

1

有一些在你的問題令人困惑的事情:

(1)在創建過程中的序列。這甚至編譯?

(2)您的程序沒有任何參數。它只是更新所有行的RECEIVED列。

(3)您並未在MESSAGE列中告訴我們您需要什麼。

我的印象是,在你問這裏問題之前,你應該先「回到書本」。

至於你原來的問題

如何在訂單錶鏈接錯誤在Orders_errors 表中的條目。

這是正確的(正確)完成。 Orders_error表包含一個指向訂單的ONO外鍵。

+0

@ martin drautzburg感謝您的幫助。我正在學習,這是一個過程。如果您願意,我會「打」這些書。 – 2013-05-05 23:10:26

+0

如果Oracle是第一個與之合作的數據庫,或者他還沒有很好的工作基礎,我不能責怪這個人感到困惑和迷失。即使有一些關於關係原理和一些數據庫工作的體面知識,我也覺得甲骨文很迷惑。 – jpmc26 2013-05-06 02:17:21

2

與Martin Drautzburg的答案相反,Order_Errors表中沒有用於訂單號的外鍵。有一個Ono列似乎是爲了達到這個目的,但就甲骨文而言,它並不是一個外國人。要使其成爲外鍵,您需要添加約Orders上的Cno_FK。舉個例子:

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,如果是,則用序列中的ID替換它。 (請注意,您永遠不會提供稍後將由序列生成的ID;它會得到主鍵衝突錯誤。)然後它會檢查接收日期是否爲NULL並將其設置爲當前日期,使用CURRENT_DATE函數(我相信它是你試圖弄清楚的事情之一),如果是的話。 (注意:其他數據庫可能不需要觸發器來做到這一點,而是可以使用默認值。例如,我相信PostgreSQL允許在其DEFAULT子句中使用函數調用,這就是它的SERIAL自動增量類型被執行。)

如果你只是想更新現有的數據,我會認爲UPDATE聲明自己就足夠了。是否有一個原因需要是PROCEDURE

另一個說明。 Order_Errors沒有主鍵。如果您只打算選擇該列,您可能希望自動增加代理鍵列,或至少在其列上創建索引。