Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures PL SQL过程练习_Stored Procedures_Plsql - Fatal编程技术网

Stored procedures PL SQL过程练习

Stored procedures PL SQL过程练习,stored-procedures,plsql,Stored Procedures,Plsql,我真的不知道该如何回答这个问题。。我理解编写过程的基本语法。这是一个针对初学者数据库类的练习(它的级别似乎比初学者高) 创建基于库存报告表中的数据在指定日期下采购订单的过程 命名过程placeorder[过程名称很重要] 该过程应采用一个参数:inputDate(使用PURCHASEORDERS中的PODate列的数据类型)。接受的输入日期格式应为:'DD-MON-YYYY',例如2017年1月1日 对于库存报告表中的每种原材料(其中:ReportDate与inputDate匹配),在PURCH

我真的不知道该如何回答这个问题。。我理解编写过程的基本语法。这是一个针对初学者数据库类的练习(它的级别似乎比初学者高)

创建基于库存报告表中的数据在指定日期下采购订单的过程

命名过程
placeorder
[过程名称很重要]

该过程应采用一个参数:
inputDate
(使用
PURCHASEORDERS
中的
PODate
列的数据类型)。接受的输入日期格式应为:
'DD-MON-YYYY'
,例如2017年1月1日

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

  • 对应的订单类型应为下一天或同一天

  • 如果需要,仅在
    PURCHASEORDERS
    中输入(插入),即 中存在原材料和报告日期组合的条目 库存报告表。如果一天的库存报告(例如。, 2017年11月30日)的ordersameday属性的值为0,这意味着 不需要当天的订单

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


谢谢

这里有一系列如何创建过程的示例。这里有一个小的:

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;
但是你应该先看看你的练习,然后想想你的任务。我想,这就是你要做的:

  • 创建一个表
  • 为表创建Insert语句
  • 创建一些PL/SQL代码来执行带条件的插入
  • 将PL/SQL代码移动到过程中
  • 使用PL/SQL块调用该过程
  • 给你解释一下 如果需要,您应该一步一步地构建代码。你犯了多个错误

  • 检查你的光标。Select语句无效。
    • 你写了两篇精选文章
    • 您不使用新的输入日期。你为什么定义它,它应该做什么
    • 在不使用代码的情况下单独运行SELECT语句。如果你喜欢你的数据,你可以把它放在一个光标上
  • 代码示例:

    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;
    /
    
  • 想想你想在循环中做什么。用变量构建一个小脚本,并思考它应该做什么:
  • 循环内容的示例:

    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;
    

    对不起,这是我到目前为止写的@卡拉

    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;
    /
    
    创建或替换过程placeorder(日期中输入日期)
    作为
    新的\u inputDate PURCHASEORDERS.PODate%类型;
    新订单类型PURCHASEORDERS。订单类型%TYPE;
    c_orderSameDay INVENTORYREPORT.orderSameDay%类型;
    c_orderNextDay INVENTORYREPORT.orderNextDay%类型;
    光标C1为
    从dual中选择REPORTDATE进入inputDate;
    从INVENTORYREPORT中选择ir.itemId、ir.ORDERSAMEDAY、ir.ORDERNEXTDAY
    哪里
    ir.REPORTDATE=输入日期;
    开始
    开C1;
    而C1%找到了循环
    将C1提取到新订单inputDate、新订单类型、c\U订单Sameday、c\U订单NextDay中;
    如果c_orderSameDay>0
    然后在PURCHASEORDERS(新订单类型)值(orderSameDay)中插入;
    其他的
    如果结束;
    如果c_orderNextDay>0
    然后将值(orderNextDay)插入PURCHASEORDERS(new_orderType);
    其他的
    如果结束;
    端环;
    关闭C1;
    结束;
    /
    
    @kara I添加到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;
    /
    

    我知道它应该是:
    创建或替换过程placeorder声明c_inputdate PURCHASEORDERS.PODATE%类型;光标C1为`