Plsql _RMS_E_PRIO_项目 选择ORD_TEMP_SEQ_NO, 克罗斯多克工业公司, 克罗斯多克酒店, 部, 供应商 项目 包装工业, 原产国, 单位成本, 收货时间, 支持交付周期, 地方 LOC_类型, 订单, 供应包装尺寸, 订单状态, 合同编号:, 合同类型:, 到期日, 吕心寿, L_PRIO_ITEM_SOH, 系统日期, “更新优先项目” 来自RMS13PRD.ORD\u临时OT 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 更新ORD_临时OT 设置订货数量=NVL(最大库存量,0)-NVL(总库存量,0) 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 其他的 插入APO_RMS_E_PRIO_项目 选择ORD_TEMP_SEQ_NO, 克罗斯多克工业公司, 克罗斯多克酒店, 部, 供应商 项目 包装工业, 原产国, 单位成本, 收货时间, 支持交付周期, 地方 LOC_类型, 订购数量, 供应包装尺寸, 订单状态, 合同编号:, 合同类型:, 到期日, 吕心寿, L_PRIO_ITEM_SOH, 系统日期, '删除优先项目' 来自RMS13PRD.ORD\u临时OT 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 从RMS13PRD.ORD\U TEMP OT中删除 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 如果结束; 端环; 例外 当其他人 回降; O|u错误|u消息:=L|u程序| |'-'| | SQLCODE | | SQLERRM; 结束APO_RMS_E_PRIO_ITEM_REPL;

Plsql _RMS_E_PRIO_项目 选择ORD_TEMP_SEQ_NO, 克罗斯多克工业公司, 克罗斯多克酒店, 部, 供应商 项目 包装工业, 原产国, 单位成本, 收货时间, 支持交付周期, 地方 LOC_类型, 订单, 供应包装尺寸, 订单状态, 合同编号:, 合同类型:, 到期日, 吕心寿, L_PRIO_ITEM_SOH, 系统日期, “更新优先项目” 来自RMS13PRD.ORD\u临时OT 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 更新ORD_临时OT 设置订货数量=NVL(最大库存量,0)-NVL(总库存量,0) 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 其他的 插入APO_RMS_E_PRIO_项目 选择ORD_TEMP_SEQ_NO, 克罗斯多克工业公司, 克罗斯多克酒店, 部, 供应商 项目 包装工业, 原产国, 单位成本, 收货时间, 支持交付周期, 地方 LOC_类型, 订购数量, 供应包装尺寸, 订单状态, 合同编号:, 合同类型:, 到期日, 吕心寿, L_PRIO_ITEM_SOH, 系统日期, '删除优先项目' 来自RMS13PRD.ORD\u临时OT 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 从RMS13PRD.ORD\U TEMP OT中删除 其中OT.LOCATION=REC_1.LOCATION 和OT.ITEM=REC_1.ITEM; 犯罪 如果结束; 端环; 例外 当其他人 回降; O|u错误|u消息:=L|u程序| |'-'| | SQLCODE | | SQLERRM; 结束APO_RMS_E_PRIO_ITEM_REPL;,plsql,plsqldeveloper,plsql-package,Plsql,Plsqldeveloper,Plsql Package,一个解决方案是询问您的DBA是否有工具,以确定在您的过程中触发了哪些查询,平均需要多少次,以及每个查询需要多少时间 然后,这将指出您的过程中需要优化哪些查询,相关DBA将对此有一些线索 在这里,我们有时需要使用Oracle生成的报告,该报告为您提供有关数据库中发生的情况的大量统计信息。因此,如果您在测试阶段成功地停止了所有其他处理,那么您就可以清楚地了解过程中发生了什么,而无需做太多工作 (请注意,我没有以任何“公司”方式链接到Oracle)。当我需要查找过程的哪个部分需要(太多)时间来执行时,

一个解决方案是询问您的DBA是否有工具,以确定在您的过程中触发了哪些查询,平均需要多少次,以及每个查询需要多少时间

然后,这将指出您的过程中需要优化哪些查询,相关DBA将对此有一些线索

在这里,我们有时需要使用Oracle生成的报告,该报告为您提供有关数据库中发生的情况的大量统计信息。因此,如果您在测试阶段成功地停止了所有其他处理,那么您就可以清楚地了解过程中发生了什么,而无需做太多工作


(请注意,我没有以任何“公司”方式链接到Oracle)。

当我需要查找过程的哪个部分需要(太多)时间来执行时,我使用一种简单的日志记录技术:一个包含有关我在何处以及我在做什么的信息以及时间戳的表。它是通过一个
autonomy_事务
过程填充的(这样我就可以提交日志信息,而不会影响调用者)

以下是脚本(请随意修改):

然后,在我正在处理的一个过程中,放入a1_p_日志调用,例如

begin
  a1_p_log('step 1: initializing');
  -- some init code here

  a1_p_log('step 2: an ugly query follows now');
  SELECT blabla --> very ugly query

  a1_p_log('step 3: updating xyz table');
  UPDATE xyz set ...

  a1_p_log('step 4: finish');
end;
该过程可能需要一些时间才能完成(分钟、小时…),但我可以随时查询
a1_log
表:

  SELECT id,
         datum,
         LEAD (datum) OVER (ORDER BY id) datum_next,
         (LEAD (datum) OVER (ORDER BY id) - datum) * 24 * 60 * 60 diff_sec,
         descr
    FROM a1_log
ORDER BY id;
注意
DIFF_SEC
value,它显示两个步骤之间的秒数。如果您注意到这里有一个很大的数字,那么您应该尝试优化该查询以使其运行更快



至于你的代码:太复杂了,我说不出什么聪明的话,除了:你可能想从循环中删除所有那些
COMMIT
调用。在过程结束时使用一个
COMMIT

我很确定有,但首先需要包括表、索引、数据量和示例数据…感谢您的评论。我们将此内容放入Pro*C和基于位置的多线程中,以提高代码的性能
begin
  a1_p_log('step 1: initializing');
  -- some init code here

  a1_p_log('step 2: an ugly query follows now');
  SELECT blabla --> very ugly query

  a1_p_log('step 3: updating xyz table');
  UPDATE xyz set ...

  a1_p_log('step 4: finish');
end;
  SELECT id,
         datum,
         LEAD (datum) OVER (ORDER BY id) datum_next,
         (LEAD (datum) OVER (ORDER BY id) - datum) * 24 * 60 * 60 diff_sec,
         descr
    FROM a1_log
ORDER BY id;