【问题标题】:Delete procedure wont run and gives errors?删除程序不会运行并给出错误?
【发布时间】:2013-04-23 03:44:50
【问题描述】:

我创建了一个过程来从三个表中删除数据,这些表都与外键链接但它不运行。这是程序。

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": 无效标识符编译失败,第 30 行

ORA-00904: "CUSTOMER"."CUSTOMER_ID": 标识符无效编译失败,第 32 行

【问题讨论】:

  • 如果你还没有,我建议你在你的表上定义真正的外键。
  • H,是的,已经定义了,但感谢提醒

标签: database oracle stored-procedures packages


【解决方案1】:

您不能只在 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;

【讨论】:

  • 嗨,谢谢,这是有道理的,我得到一个 SQL 命令没有正确结束的一件事,是它缺少一个';'在第一次删除?
  • hmm 没有 ; 时相当奇怪它只是有那个错误,现在我已经添加它给我负载或错误? ORA-00904: "ORDER_LINE"."ORDER_ID": invalid identifierCompilation failed PLS-00302: component 'CUSTOMER_ID' must be declaredCompilation failed PL/SQL: ORA-00904: "PLACED_ORDER"."CUSTOMER_ID": invalid identifierCompilation failed any idea?
  • 您必须确保您在语句中使用的列名与实际的列名匹配 - 例如,根据您的表定义,order_line.order_id 应该是 order_Line.fk1_order_id
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多