DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;

第一个命令是DELIMITER //,它与存储过程语法无关。 DELIMITER语句将标准分隔符 - 分号(;)更改为://。
在这种情况下,分隔符从分号(;)更改为双斜杠//。为什么我们必须更改分隔符? 因为我们想将存储过程作为整体传递给服务器,而不是让mysql工具一次解释每个语句。
在END关键字之后,使用分隔符//来指示存储过程的结束。 最后一个命令(DELIMITER;)将分隔符更改回分号(;)。

使用CREATE PROCEDURE语句创建一个新的存储过程。在CREATE PROCEDURE语句之后指定存储过程的名称。在这个示例中,存储过程的名称为:GetAllProducts,并把括号放在存储过程的名字之后。

BEGIN和END之间的部分称为存储过程的主体。将声明性SQL语句放在主体中以处理业务逻辑。 在这个存储过程中,我们使用一个简单的SELECT语句来查询products表中的数据。

---------------------------------------------------------------------------------------------------------------

更为常见的示例:
USE `db_name`;
DROP PROCEDURE IF EXISTS `GetAllProducts`;

DELIMITER $$

USE `db_name` $$
CREATE PROCEDURE `db_name`.`GetAllProducts`()
BEGIN
SELECT * FROM `db_name`.`table_name`;
END $$

DELIMITER ;


调用存储过程
CALL GetAllProducts();
---------------------------------------------------------------------------------------------------------------
在存储过程中声明一个变量

DECLARE variable_name datatype(size) DEFAULT default_value;
其中datatype可以是任何MySQL数据类型,不分配默认值的话,它就是NULL。
可以一次声明多个定义相同的变量:
DECLARE x, y INT DEFAULT 0;

定义的变量赋值:
DECLARE total_count INT DEFAULT 0;
SET total_count = 10;
除了SET语句之外,还可以使用SELECT INTO语句将查询的结果分配给一个变量。

DECLARE total_products INT DEFAULT 0;
SELECT COUNT(*) INTO total_products FROM products;

---------------------------------------------------------------------------------------------------------------
参数类型:IN OUT INOUT
IN 只输入不查看,即便存储过程修改了IN参数,SP结束后还是会保留原始值
OUT 过程中可以修改,便于存储过程外部查看。在存储过程启动时无法访问OUT值
INOUT 调用者可以传参,SP也可以修改该值

## IN
...
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))

## OUT
...
CREATE PROCEDURE CountOrderByStatus(IN orderStatus VARCHAR(25), OUT total INT)
...
CALL CountOrderByStatus('Shipped',@total);
SELECT @total;

## INOUT
DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
SET count = count + inc;
END$$
DELIMITER ;

SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8

---------------------------------------------------------------------------------------------------------------

IF condition THEN
...;
ELSEIF (condition2) THEN
...;
END IF;

实例:
USE yiibaidb;

DELIMITER $$

CREATE PROCEDURE GetCustomerLevel(
in p_customerNumber int(11),
out p_customerLevel varchar(10))
BEGIN
DECLARE creditlim double;

SELECT creditlimit INTO creditlim
FROM customers
WHERE customerNumber = p_customerNumber;

IF creditlim > 50000 THEN
SET p_customerLevel = 'PLATINUM';
ELSEIF (creditlim <= 50000 AND creditlim >= 10000) THEN
SET p_customerLevel = 'GOLD';
ELSEIF creditlim < 10000 THEN
SET p_customerLevel = 'SILVER';
END IF;

END$$

---------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

posted on 2022-03-17 15:18  长江同学  阅读(46)  评论(0编辑  收藏  举报