【问题标题】:PLSQL- How to exit FORALL LoopPLSQL-如何退出 FORALL 循环
【发布时间】:2016-10-09 16:10:57
【问题描述】:

我在一个程序中有以下代码sn-p,目前 apps.fnd_global. apps_initialize 方法执行是 FORALL 循环的一部分。

我想打电话给不在循环中的apps.fnd_global. apps_initialize。当插入完成时,apps.fnd_global. apps_initialize 应该只执行一次。

我该怎么做?

FORALL i IN 1 .. my_array.COUNT
         INSERT
           INTO my_table
            ......
      COMMIT;         

         apps.fnd_request.submit_request (application   => 'PO',
                                          program       => 'REQIMPORT',
                                          argument1     => l_p4,
                                          argument2     => l_p5,
                                          argument3     => l_p6,
                                          argument4     => '',
                                          argument5     => 'N',
                                          argument6     => 'N');
      COMMIT;

【问题讨论】:

    标签: sql oracle stored-procedures plsql oracle11g


    【解决方案1】:

    FORALL 不是循环 - 所以你不能退出循环。如果您想限制 FORALL 执行的工作,那么您需要限制从原始 BULK COLLECT 返回的数据。

    FND_GLOBAL.apps_initialize() 设置会话级全局变量。您可以在 FORALL 子句之前(如果您希望插入使用新的全局值)或之后(如果您只想影响并发程序执行)调用它。

    【讨论】:

      【解决方案2】:

      你可以循环试试:-

      FOR i IN 1 .. my_array.COUNT
         LOOP
             INSERT
             INTO my_table
              ......
         END LOOP;
         commit;      
      
           apps.fnd_request.submit_request (application   => 'PO',
                                            program       => 'REQIMPORT',
                                            argument1     => l_p4,
                                            argument2     => l_p5,
                                            argument3     => l_p6,
                                            argument4     => '',
                                            argument5     => 'N',
                                            argument6     => 'N');
      

      【讨论】:

      • 是的 FORALL 不能与任何业务逻辑联系在一起。在您的情况下,您在其中调用过程。尝试使用答案中提到的 FOR 循环。只允许使用 DML
      • 请注意:forall 循环在 SQL 引擎中执行语句 N (N = my_array.count) 次数,使其成为非常快速、单一的 SQL 语句,而for 循环是一个 PLSQL 循环,导致N 上下文在 PLSQL 引擎和 SQL 引擎之间来回切换。如果N 足够大,则会有明显的延迟。首先使用forall 插入所有数据,然后使用单独的 for 循环进行后处理可能会更有效。不过,对于 100 或 1000 行来说,这不是问题。
      • @GolezTrol 你的意思是说 100 到 1000 行 FORALLfor loop 没有任何区别?
      • 它确实有所作为,但是 100 行在所有上下文切换中也会非常快。优化这样的循环并不总是必要的,但如果您可以使用 forall 而不会降低代码的可读性或可维护性,这通常是一个好主意。如果您需要将逻辑拆分为单独的循环,这是一个灰色区域,并且最好是一个意见问题:更易读的代码或稍快的代码。这取决于你。
      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2015-01-18
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多