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个插入项)
- 对应的订单类型应为下一天或同一天
- 如果需要,仅在
中输入(插入),即 中存在原材料和报告日期组合的条目 库存报告表。如果一天的库存报告(例如。, 2017年11月30日)的ordersameday属性的值为0,这意味着 不需要当天的订单PURCHASEORDERS
谢谢 这里有一系列如何创建过程的示例。这里有一个小的:
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;
但是你应该先看看你的练习,然后想想你的任务。我想,这就是你要做的:
- 你写了两篇精选文章
- 您不使用新的输入日期。你为什么定义它,它应该做什么
- 在不使用代码的情况下单独运行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为`