0

pl/sql プロシージャで ORA-06532 エラーが発生します。それは私の配列と関係があり、「term_1 := ...」で始まる行で発生しているようです。選択するクエリは 7 つのレコードを取得するので、私が求めているのと同じ量になるはずです。私は SQL 配列に少し慣れていないので、明らかなことを見落としている可能性があります。どんな助けでも大歓迎です、ありがとう。

DECLARE

listOfTerms      VC50_ARRAY;
term_1           varchar2(30);
term_2           varchar2(30);
term_3           varchar2(30);
term_4           varchar2(30);
term_5           varchar2(30);
term_6           varchar2(30);
term_7           varchar2(30);

BEGIN

SELECT apl.awdp_acad_terms 
BULK COLLECT INTO listOfTerms
FROM fa_years fay 
   JOIN award_periods_ls apl
     ON apl.award_periods_id = fay.award_periods_id 
WHERE (SELECT b.awdp_fa_year as faYear 
      FROM award_periods_ls a 
           JOIN coll18_test.fa_years b ON a.award_periods_id = b.award_periods_id 
     WHERE awdp_acad_terms = v_ug_term) = fay.awdp_fa_year
ORDER BY apl.awdp_acad_terms DESC;

term_1   := listOFTerms(1);     
term_2   := listOFTerms(2);             
term_3   := listOFTerms(3);
term_4   := listOFTerms(4);             
term_5   := listOFTerms(5);             
term_6   := listOFTerms(6);             
term_7   := listOFTerms(7);   
4

1 に答える 1

1

私はあなたがこれを過度に複雑にしていると思います。コードは次と同等です。

DECLARE

   -- Declare the cursor explicitly.
   cursor c_my_cursor is
     SELECT apl.awdp_acad_terms 
       FROM fa_years fay 
       JOIN award_periods_ls apl
         ON apl.award_periods_id = fay.award_periods_id 
      WHERE ( SELECT b.awdp_fa_year as faYear 
                FROM award_periods_ls a 
                JOIN coll18_test.fa_years b 
                  ON a.award_periods_id = b.award_periods_id 
               WHERE awdp_acad_terms = v_ug_term ) = fay.awdp_fa_year
      ORDER BY apl.awdp_acad_terms DESC;

   -- Create a-user defined type that is the same as a single row in the cursor.
   type t__listOfTerms is table of c_my_cursor%rowtype index by binary_integer;
   -- Initialise a variable that is of data-type t__listofterms.
   t_listofterms t__listofterms;

BEGIN

   open c_my_cursor;
   fetch c_my_cursor bulk collect into t_listofterms;
   close c_my_cursor;

END;

次に、タイプ内のアイテムをインデックス値で参照できるのでterm_1、 と同じt_listofterms(1)です。同じ値を持つ追加の変数を作成する必要はありません。同じ方法で参照できますのでlength(term1)length(t_listofterms(1))同じです。

配列処理に関する情報はたくさんありますが、ドキュメントと同様にPSOUGも役立ちます。


あなたのコメントから判断すると、コレクションを明示的に参照している可能性がありますsomething := t_listofterms(7)。これは、特定の数の行があることを前提としています。1からnBulk collectまでのコレクションを埋めます。nは、クエリによって返される行の数です明示的な参照よりも何かをしたい場合は、これをループする方が良いことがよくあります。何かのようなもの、

for i in t_listofterms.first .. t_listofterms.last loop

    do_something;

end loop;
于 2012-04-11T20:42:20.183 に答える