2017-12-18 26 views
1

에 즉시 실행 나는 다음과 같은 코드가 있습니다 here을 제안오라클 APEX : 수집

declare 
    y pls_integer := 0; 
    v_msg varchar2(4000); 
    plsql varchar(4000); 
begin 
    if not apex_collection.collection_exists(p_collection_name=>'P16_COLLECTION') then 
     wwv_flow.debug('No Apex collection found!'); 
    else 
     for x in (select * from apex_collections where collection_name = 'P16_COLLECTION' and seq_id > 1 order by seq_id) 
     loop 
      y := y+1; 
      FOR i IN 1..25 
      LOOP 
       plsql := 'begin apex_collection.update_member_attribute (p_collection_name=> ''P16_COLLECTION'', p_seq=>' || TO_CHAR(x.seq_id) || ',p_attr_number =>' || TO_CHAR(i) || ',p_attr_value=>wwv_flow.g_f' || TO_CHAR(i, 'FM00') || '(' || TO_CHAR(y) || ')); end;'; 
       wwv_flow.debug(plsql); 
       EXECUTE IMMEDIATE plsql; 
      END LOOP; 
     end loop; 
    end if; 
exception when others then 
    v_msg := ''||sqlerrm; 
    wwv_flow.debug('ERR: '||v_msg); 
end; 

이 코드는 매우 유사하다, 그러나 25 개 컬럼을 통해 내가 루프. Oracle Apex의 문제는 PL/SQL이 허용하는 최대 문자 수이므로- calls를 작성할 수 없습니다.

그러나 excecuting 대신 오류 no data found이 표시됩니다.

나는 P16_COLLECTION 콜렉션이 존재하는지 세 번 확인했습니다.

+0

동적 인 SQL이'apex_collection.update_member_attribute'를 호출 할 필요가 없으므로 피해야합니다. 대신 동적 SQL을 최소화하여'wwv_flow.g_fnn (y)'값을 가져 오는 것이 필요합니다. 더 좋은 점은 루프를 풀고 정적 PL/SQL을 사용하는 것입니다. –

답변

0

오라클 에이펙스에 문제가 문자의 PL의 최대 수입니다/SQL은

나는이 문장을 이해 확실하지 않다가 허용된다. 당신이 사용하는 PL/SQL입니다. 로컬 PLSQL 변수를 VARCHAR2 (4000)로 선언했습니다. 왜 최대 허용 크기 인 32767을 지정하지 않았습니까? 그게 도움이 되겠습니까?

더욱이 NO-DATA-FOUND 예외가 있다고 말하면 이 코드가이를 제기 했습니까? 왜냐하면 거기에 SELECT 문이 없습니다 ... 커서 FOR 루프에 사용 된 것이 NO-DATA-FOUND를 발생시킬 수 없습니다. UPDATE. 그러므로 그것은 다른 것임에 틀림 없습니다.

디버깅을 사용하도록 설정하고 페이지를 실행 한 다음 오류보기 디버그 결과를 얻고 범인을 찾습니다.

+0

변수에 대해 언급하지 않고 코드 자체에 대해 이야기하고있었습니다. 코드가 너무 길면 APEX에서 오류가 발생합니다. –

+0

아하; 나는 네가하는 말을 지금 이해하고 있다고 생각한다. 어떤 Apex 버전을 사용합니까? 최대 4.2 (아마) 또는 5.0 (확실), 우리가 작성한 코드를 저장하는 Apex 테이블은 VARCHAR2 (4000) 였으므로 이보다 긴 코드는 모두 "유효하지 않습니다". 그 제한에 부딪쳤을까요? 최근 Apex 버전에서는 CLOB (필자가 생각하기에) 매우 긴 쿼리를 작성하여 사용할 수 있습니다. 따라서 하위 버전을 사용하는 경우 해당 코드를 저장 프로 시저로 이동하고 Apex에서 호출 할 수 있는지 확인하십시오. 그렇지 않다면, 허, 내 생각은 ... – Littlefoot

+0

그래, 내가 5.1을 사용하기 때문에 ... –