, and,
Syntax
DELIMITER // CREATE PROCEDURE proc_name ([IN|OUT|INOUT] param type, ...) BEGIN -- SQL statements END // DELIMITER ; CALL proc_name(args);
Parameters
| Parameters | Description | Examples | Level |
|---|---|---|---|
IN |
Parameters | CREATE PROCEDURE get_user(IN uid BIGINT) |
Common |
OUT |
Parameters | CREATE PROCEDURE count_orders(IN uid BIGINT, OUT total INT) |
Common |
INOUT |
Parameters | CREATE PROCEDURE increment(INOUT val INT) |
Advanced |
DECLARE |
DECLARE v_count INT DEFAULT 0; |
Common | |
IF...THEN |
IF v_count > 0 THEN ... END IF; |
Common | |
CURSOR |
DECLARE cur CURSOR FOR SELECT id FROM users; |
Advanced |
Examples
DELIMITER //
CREATE PROCEDURE sp_create_order( IN p_user_id BIGINT, IN p_product_id BIGINT, IN p_quantity INT, OUT p_order_no VARCHAR(32)
)
BEGIN DECLARE v_price DECIMAL(10,2); DECLARE v_stock INT; -- and SELECT price, stock INTO v_price, v_stock FROM products WHERE id = p_product_id FOR UPDATE; -- IF v_stock < p_quantity THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = ''; END IF; -- SET p_order_no = CONCAT('ORD', DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'), LPAD(FLOOR(RAND()*10000), 4, '0')); -- UPDATE products SET stock = stock - p_quantity WHERE id = p_product_id; -- INSERT INTO orders (order_no, user_id, total_amount, status) VALUES (p_order_no, p_user_id, v_price * p_quantity, 0);
END //
DELIMITER ;:,,
-- Parameters CALL sp_create_order(1001, 2001, 2, @order_no); SELECT @order_no;
@ OUT Parameters
and
-- SHOW PROCEDURE STATUS WHERE Db = 'ecommerce'; -- SHOW CREATE PROCEDURE sp_create_order; -- DROP PROCEDURE IF EXISTS sp_create_order;
DROP New CREATE
DELIMITER // CREATE PROCEDURE sp_batch_expire_orders() BEGIN DECLARE v_affected INT DEFAULT 1; --, 1000 WHILE v_affected > 0 DO UPDATE orders SET status = -1, updated_at = NOW() WHERE status = 0 AND created_at < DATE_SUB(NOW(), INTERVAL 30 MINUTE) LIMIT 1000; SET v_affected = ROW_COUNT(); END WHILE; END // DELIMITER ;
,
Common Errors
ERROR 1305 (42000): PROCEDURE xxx does not exist, SHOW PROCEDURE STATUS
ERROR 1064: You have an error in your SQL syntax near ''DELIMITER,
Tips
- ,
- SELECT
- ,