如何在 Oracle 的存储过程中对特定数量的项目实施最小和最大验证?
How to implement minimum and maximum validation for a specific amount of items in a stored procedure in Oracle?
我想添加一些验证,以便在我的存储过程中项目的最小数量大于或等于 2,而项目的最大数量小于或等于 10。如果项目小于 2 或大于 10,我希望显示一条错误消息并且不执行该过程。如果项目在验证范围内,则存储过程应正常执行。
CREATE OR REPLACE PROCEDURE insert_new_order
(
p_order_id IN ORDERS.ORDER_ID%TYPE,
p_order_num IN ORDERS.ORDER_NUMBER%TYPE,
p_name IN ORDERS.BILLING_NAME%TYPE,
p_email IN ORDERS.BILLING_EMAIL%TYPE,
p_address IN ORDERS.BILLING_ADDRESS%TYPE,
p_city IN ORDERS.BILLING_CITY%TYPE,
p_province IN ORDERS.BILLING_PROVINCE%TYPE,
p_postcode IN ORDERS.BILLING_POSTCODE%TYPE,
p_telephone IN ORDERS.BILLING_TELEPHONE%TYPE,
p_total IN ORDERS.BILLING_TOTAL%TYPE,
p_order_date IN ORDERS.ORDER_DATE%TYPE,
p_items IN ORDERS.ITEMS%TYPE
)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Insert attempted');
INSERT INTO orders (
order_id,
order_number,
billing_name,
billing_email,
billing_address,
billing_city,
billing_province,
billing_postcode,
billing_telephone,
billing_total,
order_date,
items
) VALUES (
p_order_id,
p_order_num,
p_name,
p_email,
p_address,
p_city,
p_province,
p_postcode,
p_telephone,
p_total,
p_order_date,
p_items
);
DBMS_OUTPUT.PUT_LINE ('Insert succeeded');
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE ('Insert rejected');
DBMS_OUTPUT.PUT_LINE ('SQL Error Code: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE ('SQL Error Message: ' || SQLERRM);
ROLLBACK;
END;
/
CREATE OR REPLACE TYPE order_item AS object(
order_id INT,
product_id INT,
seller_id INT,
sub_order_number CHAR(10),
quantity INT,
condition CHAR(10),
unit_price NUMBER,
cost_charge NUMBER,
total NUMBER
);
/
CREATE OR REPLACE TYPE order_items AS Table of order_item;
/
CREATE TABLE orders (
order_id INT CONSTRAINT PKEY_order PRIMARY KEY,
order_number CHAR(10),
billing_name CHAR(100),
billing_email CHAR(100),
billing_address VARCHAR2(100),
billing_city VARCHAR2(100),
billing_province VARCHAR2(100),
billing_postcode VARCHAR2(100),
billing_telephone CHAR(25),
billing_total NUMBER,
order_date DATE,
Items order_items)
Nested Table Items Store As Orders_Item
/
我希望这是一道作业题。如果这是一个真实的系统,那么有几件事是没有意义的——在真实的系统中为订单项目嵌套 table 会产生很大的问题,不允许恰好由单个项目组成的订单傻等
在您的程序中,您可以在程序的第一步检查集合中的元素数量并引发自定义错误
IF NOT( p_items.count BETWEEN 2 and 10 )
THEN
RAISE_APPLICATION_ERROR( -20001, 'Orders must have between 2 and 10 items. This order has ' || p_items.count );
END IF;
您几乎肯定想要删除异常处理程序。正如@MT0 指出的那样,仅调用 dbms_output.put_line
的 when others
异常处理程序存在很大问题。您不能假设任何人都会看到写入 dbms_output
缓冲区的消息——绝大多数真实系统不会对该文本执行任何操作。如果引发异常,事务将自动回滚。
我想添加一些验证,以便在我的存储过程中项目的最小数量大于或等于 2,而项目的最大数量小于或等于 10。如果项目小于 2 或大于 10,我希望显示一条错误消息并且不执行该过程。如果项目在验证范围内,则存储过程应正常执行。
CREATE OR REPLACE PROCEDURE insert_new_order
(
p_order_id IN ORDERS.ORDER_ID%TYPE,
p_order_num IN ORDERS.ORDER_NUMBER%TYPE,
p_name IN ORDERS.BILLING_NAME%TYPE,
p_email IN ORDERS.BILLING_EMAIL%TYPE,
p_address IN ORDERS.BILLING_ADDRESS%TYPE,
p_city IN ORDERS.BILLING_CITY%TYPE,
p_province IN ORDERS.BILLING_PROVINCE%TYPE,
p_postcode IN ORDERS.BILLING_POSTCODE%TYPE,
p_telephone IN ORDERS.BILLING_TELEPHONE%TYPE,
p_total IN ORDERS.BILLING_TOTAL%TYPE,
p_order_date IN ORDERS.ORDER_DATE%TYPE,
p_items IN ORDERS.ITEMS%TYPE
)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE ('Insert attempted');
INSERT INTO orders (
order_id,
order_number,
billing_name,
billing_email,
billing_address,
billing_city,
billing_province,
billing_postcode,
billing_telephone,
billing_total,
order_date,
items
) VALUES (
p_order_id,
p_order_num,
p_name,
p_email,
p_address,
p_city,
p_province,
p_postcode,
p_telephone,
p_total,
p_order_date,
p_items
);
DBMS_OUTPUT.PUT_LINE ('Insert succeeded');
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.PUT_LINE ('Insert rejected');
DBMS_OUTPUT.PUT_LINE ('SQL Error Code: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE ('SQL Error Message: ' || SQLERRM);
ROLLBACK;
END;
/
CREATE OR REPLACE TYPE order_item AS object(
order_id INT,
product_id INT,
seller_id INT,
sub_order_number CHAR(10),
quantity INT,
condition CHAR(10),
unit_price NUMBER,
cost_charge NUMBER,
total NUMBER
);
/
CREATE OR REPLACE TYPE order_items AS Table of order_item;
/
CREATE TABLE orders (
order_id INT CONSTRAINT PKEY_order PRIMARY KEY,
order_number CHAR(10),
billing_name CHAR(100),
billing_email CHAR(100),
billing_address VARCHAR2(100),
billing_city VARCHAR2(100),
billing_province VARCHAR2(100),
billing_postcode VARCHAR2(100),
billing_telephone CHAR(25),
billing_total NUMBER,
order_date DATE,
Items order_items)
Nested Table Items Store As Orders_Item
/
我希望这是一道作业题。如果这是一个真实的系统,那么有几件事是没有意义的——在真实的系统中为订单项目嵌套 table 会产生很大的问题,不允许恰好由单个项目组成的订单傻等
在您的程序中,您可以在程序的第一步检查集合中的元素数量并引发自定义错误
IF NOT( p_items.count BETWEEN 2 and 10 )
THEN
RAISE_APPLICATION_ERROR( -20001, 'Orders must have between 2 and 10 items. This order has ' || p_items.count );
END IF;
您几乎肯定想要删除异常处理程序。正如@MT0 指出的那样,仅调用 dbms_output.put_line
的 when others
异常处理程序存在很大问题。您不能假设任何人都会看到写入 dbms_output
缓冲区的消息——绝大多数真实系统不会对该文本执行任何操作。如果引发异常,事务将自动回滚。