GBase 8a
其他
文章

存储过程

发表于2025-12-24 14:19:283116次浏览1个评论

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存储过程是处理复杂数据库操作的强大工具,特别适合数据密集型应用和复杂业务逻辑。通过合理使用存储过程,可以显著提高应用性能、安全性和可维护性。

评论

登录后才可以发表评论
经纬发表于 4个月前
学习了