2016-06-09 3 views
0

현재 절차에서 다음 코드 스 니펫이 있습니다. apps.fnd_global. apps_initialize 메서드 실행은 FORALL 루프의 일부입니다.PLSQL- 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; 

답변

1

당신은 루프에 의해 시도 할 수 있습니다 : -

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'); 
+0

예 FORALL은 비즈니스 로직을 적용 할 수 없습니다. 여기 당신의 경우에 당신은 그 안의 절차를 부릅니다. 대답에서 언급 한 것처럼 FOR 루프를 사용해보십시오. DML 만 허용됩니다. –

+2

참고 : forall 루프는 SQL 엔진 내부에서 N 번 (N ='my_array.count') 횟수의 문을 실행하여 매우 빠르고 단일의 SQL 문을 생성합니다. 'for' 루프는 PLSQL 루프이며, 결과적으로'N' 컨텍스트가 PLSQL 엔진과 SQL 엔진 사이를왔다 갔다합니다. 'N'이 충분히 큰 경우, 이것은 눈에 띄는 지연을 가질 것입니다. 먼저 'forall'을 사용하여 모든 데이터를 삽입 한 다음 별도의 for 루프를 사용하여 사후 처리를 수행하는 것이 더 효율적일 수 있습니다. 말하자면, 100 또는 1000 개의 행은 문제가되지 않습니다. – GolezTrol

+0

@GolezTrol 당신은 100 ~ 1000 행'FORALL' 또는'for 루프'에 아무런 차이가 없다고 말하고 싶습니까? – user75ponic

6

FORALL 루프하지 - 그래서 당신은 루프를 종료 할 수 없습니다. FORALL이 수행하는 작업을 제한하려면 원래 BULK COLLECT에서 반환 된 데이터를 제한해야합니다.

FND_GLOBAL.apps_initialize()는 세션 수준 전역을 설정합니다. FORALL 절 앞에 삽입하여 (삽입이 새 전역 값을 사용하도록하려는 경우) 또는 이후 (동시 프로그램 실행에만 영향을 주려는 경우) 호출 할 수 있습니다.

관련 문제