2013-04-29 141 views
0

我创建了一个从三个表中删除数据的过程,这些表都与外键链接,但不会运行。这里是程序。删除程序不会运行并给出错误?

PROCEDURE remove_customer (customer_id VARCHAR2) IS 
BEGIN 
DELETE FROM order_line 
WHERE order_line.order_id = placed_order.order_id; 
DELETE FROM placed_order 
WHERE placed_order.customer_id = customer.customer_id; 
DELETE FROM customer 
WHERE customer.customer_id = remove_customer.customer_id; 
total_customers := total_customers - 1; 
END; 

这里是三个表格的结构。任何人知道我为什么会得到错

customer(
    Customer_ID INTEGER NOT NULL, 
    Country VARCHAR(15), 
    First_Name VARCHAR(30), 
    Last_Name VARCHAR(30), 
    CONSTRAINT pk_customer PRIMARY KEY (Customer_ID) 
); 


    placed_order(
    order_id INTEGER NOT NULL, 
    order_date VARCHAR(15), 
    fk1_Customer_ID INTEGER NOT NULL, 
    fk2_Employee_ID INTEGER NOT NULL, 
    fk3_order_type_id INTEGER NOT NULL, 
    CONSTRAINT pk_placed_order PRIMARY KEY (order_id) 
); 


    order_line(
    order_line_id INTEGER NOT NULL, 
    fk1_order_id INTEGER NOT NULL, 
    fk2_product_id INTEGER NOT NUL, 
    CONSTRAINT pk_order_line PRIMARY KEY (order_line_id) 
); 

这是两个错误的回归。

ORA-00904: “PLACED_ORDER” “ORDER_ID”:无效identifierCompilation失败,行30

ORA-00904: “用户”, “CUSTOMER_ID”:无效identifierCompilation失败,行32

+0

如果你还没有,我建议你在你的表上定义真正的外键。 – 2013-04-29 15:12:04

+0

H,是的那里已经定义,但感谢提醒 – 2013-04-29 15:36:14

回答

2

你不能只需在DELETE语句中引用其他表中的列即可。每条语句都需要从参数值customer_id开始。这应该做你想要的:

PROCEDURE remove_customer (customer_id VARCHAR2) IS 
BEGIN 

    DELETE FROM order_line 
    WHERE order_line.order_id in 
    (SELECT order_id FROM placed_order 
    WHERE placed_order.customer_id = remove_customer.customer_id 
); 

    DELETE FROM placed_order 
    WHERE placed_order.customer_id = remove_customer.customer_id; 

    DELETE FROM customer 
    WHERE customer.customer_id = remove_customer.customer_id; 

    total_customers := total_customers - 1; 

END; 
+0

嗨,感谢您的意思,有一件事我得到一个SQL命令没有正确结束,它是否缺少';'在第一次删除? – 2013-04-29 13:11:37

+0

是的 - 现在增加 – 2013-04-29 13:12:11

+0

当它没有的时候,它相当奇怪;它只是有这个错误,现在我已经添加它给我加载或错误? ORA-00904: “ORDER_LINE” “ORDER_ID”:无效identifierCompilation失败 PLS-00302:组件 'CUSTOMER_ID' 必须declaredCompilation失败 PL/SQL:ORA-00904: “PLACED_ORDER”“CUSTOMER_ID “:无效的标识符编译失败 有什么想法? – 2013-04-29 13:16:58