PL SQL过程练习

时间:2018-04-20 05:53:56

标签: stored-procedures plsql

我不确定如何处理这个问题。我理解编写程序的基本语法。这是一个初学者数据库类的练习(似乎比初学者高一级)

创建一个程序,根据库存报告表中的数据为指定日期下达采购订单。

将程序命名为placeorder [程序名称很重要]。

该过程应采用一个参数:inputDate(使用PODatePURCHASEORDERS列的数据类型。接受的输入日期格式应为:'DD-MON-YYYY',例如,01-JAN-2017。

对于库存报告表中的每个原材料(其中:ReportDate与inputDate匹配),在PURCHASEORDERS表中为第二天交货订单和当天交货订单(每种原材料)单独创建一个条目最多可生成2个插入)。

  • 对应的订单类型应为next_day或same_day

  • 如果需要,只在PURCHASEORDERS中输入(插入),即if 存在原始材料和报告日期组合的条目 库存报告表。如果一天的库存报告(例如, 30-NOV-2017)orderameday属性的值为0,表示 不需要same_day订单。

如果提供的输入日期不需要订单(即,所有原材料都没有订单),请发出一条应用程序错误消息:“无需订单”(有关示例,请参阅D2L上的触发器和过程教程)如何引发此错误)。您可以使用任何合适的错误号。 您的程序应将“价格”(对于采购订单)保留为空(即,它可以保持为空)。假设它将在以后填充。

谢谢!

3 个答案:

答案 0 :(得分:0)

有很多例子如何创建程序。这是一个小小的:

CREATE OR REPLACE PROCEDURE ProcName (paraName IN VARCHAR2)
AS
    myStringVariable   VARCHAR2 (4000);
    myDateVariable     DATE;
BEGIN
    SELECT orderDateAsString
      INTO myStringVariable
      FROM orders
     WHERE orderId = paraName;

    myDateVariable := TO_DATE (myStringVariable, 'dd.mm.yyyy HH24:MI:SS'); -- '13.03.2018 23:59:59'
    dbms_output.put_line('My date: ' || myStringVariable);
END;

和一些示例代码,调用过程:

begin
    ProcName('1234');
end;

但是你应该先看看你的练习并考虑你的任务。我想,这就是你要做的事情:

  1. 创建表格。
  2. 为表创建插入语句
  3. 创建一些PL / SQL代码,用于执行带条件的插入。
  4. 将PL / SQL代码移动到过程。
  5. 使用PL / SQL块调用该过程。
  6. 为您编解说明

    如果是,您应该逐步构建代码。你有多个错误。

    1. 检查光标。 Select语句无效。
      • 你写了两个选择。
      • 您不使用new_inputdate。为什么要定义它以及它应该做什么?
      • 在没有代码的情况下单独运行SELECT语句。如果你喜欢你的数据,你可以将它放在光标中。
    2. 代码示例:

      CREATE OR REPLACE PROCEDURE placeorder (inputDate IN DATE)
      AS
          -- new_inputDate    PURCHASEORDERS.PODate%TYPE; --you don't use this one
          new_orderType    PURCHASEORDERS.ORDERTYPE%TYPE;
          c_orderSameDay   INVENTORYREPORT.ORDERSAMEDAY%TYPE;
          c_orderNextDay   INVENTORYREPORT.ORDERNEXTDAY%TYPE;
      
          -- you mixed up your cursors. seems like you didn't try the select-statement alone.. 
          CURSOR C2
          IS
              SELECT ir.itemId, ir.ORDERSAMEDAY, ir.ORDERNEXTDAY
                FROM INVENTORYREPORT
               WHERE ir.REPORTDATE = inputDate;
      
      BEGIN
          OPEN C2;
          WHILE C2%FOUND
          LOOP
              FETCH C2 INTO new_orderType, c_orderSameDay, c_orderNextDay;
                  NULL; -- Do something
          END LOOP;
          CLOSE C2;
      END;
      /
      
      1. 想想你想在循环中做些什么。用变量构建一个小小的skript并考虑它应该做什么:
      2. 示例 - Skript of the Loop-content:

        DECLARE
            -- new_inputDate    PURCHASEORDERS.PODate%TYPE; --you don't use this one
            new_orderType    NUMBER := 0;
            c_orderSameDay   NUMBER := 1;
            c_orderNextDay   NUMBER := 2;
        BEGIN
        
            -- this is what you're doing in you loop.
        
            IF c_orderSameDay > 0 -- check if c_orderSameDay is greater than 0? In Oracle you use 'NULL' as empty value. Perhaps it should be 'c_orderSameDay IS NOT NULL'
            THEN
                INSERT INTO PURCHASEORDERS (new_orderType) -- you perform your insert.
                     VALUES (orderSameDay);
            ELSE
                RAISE; -- you raise an exception? this means c_orderSameDay has alsway to be set.
            END IF;
        
            IF c_orderNextDay > 0
            THEN
                INSERT INTO PURCHASEORDERS (new_orderType)
                     VALUES (orderNextDay);
            ELSE
                RAISE; -- you raise an exception? this means c_orderNextDay has alsway to be set.
            END IF;
        END;
        

答案 1 :(得分:0)

对不起,这是我到目前为止所写的内容.. @kara

CREATE OR REPLACE PROCEDURE placeorder (inputDate in DATE)
AS

new_inputDate PURCHASEORDERS.PODate%TYPE;
new_orderType PURCHASEORDERS.ORDERTYPE%TYPE;
c_orderSameDay INVENTORYREPORT.ORDERSAMEDAY%TYPE;
c_orderNextDay INVENTORYREPORT.ORDERNEXTDAY%TYPE;

CURSOR C1 IS
SELECT REPORTDATE INTO inputDate FROM dual;
SELECT ir.itemId, ir.ORDERSAMEDAY, ir.ORDERNEXTDAY FROM INVENTORYREPORT 
WHERE 
ir.REPORTDATE = inputDate;

BEGIN
OPEN C1;
WHILE C1%FOUND LOOP
FETCH C1 INTO new_inputDate, new_orderType, c_orderSameDay, c_orderNextDay;

IF c_orderSameDay > 0
THEN INSERT INTO PURCHASEORDERS (new_orderType) VALUES (orderSameDay);
ELSE <application error>;
END IF;

IF c_orderNextDay > 0
THEN INSERT INTO PURCHASEORDERS (new_orderType) VALUES (orderNextDay);
ELSE <application error>;
END IF;
  END LOOP;
CLOSE C1;

END;
/

答案 2 :(得分:0)

@kara我添加到if语句但在尝试编译过程时仍然遇到一些错误。它正在做它应该做的事情吗?

CREATE OR REPLACE PROCEDURE placeorder (inputDate in DATE)
AS

new_inputDate PURCHASEORDERS.PODate%TYPE;
new_orderType PURCHASEORDERS.ORDERTYPE%TYPE;
c_orderSameDay INVENTORYREPORT.ORDERSAMEDAY%TYPE;
c_orderNextDay INVENTORYREPORT.ORDERNEXTDAY%TYPE;

CURSOR C1 IS
SELECT REPORTDATE INTO inputDate FROM dual;
SELECT ir.itemId, ir.ORDERSAMEDAY, ir.ORDERNEXTDAY FROM INVENTORYREPORT 
WHERE 
ir.REPORTDATE = inputDate;

BEGIN
OPEN C1;
WHILE C1%FOUND LOOP
FETCH C1 INTO new_inputDate, new_orderType, c_orderSameDay, c_orderNextDay;

IF c_orderSameDay > 0
THEN INSERT INTO PURCHASEORDERS (new_orderType) VALUES (orderSameDay);
ELSE INSERT INTO PURCHASEORDERS (new_orderType) VALUES ('no order needed');
END IF;

IF c_orderNextDay > 0
THEN INSERT INTO PURCHASEORDERS (new_orderType) VALUES (orderNextDay);
ELSE INSERT INTO PURCHASEORDERS (new_orderType) VALUES ('no order needed');
END IF;
FETCH C1 INTO new_inputDate, new_orderType, c_orderSameDay, c_orderNextDay;
  END LOOP;
CLOSE C1;
COMMIT;
END placeorder;
/