PL / SQL执行问题

问题描述 投票:0回答:2

我已经完成了编译和执行的程序,但是我没有像我想的那样从我的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')
oracle stored-procedures plsql
2个回答
0
投票

你已经声明了一些变量,但从未在其中加入任何值,所以我从代码中删除了所有变量。

因此,IF ir_orderSameDay > 0 THEN(以及... = 0)将永远不会为真,因为IR_ORDERSAMEDAY为NULL,而NULL不大于也不等于任何东西。

我认为你应该在SELECT语句中包含一些其他值(正如我在下面的例子中所做的那样)。

另外,我建议你在INSERT INTO语句中列出你要插入的所有列 - 它使事情变得更清楚。

截至你提到的“约会”价值 - 你错了。您可能会将其视为'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'));

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'));
© www.soinside.com 2019 - 2024. All rights reserved.