代码之家  ›  专栏  ›  技术社区  ›  Ben Reisner

这是MySQL存储过程的逻辑用法吗?

  •  1
  • Ben Reisner  · 技术社区  · 16 年前

    我有一个拥有托管MySQL数据库的客户机,开发人员一直要求我添加非常简单的存储过程。我看到这样的存储过程,我不明白为什么它会被实现为一个存储过程,而不是在应用程序代码中实现。这真的是对存储过程的奇怪使用吗?

    CREATE DEFINER = 'username'@'%' PROCEDURE `sp_get_payrollgl`(IN pi_glcode TEXT)
        DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY INVOKER
        COMMENT ''
    BEGIN
    
      if (pi_glcode is null || pi_glcode = '') then
        select  glcode,descr, 
            case when crdb = 1 then 'CR' else 'DB' end as 'crdb',  
            case when taxable = 1 then 'Yes' else 'No' end as 'taxable',  
            case when billable = 1 then 'Yes' else 'No' end as 'billable',  
            case when active = 1 then 'Yes' else 'No' end as 'active'  
        from payrollgl;
      else
        select glcode,descr, 
            case when crdb = 1 then 'CR' else 'DB' end as 'crdb',  
            case when taxable = 1 then 'Yes' else 'No' end as 'taxable',  
            case when billable = 1 then 'Yes' else 'No' end as 'billable',  
            case when active = 1 then 'Yes' else 'No' end as 'active'  
        from payrollgl where glcode = pi_glcode;
      end if;
    END;
    
    1 回复  |  直到 16 年前
        1
  •  5
  •   Mr. Smith    16 年前

    对于这样一个简单的例程,我会说这是一个响亮的数字。有更好的方法来实现这个特定存储过程的对象,例如,在配置文件中预先定义它,和/或将它存储为一个定义已经到位的数组对象。

    我个人在后端需要执行一组复杂的指令时实现存储过程,特别是在不同的表中操作大量数据。很明显,这样做的好处是,您没有太多的往返和到数据库的连接,从而将您遇到的开销降到最低。

    我发现有时我使用存储过程来定义业务逻辑,以封装来自前端开发人员的复杂细节或内部工作。另一个好处是,如果您正确地设计了系统,那么使用存储过程可以使系统比您想象的更具可扩展性。

    当您在不同的环境中进行开发(如从开发到QA到UAT)时,它尤其有用。如果您必须在某个地方更改服务中的一行代码,那么您需要删除它并重新部署以使更改生效,这当然会造成很多干扰。通过存储过程,您可以简单地更改它,然后就可以上路了。祝你好运!