PLSQL-如何退出FORALL循环

PLSQL-如何退出FORALL循环,sql,oracle,stored-procedures,plsql,oracle11g,Sql,Oracle,Stored Procedures,Plsql,Oracle11g,目前,我在一个过程中有以下代码片段 apps.fnd\u全球。应用程序初始化方法执行是FORALL循环的一部分 我想打电话给apps.fnd_global。应用程序\u初始化不在循环中。插入完成后,然后apps.fnd\u全局。应用程序_initialize应仅执行一次 我该怎么做 FORALL i IN 1 .. my_array.COUNT INSERT INTO my_table ...... COMMIT;

目前,我在一个过程中有以下代码片段
apps.fnd\u全球。应用程序初始化
方法执行是FORALL循环的一部分

我想打电话给apps.fnd_global。应用程序\u初始化不在循环中。插入完成后,然后
apps.fnd\u全局。应用程序_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;
您可以按循环尝试:-

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不是循环-因此无法退出循环。如果要限制FORALL执行的工作,则需要限制从原始批量收集返回的数据


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

是的,所有这些都不能与任何业务逻辑结合在一起。在本例中,您正在调用其中的过程。尝试使用答案中提到的FOR循环。但是,只允许DML。请注意:
forall
循环在SQL引擎中执行语句
N
(N=
my_array.count
)多次,使其成为一个非常快速、单一的SQL语句,而
for
循环是一个PLSQL循环,导致
N
上下文在PLSQL引擎和SQL引擎之间来回切换。如果
N
足够大,则会有明显的延迟。首先使用
forall
插入所有数据,然后使用单独的for循环进行后处理可能更有效。例如,对于100或1000行,这不会是一个问题。@GolezTrol您的意思是对于100到1000行
FORALL
forloop
没有任何区别?它确实有区别,但是使用所有上下文切换时,100行也会非常快。优化这样的循环并不总是必要的,但是如果您可以使用forall而不降低代码的可读性或可维护性,这通常是一个好主意。如果您需要将逻辑拆分为单独的循环,那么这是一个灰色区域,也是一个意见问题,哪一个是最好的:可读性更强的代码还是速度稍快的代码。这取决于你。