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而不降低代码的可读性或可维护性,这通常是一个好主意。如果您需要将逻辑拆分为单独的循环,那么这是一个灰色区域,也是一个意见问题,哪一个是最好的:可读性更强的代码还是速度稍快的代码。这取决于你。