我有一个托管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;
答案 0 :(得分:5)
对于这样一个简单的例程,我会说这是一个响亮的号码。有更好的方法来实现此特定存储过程的对象,例如,将其预定义在配置文件中和/或存储为具有已定义的定义的数组对象。
当我需要在后端发生一系列复杂的指令时,我个人实现了存储过程,特别是在不同的表中操作大量数据。显而易见的是,您没有太多的往返和数据库连接,以最大限度地减少您将遇到的开销。
我发现有时候我使用存储过程来定义业务逻辑,以封装来自前端开发人员的复杂细节或内部工作。另一个好处是,如果您正确地设计系统,使用存储过程可以使您的系统比您想象的更具可扩展性。
当你在开发到QA到UAT等不同环境中进行开发时,它尤其有用。如果您必须在某个地方更改服务中的一行代码,则需要将其删除并重新部署以使更改生效,这当然会导致很多中断。使用商店程序,您可以简单地改变它,然后就可以了。祝你好运!