2

ストアド プロシージャに配列を使用する必要があります。だから私は型変数を作成しました:

CREATE OR REPLACE TYPE integer_array is table of number;

次に、ストアド プロシージャを記述しようとしましたが、コンパイルできません。

create or replace
PROCEDURE SP_TEST(
      i_id_profiles in integer_array, 
      o_clients OUT SYS_REFCURSOR
   )
AS
BEGIN
open o_clients for 
    FOR i IN 1..i_id_profiles.count LOOP
      select a.id_client from b_client a, i_client_profile b where a.id_client = b.id_client 
      and b.id_profile = i_id_profiles(i);
    END LOOP;
END SP_TEST;

手伝って頂けますか?選択した SYS_REFCURSOR を取得したい。

ありがとう

エラー:

PLS-00103: 次のいずれかを想定しているときに、シンボル「FOR」が検出されました: ( - + case mod new not null select with
continue avg count current exists max min before sql stddev sum difference execute forall merge time timestamp interval date pipe

PLS-00103: 次のいずれかを予期しているときに、シンボル"end-of-file"が検出されました: 終了プラグマではなく、インスタンス化可能な最終順序が静的メンバーのコンストラクタ・マップをオーバーライドしていません

4

1 に答える 1

3

for loopクエリ (静的または動的) の ref カーソルを開きますが、構成または任意の種類のループ構成の ref カーソルを開くことはできません。意味的に正しくありません。さらに、この状況では、いかなる種類のループもまったく必要ありません。integer_arrayas sql 型 (スキーマ オブジェクト) を作成したので、table演算子を使用して、その型のインスタンスから単純に選択できます (テーブルとして表します)。したがって、手順は次のようになります。

create or replace PROCEDURE SP_TEST(
      i_id_profiles in integer_array, 
      o_clients OUT SYS_REFCURSOR
   )
AS
BEGIN
  open o_clients for 
      select a.id_client 
         from b_client a 
         join i_client_profile b 
           on (a.id_client = b.id_client)
         join table(i_id_profiles)  s
           on b.id_profile = s.column_value;
END SP_TEST;  
于 2013-10-02T10:17:34.310 に答える