Search code examples
mysqlsqlplsqlprocedure

how can I form a stored procedure in mysql, which can first check multiple values on multiple tables and then insert into db if true


The actual problem statement looks like :

• Product(prod_id, prod_name, qty_on_hand)

• Order(cust_id, prod_id, order_date, qty_ordered)

• Customer(cust_id, cust_name, phone, address)

"Write a stored procedure to take the cust_id, prod_id and qty_ordered as input. Procedure should check if the order for a particular customer can be fulfilled and if yes then insert the new order and update the product quantity on hand. Display appropriate message if the order cannot be fulfilled. Output parameter must have updated value of the qty_on_hand"

I am new to plsql so ignore silly mistakes. I tried to code something like this :

delimiter $$
-- creating procedure
CREATE PROCEDURE order_request( cust_id int,  prod_id int, qty_ordered int)
BEGIN

IF( customer.cust_id != cust_id AND product.prod_id != prod_id AND qty_ordered > product.qty_on_hand) THEN 
SELECT 'invalid details' ;

ELSE INSERT INTO `orders` (`cust_id`, `prod_id`, `order_date`, `qty_ordered`) VALUES (cust_id, prod_id, current_date(), qty_ordered)  ;
 END IF ;
END $$

CALL order_request(3,3,2)$$

which showing me error : unknown table customer in field list


Solution

  • I have solved the question. Here is the solution:

    
    CREATE DATABASE shopping;
    USE shopping;
    
    CREATE TABLE product( prod_id INT PRIMARY KEY, prod_name varchar(20), qty_on_hand INT CHECK(qty_on_hand >= 0));
    CREATE TABLE customer( cust_id INT PRIMARY KEY, cust_name varchar(20), phone INT, address varchar(20) );
    
    -- product table insertion
    INSERT INTO `product` (`prod_id`, `prod_name`, `qty_on_hand`) VALUES ('1', 'mug', '2');
    INSERT INTO `product` (`prod_id`, `prod_name`, `qty_on_hand`) VALUES ('2', 'bowl', '15');
    INSERT INTO `product` (`prod_id`, `prod_name`, `qty_on_hand`) VALUES ('3', 'plate', '7');
    INSERT INTO `product` (`prod_id`, `prod_name`, `qty_on_hand`) VALUES ('4', 'fork', '40');
    INSERT INTO `product` (`prod_id`, `prod_name`, `qty_on_hand`) VALUES ('5', 'spoon', '30');
    
    -- customer table insertion
    INSERT INTO `customer` (`cust_id`, `cust_name`, `phone`, `address`) VALUES ('1', 'duke', '1212121212', 'pune');
    INSERT INTO `customer` (`cust_id`, `cust_name`, `phone`, `address`) VALUES ('2', 'finn', '190120138', 'waterland');
    INSERT INTO `customer` (`cust_id`, `cust_name`, `phone`, `address`) VALUES ('3', 'buck', '98989898', 'delhi');
    INSERT INTO `customer` (`cust_id`, `cust_name`, `phone`, `address`) VALUES ('4', 'larry', '738197232', 'jaipur');
    INSERT INTO `customer` (`cust_id`, `cust_name`, `phone`, `address`) VALUES ('5', 'edna', '184194791', 'mumbai');
    
    
    CREATE TABLE orders( cust_id INT, prod_id INT, order_date DATE, qty_ordered INT CHECK(qty_ordered > 0) , FOREIGN KEY (cust_id) REFERENCES customer(cust_id), FOREIGN KEY (prod_id) REFERENCES product(prod_id));
    
    -- orders table insertion
    INSERT INTO `orders` (`cust_id`, `prod_id`, `order_date`, `qty_ordered`) VALUES ('1', '2', '2022-09-15', '2');
    
    
    delimiter $$
    -- creating procedure
    CREATE PROCEDURE order_request( cust_id_param INT,  prod_id_param INT, qty_ordered_param INT)
    BEGIN
    IF EXISTS (SELECT cust_id,prod_id,qty_on_hand FROM customer,product WHERE cust_id = cust_id_param AND prod_id = prod_id_param AND qty_on_hand  >= qty_ordered_param)
    THEN  INSERT INTO `orders` (`cust_id`, `prod_id`, `order_date`, `qty_ordered`) VALUES (cust_id_param, prod_id_param, current_date(), qty_ordered_param);
    UPDATE `product` SET product.qty_on_hand = qty_on_hand - qty_ordered_param WHERE prod_id =  prod_id_param ;
    ELSE SELECT 'invalid details' ;
    END IF ;
    END $$
    CALL order_request(1,1,2)$$ -- valid
    CALL order_request(3,2,14)$$ -- valid
    CALL order_request(5,4,4)$$ -- valid
    CALL order_request(10,10,2)$$ -- invalid
    select * from orders$$
    select * from product$$
    
    -- creating the funtion
    CREATE FUNCTION order_details (cust_id_param INT, prod_id_param INT ) RETURNS INT
    BEGIN
    DECLARE ans int;
    SELECT SUM(qty_ordered) INTO ans FROM orders WHERE cust_id = cust_id_param AND prod_id = prod_id_param;
    RETURN ans;
    END$$
    
    -- calling the funtion
    SELECT order_details(5,4)$$