我正在开始一个程序的工作,该程序可能最自然地描述为对数据库表的一批计算,并且每月执行一次。 所有输入都在Oracle数据库表中,所有输出都将在Oracle数据库表中。 该程序应在未来很多年保持可维护性。

将其实现为一系列存储过程似乎很简单,每个存储过程都进行了明智的转换,例如,根据一些业务规则在部门之间分配成本。 然后,我可以编写单元测试以检查每个转换的输出是否符合我的预期。

在PL / SQL中全部完成这是一个坏主意吗? 您是否愿意使用典型的面向对象编程语言(例如C#)进行大量的计算? 使用以数据库为中心的编程语言(例如PL / SQL)是否更具表达能力?

===============>>#1 票数:10

您描述以下要求

a)必须能够执行批处理b)结果必须可维护

我的回复:

  1. PL / SQL旨在实现您所描述的内容。 同样重要的是要注意,PL / SQL的效率是其他工具无法提供的。 存储过程语言将处理放在数据旁边-这是批处理应放在的位置。
  2. 用任何语言编写可维护性差的代码很容易。

综上所述,您的实施将取决于可用的技能,适当的设计以及对高质量流程的坚持。

为了提高效率,您的实现必须分批处理数据(分批选择,然后分批插入/更新)。 面向对象方法的危险在于,很容易将其引向逐行处理数据的设计。 这种类型的方法包含不必要的开销,并且其效率将大大低于按行处理数据的设计。

可以成功使用两种方法。

马修·巴特勒

===============>>#2 票数:8

其他评论者需要注意的问题-问题是关于PL / SQL,而不是SQL。 答案显然是关于SQL的,而不是PL / SQL。 PL / SQL是一种功能齐全的数据库语言,它也很成熟。 有一些缺点,但是对于发帖人想要做的事情来说,这是非常好的。

===============>>#3 票数:6

不,这不一定是一个坏主意。 如果该解决方案对您来说似乎很简单,并且允许您测试和验证每个过程,那么听起来它可能是个好主意。 OO平台对大型数据集可能(尽管不一定)不利,因为对象创建和开销可能会降低性能。

Oracle在设计PL / SQL时考虑了您的问题,如果对数据库和PL / SQL有足够的企业知识,这似乎是一个合理的解决方案。 请记住大批处理集,因为从PL / SQL到实际SQL引擎的每次调用都是上下文切换,因此应在可能的情况下将单个记录过程批处理在一起以提高性能。

===============>>#4 票数:4

只需确保以某种方式记录正在运行的情况。 否则,您将拥有一个黑匣子,如果它被卡在某个地方数小时,您会怀疑是要停止它还是让它“再起作用”。

===============>>#5 票数:4

PL / SQL是一种成熟的语言,可以与SQL很好地集成。 随着Oracle的每个版本,它变得越来越强大。 同样从Oracle 11开始,PL / SQL默认情况下会编译为机器代码。

===============>>#6 票数:3 已采纳

通常,我说在PL / SQL中投入尽可能少的东西-通常它的可维护性要差得多-在我的最后一项工作中,我真正看到了使用它可能会带来的麻烦和困难。

但是,由于它是批处理-且输入和输出都是DB-因此,将逻辑放入PL / SQL是很有意义的,可以最大程度地减少“移动部件”。 但是,如果是业务逻辑-或系统其他部分使用的组件-我会说不要这样做。

===============>>#7 票数:3

我在PL / SQL和Pro C中为一个项目编写了大量的批处理和报告生成程序 他们通常更喜欢我用PL / SQL编写,因为他们自己的开发人员将来会维护它们,使他们比Pro C代码更容易理解

它最终只是真正的时髦处理或最终以Pro * C编写的报告。

不必像其他人所提到的那样将它们编写为存储过程,它们可以只是按需运行的脚本文件,有点像shell脚本。 使源代码版本控制和测试与生产系统之间的迁移也变得非常容易。

===============>>#8 票数:2

只要可以在PL / SQL中充分且可读地捕获您需要执行的计算,那么仅使用PL / SQL才最有意义。

真正的难点在于可维护性-编写不可维护的SQL非常容易,只要是因为一旦退出简单的SQL DML,每个RDBMS都会具有不同的语法和不同的功能集,并且没有真正的格式化标准。 评论等

===============>>#9 票数:2

我已经使用C#和SQL创建了批处理程序。

C#的优点:

您已经拥有完整的.NET库和OO语言的所有功能。

C#的缺点:

*批处理程序和数据库是分开的-这意味着,您必须与数据库分开管理批处理程序。

*您需要转义所有dang sql代码。

SQL的优点:

*与DBMS很好地集成。 如果此作业仅操作数据库,则将其包含在数据库中是有意义的。 您最终将一个数据库及其所有组件打包在一个程序包中。

*无需转义SQL代码

*保持真实-您正在问题域中进行编程

SQL的缺点:

它的SQL和我个人都不熟悉SQL。

通常,由于上述优点,我会坚持使用SQL。

===============>>#10 票数:1

这是一个充满挑战的问题:)您应该了解几个数据库编程体系结构设计,以及它们的成本/收益是什么。 2层通常意味着您有一个客户端连接到数据库,并发出直接的SQL调用。 3层通常表示您有一个“应用程序服务器”,它向数据库发出直接的SQL调用,但是客户端正在与应用程序服务器通信。 通常,这提供了“向外扩展”。 最后,您拥有采用2层格式的2 1/2层应用程序,只有工作在存储过程中进行了划分。

您的流程听起来像是“后台”,客户/流程只需要每月一次汇总和缓存结果。 也就是说,没有代理可以连接并且经常连接,并说“进行这些计算”。 相反,您暗示了一个不时发生的过程,并且您可以摆脱非实时性。

因此,考虑到这些要求,我通常会说,更接近数据会更快,让SQL Server执行所有计算。 我认为您会发现与数据的接近将为您提供很好的服务。

但是,在执行这些计算时,您可能会发现某些计算不适合SQL Server。 以计算债券或任何固定收益工具的应计利息为例。 SQL不是很漂亮,更适合于更丰富的编程语言。 但是,如果您只有简单的平均值和其他相对合理的聚合,那么我会在SQL方面坚持使用存储过程。

再说一次,关于您的计算的性质,您的房屋在开发人员的SQL功能方面的支持要求,您的老板说的是什么……都没有足够的信息……但是由于我了解我的SQL知识,并且喜欢保持接近数据,我将保持纯SQL / Stored Procedures这样的任务。

YMMV :)

===============>>#11 票数:0

由于大多数存储过程语言都是设计引起的,因此通常不更具表现力。 但是它可能比在外部应用程序中运行得更快。

我想这可以归结为您对PL / SQL的熟悉程度,必须编写多少时间,性能有多重要以及是否可以合理地期望维护人员对PL / SQL足够熟悉以维护编写的大型程序。它。

如果速度无关紧要,并且维护人员可能不熟练PL / SQL,则使用“传统”语言可能会更好。

您还可以使用混合方法,其中使用PL / SQL生成中间数据(例如,表联接和总和或其他),并使用单独的应用程序控制流以及检查值和错误。

  ask by Gudmundur Orn translate from so

未解决问题?本站智能推荐:

1回复

C#:Oracle.DataAccess批处理读取

适用于.NET的Oracle驱动程序(汇编Oracle.DataAccess)没有太多文档,所以我在哪里可以了解批量读取? 也许有人可以提供示例?
1回复

Jdbc Oracle批处理更新某些表的性能不佳

嘿,我真的很需要帮助,我很沮丧。 我正在从事这个项目,该项目是将数据从一个数据库迁移到另一个数据库,两个Oracle。我正在做的是从源数据库获取表并在目标数据库处创建表。 然后从源表中获取数据以批量插入目标数据库。 提供更多细节; 我通过从源表中获取16个rowid范围并将数
1回复

抽象批处理SFTP多目标和自动重试

我使用内部Java框架进行了大量的批处理工作。 对我们来说特别麻烦的活动之一是SFTP,我们遇到了两个问题: 将文件发送到多个目的地,如果一个目的地不可用,则整个过程将停止。 没有自动重试,因为某些网络故障会导致批处理过程停止。 当前,我们使用Control-M来存储
1回复

选择(批处理和Oracle)后不显示值

我正在做批处理文件,这是我到目前为止的内容: 运行它并选择1或2之后,我将显示所选的数字: 我有两个问题: 1)如何不显示“选定的1”(标记为红色) 2)到我的update.sql中,我只写: 很好,还是我需要输入开始/结束?
3回复

两种JDBC查询批处理方法中的哪一种更快?

我试图在具有数百万条记录的表上使用rownum在多个批次中运行更新语句。 第一种方法是将所有查询一起批处理,然后运行executeBatch()方法,如下所示, 第二种方法是运行一个批量更新语句并在每个批次之后提交,如下所示, 我认为第二种方法更清洁,因为它在每批次之后提交
3回复

ORACLE JDBC批处理执行不返回受影响行的实际计数

我正在开发一个我正在使用JDBC和Oracle11的应用程序。 我在我的表tbltest有成千上万的记录,我正在通过JDBC批处理执行更新。 因此,将其视为一个id =一个查询 。 我的要求:我想跟踪哪些id成功更新,哪些id不存在于db中。 以下是我的代码: 我的记
1回复

javax.sql.rowset.serial.SerialBlob与oracle.sql.BLOB不兼容

我刚刚在Oracle 12c DB中创建了IBM XD Grid数据模型,并且在提交作业时,服务器抛出以下错误(Derby DB可以正常工作,但我需要配置生产环境): 我已经看到了与该问题相关的TechNote( http://www-01.ibm.com/support/docview.
3回复

PL SQL批处理,带有select中的insert

我必须将数据从表A移到表B(它们具有几乎相同的字段)。 我现在拥有的是一个游标,它遍历必须移动的记录,在目标表中插入一条记录,并更新源表中的is_processed字段。 就像是: 问题是,如何使用INSERT FROM SELECT(无循环)然后更新所有已移动行的IS_PROC
1回复

批处理插入上的PL SQL Compund触发器

我已经写了一个复合触发器来触发插入。 多个插入片段被一起批处理并发送到数据库,复合触发器在此处将其拾取。 我的问题是,我需要根据查询提供的数据在同一张表上针对某些插入内容执行更新查询。 我无法执行行级操作,因为这会导致触发表更改错误(ORA-4091)。 我能想到的最好的事情是在语句块之
1回复

如何使用pl / sql进行批处理操作

我必须为许多表添加主键,并且我从stackoverflow获得了以下脚本(用于一个表): 但是,现在我对用户的所有表都执行了相同的操作。 所以我想知道是否可以使用pl / sql循环用户的所有表,并执行上述操作?