【发布时间】:2021-02-04 12:44:30
【问题描述】:
各位程序员大家好。我目前正在为我的学习计划开发一个网上商店数据库。目前,我正在尝试创建一个程序,在创建客户时在订单表中创建订单。我也在考虑将其放入构造函数中,但由于我想在订单达到特定状态时使用此功能两次,并且在创建后我想将此功能捆绑在一个过程中。我已经花了将近 8 个小时的时间来研究和测试这个问题,但是由于 oracle db 对我的代码的反馈是 0 到什么都没有,我无法弄清楚出了什么问题。当我创建程序时,它没有被标记为有效,当我单击程序时,我什至看不到参数选项卡中的参数。我希望代码格式化有效这是我的第一篇文章..
这是订单和客户的类型,它们相互持有 REF
CREATE TYPE ORDER_TYPE AS OBJECT(
Order_Id NUMBER,
Date_of_Creation DATE,
Items ITEM_LIST,
Status REF STATUS_TYPE,
Customer REF CUSTOMER_TYPE
);
CREATE TYPE CUSTOMER_TYPE AS OBJECT(
Customer_Id NUMBER,
Email VARCHAR2(254),
User_Name VARCHAR2(50),
Password VARCHAR2(20),
First_Name VARCHAR2(50),
Last_Name VARCHAR2(50),
Address ADDRESS_TYPE,
Shopping_Cart REF ORDER_TYPE
);
CREATE TABLE Orders OF ORDER_TYPE(Status SCOPE IS Order_Status NOT NULL, Customer NOT NULL)
NESTED TABLE Items STORE AS ORDER_ITEMS_NT_TAB;
ALTER TABLE Orders ADD CONSTRAINT PK_Orders PRIMARY KEY(Order_Id);
CREATE TABLE Customers OF CUSTOMER_TYPE(Customer_Id PRIMARY KEY,
Email NOT NULL,
User_Name NOT NULL,
Password NOT NULL,
First_Name NOT NULL,
Last_Name NOT NULL,
Address NOT NULL);
这是程序代码。输入应该是客户创建或更新的。然后我想插入一个新订单,我仍然需要将 id 字段更改为 guid 或 uuid,因此每个订单都是唯一的,但出于测试目的,我只使用了 1。项目列表首先应该是空的,并且订单的状态应该是状态 1,代表“Shopping_Cart”,这意味着订单仍在创建中,稍后应该在浏览器中显示为购物车。插入后,我想用返回语句返回插入的行,因此我无法更新客户并将他的购物车的参考设置为新插入的订单。我无法弄清楚我仍在努力解决什么问题,但我会很感激任何帮助。
CREATE PROCEDURE create_customer_order(customer IN CUSTOMER_TYPE) AS
DECLARE
shopping_c NUMBER;
BEGIN
INSERT INTO ORDERS
VALUES(1,CURRENT_DATE ,NEW ITEM_LIST(),(SELECT REF(os) FROM ORDER_STATUS os WHERE VALUE(os).STATUS_ID = 1),REF(customer))
RETURNING Order_Id INTO shopping_c;
UPDATE CUSTOMERS c
SET c.SHOPPING_CART = (SELECT REF(o) FROM ORDERS o WHERE o.ORDER_ID = shopping_c)
WHERE c.CUSTOMER_ID = customer.CUSTOMER_ID;
END;
如果有不清楚的地方,请随时提出问题。干杯!
【问题讨论】:
标签: oracle plsql procedure object-type