2017-12-18 15 views
1

に即時実行します。Oracleの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; 

をこのコードは1に非常によく似ているがhereを提案したが、私25個の列をループ。 Oracle Apexの問題は、PL/SQLで許可されている文字の最大数です。したがって、私は25 update_member_attribute - 呼び出しを書くことはできません。

しかし、その代わりに私はエラーno data foundを得ます。

コレクションP16_COLLECTIONが存在することを3回確認しました。

+0

'apex_collection.update_member_attribute'を呼び出すために動的SQLを必要としないので、あなたはそれを避けるべきです。代わりに、 'wwv_flow.g_fnn(y)'の値を取得するのに必要な最小限の動的SQLを最小化してください。さらに、ループを展開し、静的PL/SQLを使用してください。 –

答えて

0

Oracleのアペックスの問題は、PL/SQLは、私がこの文を理解わからない

を持つことが許可されている文字の最大数です。使用するPL/SQLです。ローカルのPLSQL変数をVARCHAR2(4000)として宣言しました。なぜ最大許容サイズ32767を指定しなかったのですか?助けてくれますか?

また、NO-DATA-FOUND例外があると言っています。はこのコードによって引き上げられましたか?なぜなら、SELECT文がないからです。カーソルFORループで使用したものは、NO-DATA-FOUNDを生成できません。 UPDATEのいずれか。したがって、それは他のものでなければなりません、私は推測します。

DEBUGを有効にして、ページを実行し、エラーが発生したらデバッグ結果を表示し、原因を突き止めます。

+0

私は変数について話していませんでした、私はコード自体について話していました。コードが長すぎると、APEXはエラーを発生させます。 –

+0

Aha;私は今あなたが言っていることを理解していると思います。どのApexバージョンを使用しますか?最大4.2(多分)または5.0(確かに)まで、私たちが書くコードを格納するApexテーブルはVARCHAR2(4000)なので、それより長いすべてのコードは "無効"でした。たぶんあなたはその制限を打つ?最近のApexバージョンではCLOB(私は思う)ですので、非常に長いクエリーを書くことができ、うまくいきます。したがって、より低いバージョンの場合は、そのコードをストアドプロシージャに移動してApexから呼び出すことができるかどうかを確認してください。もしそうでなければ、うん、いいえ... – Littlefoot

+0

ええ、私は5.1を使用しています... –

関連する問題