【发布时间】:2016-01-15 00:41:57
【问题描述】:
我编写了这个程序,旨在根据订单详细信息中的 pno 和 ono 单独删除项目。删除的项目将相应地放入表 RECORDS 和 REMOVED_ODETAILS 中。一个订单多次购买的某些商品,以及每个商品的购买编号,即 QTY。我的问题是如何从 odetails 中减少多次订购商品的 QTY -1 并增加 QTY REMOVED_ODETAILS +1?
create or replace PROCEDURE ONE_BY_ONE( ORD_NUM IN NUMBER(5), PRO_NUM IN NUMBER(5), QUANTITY NUMBER(5))
AS
CURSOR CUR1
IS
SELECT * FROM ORDERS
WHERE ONO = ORD_NUM;
CURSOR CUR2
IS
SELECT * FROM ODETAILS
WHERE PNO = PRO_NUM
AND ONO = P_ONO;
VAL1 CUR1%ROWTYPE;
VAL2 CUR2%ROWTYPE;
BEGIN
OPEN CUR1;
OPEN CUR2;
LOOP
FETCH CUR1 INTO VAL1;
FETCH CUR2 INTO VAL2;
EXIT WHEN CUR1%NOTFOUND;
EXIT WHEN CUR1%NOTFOUND;
IF VAL1.SHIPPED IS NOT NULL THEN
IF PRO_NUM = VAL2.PNO AND ORD_NUM = VAL2.ONO THEN
IF ( VAL2.QTY > QUANTITY) THEN
FOR R IN (SELECT ONO, PNO FROM REMOVED_ODETAILS) LOOP
--CODE NOT CHECK TO INSERT OR UPDATE ON REMOVED_ODETAILS
IF (R.ONO != ORD_NUM AND R.PNO != PRO_NUM) THEN
INSERT
INTO REMOVED_ODETAILS
(
ONO,
PNO,
QTY
)
VALUES
(
VAR_CUR2.ONO,
VAR_CUR2.PNO,
VAR_CUR2.QTY
);
ELSE
UPDATE REMOVED_ODETAILS SET QTY = QTY - QUANTITY WHERE ONO = ORD_NUM AND
PNO =PRO_NUM;
END IF;
END LOOP;
INSERT INTO RECORDS(ID_NUMBER, ONO,CNO,DATE_SEND,CONDITION)
VALUES(Seq.NEXTVAL, VAL1.ONO,VAL1.CNO,SYSDATE,'SEND BACK');
ELSIF (VAL2.QTY = QUANTITY ) THEN
INSERT INTO RECORDS(ID_NUMBER, ONO,CNO,DATE_SEND,CONDITION)
VALUES(Seq.NEXTVAL, VAL1.ONO,VAL1.CNO,SYSDATE,'SEND BACK');
INSERT INTO REMOVED_ODETAILS( ONO, PNO, QTY)
VALUES(VAR_CUR2.ONO,VAR_CUR2.PNO, VAR_CUR2.QTY);
DELETE FROM ODETAILS WHERE ONO = ORD_NUM AND `enter code here`PNO = PRO_NUM;
END IF;
DBMS_OUTPUT.PUT_LINE('Item will be send back ');
DELETE FROM ORDERS
WHERE ONO = ORD_NUM and
NOT EXISTS (select 1 from ODETAILS where ONO = ORD_NUM );
ELSIF VAL1.SHIPPED IS NULL THEN
DBMS_OUTPUT.PUT_LINE('DO NOTHING ');
END IF;
END LOOP;
CLOSE CUR1;
CLOSE CUR2;
END ONE_BY_ONE;
客户
create table customers (
cno number(5) not null primary key,
cname varchar2(30),
street varchar2(30),
zip number(5) references zipcodes,
phone char(12));
员工
create table employees (
eno number(4) not null primary key,
ename varchar2(30),
zip number(5) references zipcodes,
hdate date);
订单
create table orders (
ono number(5) not null primary key,
cno number(5) references customers,
eno number(4) references employees,
received date,
shipped date);
详细信息
create table odetails (
ono number(5) not null references orders,
pno number(5) not null references parts,
qty integer check(qty > 0),
primary key (ono,pno));
记录
create table RECORDS
id_number number(5) not null primary key,
ono number(5) not null,
cno number(5) not null,
date_send date,
condition varchar22(30));
REMOVED_ODETAILS
create table REMOVED_ODETAILS (
ono number(5) not null,
pno number(5) not null,
qty integer check(qty > 0),
primary key (ono,pno));
之前
订单
ONO CNO ENO RECEIVED DATE SHIPPED DATE
---------- ---------- ---------- ----------- ----------
1112 7000 1004 02-JAN-16 20-DEC-15
1113 12345 2002 10-JAN-16 15-DEC-15
1114 12345 2002 09-JAN-16 14-DEC-15
详细信息
ONO PNO QTY
---------- ---------- ----------
1112 12345 3
1112 98766 3
1113 12345 2
1114 12345 1
预期答案(当给出特定的 ono/pno 组合时)
记录
ID_NUMBER ONO CNO DATE_SEND CONDITION
------------ ------- -------- ---------- --------
10001 1112 7000 13-JAN-16 SEND BACK
10002 1112 7000 13-JAN-16 SEND BACK
10003 1112 7000 13-JAN-16 SEND BACK
10005 1113 12345 14-JAN-16 SEND BACK
10006 1114 12345 14-JAN-16 SEND BACK
REMOVED_ODETAILS
ONO PNO QTY
------- ------ ------
1112 12345 2
1112 98766 1
1113 12345 1
1114 12345 1
详细信息
ONO PNO QTY
---------- ---------- ----------
1112 12345 1
1112 98766 2
1113 12345 1
订单
ONO CNO ENO RECEIVED DATE SHIPPED DATE
---------- ---------- ---------- ----------- ----------
1112 7000 1004 02-JAN-16 20-DEC-15
1113 12345 2002 10-JAN-16 15-DEC-15
【问题讨论】:
-
如果您能提供创建表和插入语句会有所帮助,以便我们可以复制您的表并自己测试。如果您在程序运行后提供了您希望看到的预期输出,这也会有所帮助。
-
我希望我已经解释得够多了!
-
很遗憾,您提供的额外信息不足以让我们仅运行您的代码。这就是为什么我要求创建表脚本(包括约束定义,例如主键和外键)和插入语句。想象一下,您不是提出这个问题的人,而是一个无法访问数据库但想要提供帮助的人。您认为您需要哪些信息才能尝试提供帮助?最好的问题带有一个完整的测试用例,其他人可以自己使用和运行,让他们可以玩弄代码直到它工作。
-
如何将我的表格脚本传递给您?如果可以的话,我们可以通过聊天来完成吗?
-
只需编辑您的问题并在其中添加信息。如果您使用表/数据的精简版也没关系,只要它们包含足够的信息让我们能够运行您的代码。