我的应用程序中有很多单行选择查询,多个连接跨越 5-6 个表。这些查询是基于许多条件生成的,这些条件基于来自表单等的输入,使用字符串生成器。然而,我的团队负责人恰好是一名 sql 开发人员,他要求我将这些单行查询转换为存储过程。
将单行选择查询转换为后端并作为 SP 执行所有 if 和 else 是否有任何优势。
将所有 sql 部分都包含在存储过程中的一个优点是,您可以将查询保存在一个地方,即数据库中,这样可以更容易地更改或修改,而无需在应用程序层或前端层进行大量更改。
此外,如果 SQL 存储在数据库过程中,DBA 或 SQL 开发人员可以对 SQL 进行微调。您可以将所有函数/存储过程保存在一个包中,这在性能和组织对象方面会更好(类似于在 Java 中创建包的方式)。当然,在包中,您可以限制对其对象的直接访问。
这更多的是团队或部门的政策,无论是在前端还是在数据库本身中,将 sql 部分保留在哪里,当然就像@Gimby 提到的那样,很多人可能有不同的看法。
更新 1
如果您有一个返回某些内容的 select 语句,请使用函数,如果您有 INSERT/UPDATE/DELETE 或类似的东西,例如发送电子邮件或其他业务规则,则使用一个过程并通过传递参数从前端调用这些。
如果您在 java 中使用 PreparedStatement,那么 java 查询和存储过程之间的性能没有太大差异。(如果你在java中使用Statement,那么你有问题)。
但是存储过程是组织和重用你的 sql 代码的好方法。您可以将它们分组到包中,您可以在不进行 java 编译的情况下更改它们,并且您的 DBA 或 SQL 专家可以调整它们。
恐怕这个问题会根据许多不同的个人观点导致许多不同的答案。
无论如何,您在这里谈论的它的业务逻辑在我看来属于应用程序层。但我认识一大群完全不同意我的 Oracle 开发人员。