PL / SQL执行问题

时间:2018-04-22 19:39:38

标签: oracle stored-procedures plsql

我已经完成了编译和执行的程序但是我没有像我想的那样从我的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')

2 个答案:

答案 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'));