【发布时间】:2017-03-28 09:10:37
【问题描述】:
我有一个数据库来存储销售信息。我目前正在编写两个程序,一个用于插入有关销售的新细节,另一个用于更新已经存在的细节。如果用户想要插入一个已经存在的细节,我希望我的过程调用更新过程。同样,如果用户想更新一个不存在的细节,我想调用插入过程。我插入新细节的代码如下:
CREATE OR REPLACE procedure EX1.insert_detail
(id_sale IN INTEGER, id_product IN INTEGER, qty IN INTEGER)
IS
id_detail INTEGER;
mi_seq INTEGER;
u_price FLOAT;
BEGIN
BEGIN
select detail.id_sales_order_detail into id_detail from EX1.sales_order_detail detail
where detail.id_sales_order = id_sale and detail.id_prod = id_product;
END;
if id_detail is null then
select seq_sales_order_detail.nextval into mi_seq from dual;
select prod.list_price into u_price from EX1.product prod;
insert into EX1.sales_order_detail values
(mi_seq, id_sale, id_product, qty, u_price, EX1.calc_discount(qty, u_price));
BEGIN
EX1.update_costs(id_sale);
END;
else
EX1.update_detail(id_sale, id_product, qty);
end if;
END insert_detail;
要更新销售详情:
CREATE OR REPLACE procedure EX1.update_detail
(id_sale IN INTEGER, id_product IN INTEGER, qty IN INTEGER)
IS
id_detail INTEGER;
BEGIN
BEGIN
select detail.id_sales_order_detail into id_detail from EX1.sales_order_detail detail
where detail.id_sales_order = id_sale and detail.id_prod = id_product;
END;
if id_detail is null then
BEGIN
EX1.INSERT_DETAIL(id_sale, id_product, qty);
END;
else
UPDATE EX1.SALES_ORDER_DETAIL
SET ORDER_QTY = ORDER_QTY + qty
WHERE ID_SALES_ORDER = id_sale AND id_prod = id_product;
BEGIN
EX1.update_costs(id_sale);
END;
end if;
END update_detail;
我首先编译了每个过程而不调用另一个过程。完成此操作后,我重写了插入过程以调用更新过程。我编译了它,一切都很好。当我试图在我的更新过程中调用插入过程时,问题就来了。
我在编译时收到以下错误:ex1.insert_detail is invalid。但是,在编译ex1.update_detail之前,所有程序都是有效的。不知何故,让每个过程调用另一个过程会使它们都无效。
无论如何我可以做到这一点吗?还是应该只在每个过程中编写所有代码而不调用另一个?
我们将不胜感激任何有关此问题的帮助或指导。
【问题讨论】:
标签: oracle stored-procedures plsql