存储过程的候选人?

时间:2011-02-22 23:01:30

标签: mysql stored-procedures

我有下面的SQL查询。我想获取结果并使用下面的插入将其插入另一个表中。这是存储过程的不错选择。

它不需要经常运行,所以不需要将它附加到触发器......我可能只是编写一个php脚本来通过每小时的cron作业触发它。 (或者我可以通过命令行触发它)

所以,我在这一棵树上吠叫错了吗?谢谢哦,我会接受任何有用的答案。

 SELECT
  COUNT(*) AS thecount,
  MAX(datetime_acc) AS DATE,
  u.created_usr,
  @payout:=IF(u.created_usr < '2011-01-24',20,10) AS payout,
  level_usr,
  @uid_usr:=p.uid_usr,
  @affiliate:=u.affiliate_aff,
  created_usr,
  firstname_usr, 
  lastname_usr,
  contact_aff,
  c.id_com

FROM payment_acc p
 LEFT JOIN users_usr u ON p.uid_usr = u.id_usr 
 LEFT JOIN commissions_com c ON c.uid_usr = u.id_usr
 LEFT JOIN affiliate_aff a ON a.code_aff = u.affiliate_aff




WHERE p.type_acc = 'monthly payment'
AND affiliate_aff IS NOT NULL
GROUP BY p.uid_usr
HAVING thecount > 1

ORDER BY affiliate_aff

INSERT:

Insert into commissions_com 
    date_generated_com,
    amount_com,
    uid_usr, 
    code_aff, 
    status_com
values
   (NOW(),
    @payout,
    @uid_usr,
    @code_aff,
    'new')

2 个答案:

答案 0 :(得分:1)

您在寻找什么“价值”?

杰夫阿特伍德曾对long time提出质疑存储过程的使用情况。

来自mysql documentation

  

MySQL 5.0引入了存储过程   这使我们能够自动化或编程   我们直接从众多任务中解脱出来   在服务器而不是必须   编写外部脚本来做复杂的事情   操纵数据。

     

你习惯于写作存储   MySQL 5.0中的程序,你将如此   使用任何其他编程语言,   想要概括你的存储   程序尽可能多。该   您的存储过程更灵活   是的,可以使用的任务越多    - 你必须去寻找那个难以捉摸的虫子的地方越少   只是一直给你错误   结果。你最终做出的那一天   存储过程的副本只是为了   改变一两个名字就是你的日子   需要思考如何调整   原始程序可以完成什么   你想要不破旧   功能。

根据您所描述的内容,您的脚本听起来不通用或用于多项任务。

暂时,我会避免存储过程。

答案 1 :(得分:1)

使用存储过程是一项战略决策;不应掉以轻心。

MySQL存储过程非常有限,并且有许多缺点:

  • 语言非常弱,特别是在5.5之前没有提出错误的简洁方法
  • 如果不使用存储过程中准备的SQL,有些事情是无法完成的,这是一个令人难以置信的讨厌模式,非常容易出错。
  • 绝对,绝对没有调试设施
  • 他们只有固定数量的强制性位置参数。通常不可能以向后兼容的方式将接口更改为过程。因此,您最终会得到一个registerAccount过程,一个registerAccount2和registerAccount3等,因为您需要稍后添加更多参数,但无法立即更改调用该过程的所有代码(当然,它会在您的整个过程中分散在不同的机器上)基础设施,你需要进行滚动升级。)
  • 代码管理/变更控制 - 拥有存储过程会添加额外的代码以尝试控制(在开发,测试环境,生产等)

对我来说,这些都是不使用存储过程的好理由。它们很难写(语言很弱),你必须编写使用“坏”模式的代码,而且它们很难正确编写(难以调试,很难知道里面发生了什么)。

也有很多人引用了一些好处

  • 安全性 - 如果您的存储过程正确,并且在整个应用程序中具有深思熟虑的安全模型,那么这只会带来好处
  • 性能 - 基于性能的战略决策是非常过早优化。在大多数情况下,ad-hoc SQL在存储过程中的执行方式与此相同。通过使用支持CLIENT_MULTI_STATEMENTS并将多个查询组合到单个请求消息中的客户端,可以减少多语句延迟。
  • 抽象/重用。不幸的是,将结构化数据导入/导出程序的极端困难也使得这很困难。如果你有一个设计精良的系统可能会有用。使用您自己的前端语言编写子例程并使用它们通常更容易。或者使用允许更丰富界面的应用程序服务器。