-1

我正在尝试制定一个程序,使潜在的空“已接收”字段使用当前日期。我制作了一个名为的序列Order_number_seq来填充订单号(Ono)列。我不知道如何将订单表中的错误链接到表中的条目Orders_errors

这是我到目前为止所拥有的:

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

提前致谢。

4

2 回答 2

2

与 Martin Drautzburg 的回答相反,桌子上的订单号没有外键Order_Errors。有一个Ono专栏似乎可以达到这个目的,但就 Oracle 而言,它不是外国的。要使其成为外键,您需要添加一个类似于Cno_FKon的约束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,则将其替换为序列中的 ID。(请注意,您永远不要提供稍后将由序列生成的 ID;它会出现主键冲突错误。)然后检查接收日期是否NULL为当前日期,并使用该CURRENT_DATE函数将其设置为当前日期(我相信这是你试图弄清楚的事情之一),如果是这样的话。

(旁注:其他数据库可能不需要触发器来执行此操作,而是可以使用默认值。例如,我相信 PostgreSQL 允许在其DEFAULT子句中使用函数调用,这就是其SERIAL自动增量类型的实现方式.)

如果您只是尝试更新现有数据,我认为这些UPDATE陈述本身就足够了。是否有理由需要这样做PROCEDURE

另一个注意事项。Order_Errors没有主键。Ono您可能希望拥有一个自动递增的代理键列,或者如果您只想选择该列,则至少在其列上创建一个索引。

于 2013-05-06T02:04:49.363 回答
1

您的问题中有许多令人困惑的事情:

(1) 您正在过程中创建序列。这甚至可以编译吗?

(2) 你的程序没有任何参数。它只是更新所有行的 RECEIVED 列。

(3) 您没有在 MESSAGE 列中告诉我们您想要什么。

我的印象是,在您在这里提问之前,您应该先“回到书本”。

至于你原来的问题

如何将订单表中的错误链接到 Orders_errors 表中的条目。

这已经(正确)完成了。Orders_error 表包含一个指向订单的 ONO 外键。

于 2013-05-05T22:33:21.710 回答