业务规则必须抽离为独立函数存储过程仅负责参数接收、调用封装逻辑、返回结果函数需语义化命名、强类型输入输出、明确错误上下文严禁混杂计算与适配逻辑。把业务规则抽成独立函数别塞进存储过程里存储过程一旦混入大量计算、格式转换、状态判断逻辑就变成“黑盒”改一行可能影响五个下游调用。核心原则是存储过程只做三件事——接收参数、调用封装好的逻辑单元、返回结果。CREATE FUNCTION 或 CREATE PROCEDURE 单独定义校验规则如 is_valid_order_status、金额计算如 calc_discount_amount再在主存储过程中 SELECT 或 EXEC 调用SQL Server 中避免在存储过程内写多层嵌套 CASE WHEN 判断订单状态流转改用 get_next_approval_step(current_step) 函数封装PostgreSQL 的 plpgsql 存储过程里别直接拼接 COALESCE(a, b, c, N/A) 做默认值而应抽象为 coalesce_with_default(a, b, c) 函数便于统一处理空值策略函数必须有明确输入输出类型禁止返回 TABLE 类型用于简单标量计算比如日期偏移否则调用方要写 (SELECT offset_date FROM ...)可读性骤降参数命名和类型必须和业务域对齐不是数据库字段名看到 p1、input_val 这种参数名就该警觉——它暴露的是实现细节不是业务意图。维护者第一眼根本猜不出这个参数控制的是「是否跳过库存预占」还是「是否启用老用户补贴」。用业务语义命名skip_inventory_lock 比 flag1 清晰is_legacy_user_promo_enabled 比 enable_flag 可维护避免用 VARCHAR(50) 接收所有字符串参数订单号就该是 CHAR(16)状态码限定为 CHAR(2)如 SH, CN让类型本身成为契约SQL Server 中 BIT 类型不能传 NULL 表示“未指定”得用 TINYINT 或单独加 is_skip_flag_specified BIT 参数否则调用方传 NULL 会静默转成 0MySQL 存储过程中若用 JSON 类型参数接收动态条件务必在开头用 JSON_VALID() 校验否则后续 JSON_EXTRACT 报错时堆栈不指向参数来源错误处理别只靠 RAISERROR 或 THROW 打日志抛出 Msg 50000, Level 16, State 1 对 DBA 有用但对业务开发毫无意义。真正卡住维护的是不知道这个错误对应哪条业务规则失败、上游要不要重试、是否需要补偿。 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具