示例:创建一个简单的存储过程
假设我们有一个名为 employees
的表,结构如下:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(100),
salary DECIMAL(10, 2)
);
我们想要创建一个存储过程,用于插入新的员工记录。
1.创建存储过程
DELIMITER //
CREATE PROCEDURE AddEmployee (
IN emp_name VARCHAR(100),
IN emp_position VARCHAR(100),
IN emp_salary DECIMAL(10, 2)
)
BEGIN
INSERT INTO employees (name, position, salary)
VALUES (emp_name, emp_position, emp_salary);
END //
DELIMITER ;
DELIMITER //:更改默认的语句结束符,以便在存储过程内部可以使用 ; 而不终止整个存储过程的定义。
CREATE PROCEDURE AddEmployee:创建一个名为 AddEmployee 的存储过程。
IN emp_name VARCHAR(100), IN emp_position VARCHAR(100), IN emp_salary DECIMAL(10, 2):定义输入参数。
BEGIN ... END:存储过程的主体部分。
INSERT INTO employees (name, position, salary) VALUES (...):实际的 SQL 插入语句。
DELIMITER ;:将语句结束符改回为默认的 ;。
2.调用存储过程
CALL AddEmployee('John Doe', 'Software Engineer', 75000.00);
这将调用 AddEmployee
存储过程,并向 employees
表中插入一条新记录。
3. 验证插入
SELECT * FROM employees;
这将显示 employees
表中的所有记录,你应该能看到刚刚插入的 John Doe
记录。
示例:创建一个带有输出参数的存储过程
假设我们想要创建一个存储过程,用于获取某个员工的详细信息,并返回该员工的年薪(salary * 12)。
DELIMITER //
CREATE PROCEDURE GetEmployeeInfo (
IN emp_id INT,
OUT emp_name VARCHAR(100),
OUT emp_position VARCHAR(100),
OUT emp_annual_salary DECIMAL(12, 2)
)
BEGIN
SELECT name, position, salary
INTO emp_name, emp_position, @temp_salary
FROM employees
WHERE id = emp_id;
SET emp_annual_salary = @temp_salary * 12;
END //
DELIMITER ;
OUT emp_name VARCHAR(100), OUT emp_position VARCHAR(100), OUT emp_annual_salary DECIMAL(12, 2):定义输出参数。
使用一个用户变量 @temp_salary 来临时存储查询结果中的 salary 值,然后计算年薪。
4. 调用带有输出参数的存储过程
SET @emp_name = '';
SET @emp_position = '';
SET @emp_annual_salary = 0;
CALL GetEmployeeInfo(1, @emp_name, @emp_position, @emp_annual_salary);
SELECT @emp_name AS name, @emp_position AS position, @emp_annual_salary AS annual_salary;
使用 SET 语句初始化输出参数。
调用 GetEmployeeInfo 存储过程。
使用 SELECT 语句显示输出参数的值。