我已经完成了编译和执行的程序但是我没有像我想的那样从我的IF语句中将任何信息插入到我的PURCHASEORDERS表中。有人能告诉我这个问题是什么吗?谢谢!
CREATE OR REPLACE PROCEDURE placeorder (inputDate IN DATE)
AS
CURSOR C1 IS
SELECT ir.itemId, ir.ORDERSAMEDAY, ir.ORDERNEXTDAY FROM INVENTORYREPORT ir WHERE
ir.REPORTDATE = inputDate;
new_orderType PURCHASEORDERS.ORDERTYPE%TYPE;
ir_orderSameDay INVENTORYREPORT.ORDERSAMEDAY%TYPE;
ir_orderNextDay INVENTORYREPORT.ORDERNEXTDAY%TYPE;
ir_itemID INVENTORYREPORT.ITEMID%TYPE;
ir_pono CHAR(12 BYTE);
ir_poDate DATE;
ir_poQuantity NUMBER(6,0);
BEGIN
FOR PURCHASEORDERS IN C1 LOOP
IF ir_orderSameDay > 0 THEN
INSERT INTO PURCHASEORDERS VALUES (ir_pono, ir_poDate, ir_itemID, ir_poQuantity, '',
'same_day');
dbms_output.put_line('orderType: ' || 'Same Day');
END IF;
IF ir_orderSameDay = 0
THEN INSERT INTO ERROR_TAB VALUES (ir_itemID, 'No Same Day Order');
dbms_output.put_line('ItemID: ' || ir_itemID || 'No Same Day Order');
END IF;
END LOOP;
END placeorder;
/
exec placeorder('19-APR-18')
答案 0 :(得分:0)
您已经声明了一些变量,但从未向其中添加任何值,因此我从代码中删除了所有变量。
因此,IF ir_orderSameDay > 0 THEN
(以及... = 0
)将永远不会为真,因为IR_ORDERSAMEDAY为NULL,而NULL不大于也不等于任何内容。
我认为你应该在SELECT语句中包含一些其他值(就像我在下面的例子中所做的那样)。
另外,我建议您在INSERT INTO
声明中为所有要插入的列命名 - 这会让事情变得更清晰。
截至" date"值得你提及 - 你错了。您可能会将其视为' 19-APR-18',但这是字符串。如果您正在传递日期,那么您最好真正做到这一点,而不是依赖于隐式数据类型转换。
CREATE OR REPLACE PROCEDURE placeorder (inputDate IN DATE)
AS
BEGIN
FOR cur_r in (SELECT ir.itemId,
ir.ORDERSAMEDAY,
ir.ORDERNEXTDAY,
-- the next values added by LF
ir.pono,
ir.podate,
ir.poquantity
FROM INVENTORYREPORT ir
WHERE ir.REPORTDATE = inputDate)
LOOP
IF cur_r.ordersameday > 0 THEN
INSERT INTO PURCHASEORDERS VALUES
(cur_r.pono, cur_r.poDate, cur_r.itemID, cur_r.poQuantity, '', 'same_day');
dbms_output.put_line('orderType: ' || 'Same Day');
END IF;
IF cur_r.orderSameDay = 0 THEN
INSERT INTO ERROR_TAB VALUES
(cur_r.itemID, 'No Same Day Order');
dbms_output.put_line('ItemID: ' || cur_r.itemID || 'No Same Day Order');
END IF;
END LOOP;
END placeorder;
/
exec placeorder(date '2018-04-19');
or
exec placeorder(to_date('19.04.2018', 'dd.mm.yyyy'));
答案 1 :(得分:0)
@Littlefoot我已经尝试根据你的建议进行一些更改,我还为INVENTORYREPORT表转换了那个日期列,所以我的光标实际上拉了我相信的数据。它再一次编译并执行但我无法弄清楚为什么它没有在PURCHASEORDERS中插入任何行..
CREATE OR REPLACE PROCEDURE placeorder (inputDate IN DATE)
AS
BEGIN
FOR cur_r in (SELECT ITEMID,
ORDERSAMEDAY,
ORDERNEXTDAY,
BEGINNINGINVENTORYLEVEL,
REPORTDATE,
CONSUMPTIONQUANTITY
FROM INVENTORYREPORT
WHERE REPORTDATE = inputDate)
LOOP
IF cur_r.ordersameday > 0 THEN
INSERT INTO PURCHASEORDERS VALUES
(cur_r.itemid, cur_r.reportdate, cur_r.beginninginventorylevel, cur_r.consumptionquantity, '', 'same_day');
dbms_output.put_line('orderType: ' || 'Same Day');
END IF;
IF cur_r.orderSameDay = 0 THEN
INSERT INTO ERROR_TAB VALUES
(cur_r.itemID, 'No Same Day Order');
dbms_output.put_line('ItemID: ' || cur_r.itemID || 'No Same Day Order');
END IF;
END LOOP;
END placeorder;
/
exec placeorder(to_date('21-APR-18', 'DD-MON-YYYY'));