存储过程
GBase存储过程是一组预编译的SQL语句集合,存储在数据库中,可以通过调用执行。它能够提高性能、减少网络传输、增强安全性,并实现复杂的业务逻辑。下面我将详细讲解其语法结构,并通过几个典型示例帮助你快速上手。
易 GBase存储过程全面解析
理解存储过程的核心概念
存储过程(Stored Procedure)是GBase中一种重要的数据库对象,它是一组为了完成特定功能的SQL语句集合,这些语句经过编译后存储在数据库中。存储过程类似于编程语言中的函数,可以接受参数、返回结果,并且包含了流程控制能力,能够完成复杂的判断和计算。
使用存储过程的主要优势包括:
• 性能提升:存储过程在首次执行时被编译,后续调用直接执行,减少了SQL语句的解析和编译时间。
• 减少网络流量:客户端只需传递参数和接收结果,避免了多次网络IO请求造成的网络负载。
• 提高安全性:可以限制用户对数据库的直接访问,只允许通过存储过程操作数据。
• 代码复用:存储过程可以在多个应用程序中复用,减少代码重复编写。
存储过程的基本语法
创建存储过程
创建存储过程的基本语法如下:
DELIMITER // -- 更改分隔符
CREATE PROCEDURE procedure_name (
[IN | OUT | INOUT] parameter_name data_type,
...
)
BEGIN
-- 存储过程的主体(SQL语句)
END //
DELIMITER ; -- 恢复默认分隔符
参数说明:
• IN(默认):输入参数,调用存储过程时指定,在存储过程内部不可修改。
• OUT:输出参数,可以在存储过程内部被改变并返回给调用者。
重要提示:由于存储过程主体中包含多个SQL语句(以分号结尾),需要先使用DELIMITER命令临时更改语句分隔符,创建完成后再恢复。
调用存储过程
调用存储过程使用CALL语句:
CALL procedure_name(parameter_value, ...);
对于有输出参数的存储过程,需要使用变量接收返回值:
-- 调用带有OUT参数的存储过程
CALL procedure_name(@input_value, @output_value);
SELECT @output_value; -- 查看返回值
存储过程管理
• 查看存储过程:SHOW PROCEDURE STATUS; 或 SHOW CREATE PROCEDURE procedure_name;。
• 删除存储过程:DROP PROCEDURE IF EXISTS procedure_name;。
• 修改存储过程:GBase不支持直接修改存储过程,需要先删除再重新创建。
存储过程实战示例
1. 基础示例:员工信息查询
以下存储过程根据员工ID查询员工信息:
DELIMITER //
CREATE PROCEDURE GetEmployeeInfo(IN employee_id INT)
BEGIN
SELECT first_name, last_name, salary
FROM employees
WHERE employee_id = employee_id;
END //
DELIMITER ;
-- 调用方法
CALL GetEmployeeInfo(101);
2. 数据处理示例:动态排序与筛选
这个示例展示如何在存储过程中进行复杂的数据处理:
DELIMITER $$
CREATE PROCEDURE proc_sort_filter()
BEGIN
-- 创建临时表
CREATE TEMPORARY TABLE IF NOT EXISTS temp_table AS
SELECT * FROM original_table;
-- 动态排序
SET @sort_column = 'name';
SET @sort_order = 'ASC';
SET @sort_query = CONCAT('SELECT * FROM temp_table ORDER BY ', @sort_column, ' ', @sort_order);
PREPARE stmt FROM @sort_query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 清理临时表
DROP TEMPORARY TABLE IF EXISTS temp_table;
END $$
DELIMITER ;
3. 复杂业务逻辑:条件判断与循环
以下示例展示了存储过程中条件判断和循环的使用:
DELIMITER //
CREATE PROCEDURE ProcessEmployeeSalaries(IN department_id INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE emp_id INT;
DECLARE current_salary DECIMAL(10,2);
DECLARE new_salary DECIMAL(10,2);
-- 声明游标用于遍历员工记录
DECLARE employee_cursor CURSOR FOR
SELECT employee_id, salary
FROM employees
WHERE department_id = department_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN employee_cursor;
employee_loop: LOOP
FETCH employee_cursor INTO emp_id, current_salary;
IF done THEN
LEAVE employee_loop;
END IF;
-- 根据条件调整薪资
IF current_salary < 5000 THEN
SET new_salary = current_salary * 1.10; -- 加薪10%
ELSEIF current_salary BETWEEN 5000 AND 10000 THEN
SET new_salary = current_salary * 1.05; -- 加薪5%
ELSE
SET new_salary = current_salary; -- 不加薪
END IF;
-- 更新薪资
UPDATE employees
SET salary = new_salary
WHERE employee_id = emp_id;
END LOOP;
CLOSE employee_cursor;
END //
DELIMITER ;
高级特性与技巧
错误处理
存储过程支持异常处理,可以使用DECLARE HANDLER捕获和处理异常:
CREATE PROCEDURE SafeDataInsert(
IN name VARCHAR(50),
IN salary DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT '错误发生,操作已回滚' AS message;
END;
INSERT INTO employees (name, salary) VALUES (name, salary);
END;
游标使用
游标(Cursor)用于在存储过程中遍历查询结果集:
CREATE PROCEDURE ProcessAllEmployees()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE emp_name VARCHAR(100);
DECLARE emp_salary DECIMAL(10,2);
-- 声明游标
DECLARE employee_cursor CURSOR FOR
SELECT name, salary FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN employee_cursor;
read_loop: LOOP
FETCH employee_cursor INTO emp_name, emp_salary;
IF done THEN
LEAVE read_loop;
END IF;
-- 处理每条记录
END LOOP;
CLOSE employee_cursor;
END;
GBase存储过程是处理复杂数据库操作的强大工具,特别适合数据密集型应用和复杂业务逻辑。通过合理使用存储过程,可以显著提高应用性能、安全性和可维护性。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25052
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526