에 즉시 실행 나는 다음과 같은 코드가 있습니다 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
콜렉션이 존재하는지 세 번 확인했습니다.
동적 인 SQL이'apex_collection.update_member_attribute'를 호출 할 필요가 없으므로 피해야합니다. 대신 동적 SQL을 최소화하여'wwv_flow.g_fnn (y)'값을 가져 오는 것이 필요합니다. 더 좋은 점은 루프를 풀고 정적 PL/SQL을 사용하는 것입니다. –