SuperAPI AI 工具集

mariadb-syntax-procedures-functions

设计与创作

查看项目

更新于 10-15 22:18

技能介绍

用途:指导在 MariaDB 中编写存储过程(PROCEDURE)与存储函数(FUNCTION),包括例程体、控制流、游标、错误处理与确定性声明。触发器等不在本技能范围,见同系列 mariadb-syntax-triggers-events-views。

主要能力与要点:

  1. 客户端工具中创建例程前须用 DELIMITER //(或非分号分隔符),结束后 DELIMITER ;;这是客户端指令而非 SQL,PDO、JDBC 等单语句驱动不需要。
  2. 仅当函数对给定参数只产生唯一结果时才声明 DETERMINISTIC;调用 NOW()、RAND()、UUID()、CONNECTION_ID()、LAST_INSERT_ID()、读取会话变量或非不可变表数据的函数不是确定性的,误声明会导致优化器缓存或提升调用而产生错误结果。
  3. 不要在大型表的 WHERE 中调用 NOT DETERMINISTIC 函数,否则逐行求值、无法用索引,退化为全表扫描加逐行过程调用。
  4. BEGIN…END 内声明顺序固定:局部变量、CONDITION、CURSOR、HANDLER,其他顺序为语法错误。
  5. 游标需配合 DECLARE CONTINUE HANDLER FOR NOT FOUND 设置结束标志,否则 FETCH 越界会报 SQLSTATE 02000。
  6. 用户自定义错误用 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT=...,可选 MYSQL_ERRNO;在处理器内重抛用 RESIGNAL(可覆盖消息但保留原 SQLSTATE 与错误码),用 SIGNAL 会丢失原始上下文。
  7. 递归过程前需提高 max_sp_recursion_depth(默认 0 禁止递归,最大 255),如 SET @@SESSION.max_sp_recursion_depth = 32;。
  8. 准确选择特性子句:函数默认 CONTAINS SQL 与 NOT DETERMINISTIC,含 SELECT 用 READS SQL DATA,含写操作用 MODIFIES SQL DATA;在 log_bin_trust_function_creators=OFF 时须准确否则拒绝创建。
  9. 涉及用户数据的例程优先 SQL SECURITY INVOKER,DEFINER 默认以创建者权限执行,存在权限提升风险。
  10. 函数内不能有事务控制(COMMIT、ROLLBACK、SAVEPOINT、START TRANSACTION),过程可以。
  11. 函数带 OUT/INOUT 参数(10.8+)只能通过 SET 和 CALL 调用,不能在 SELECT 中使用,否则报错 4186;多值返回建议用带 OUT 参数的过程。
  12. MariaDB 11.8+ 支持 Oracle 模式 IN OUT 与逐参数 DEFAULT;10.6 至 11.7 仅 IN|OUT|INOUT,DEFAULT 为语法错误。

使用方式:按决策树选择过程或函数、处理器类型、确定性声明及 SIGNAL/RESIGNAL;参考文件含完整语法、SQLSTATE 码、特性矩阵、系统变量、示例与反模式。

限制:资料未提供安装命令、收费与平台信息;具体版本行为以官方 KB 为准。