2012-04-11 3 views
0

私のpl/sqlプロシージャでORA-06532エラーが発生します。それは私の配列と関係しており、開始する行では起こっているようです: "term_1:= ..."。選択するクエリは7つのレコードを取得するので、それは私が求めているものと同じ量でなければなりません。私は、SQL配列のものに少し新しいので、私は明らかに何かを逃している可能性があります。どんな助けでも感謝しています。ORA-06532:限度外の下付き文字

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); 

答えて

1

あなたはこれを過度に複雑にしていると思います。あなたがそのようにterm_1t_listofterms(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; 

:あなたのコードは同等です。同じ値を持つ追加の変数を作成する必要はありません。同じ方法でそれを参照できるので、length(term1)length(t_listofterms(1))も同じです。

アレイ処理については、そこにはたくさんのものがありますが、PSOUGは、the documentationとして役立ちます。


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

+0

'' LIMIT'なしで 'BULK COLLECT'を使う場合、' LOOP'は必要ありません。 –

+0

ありがとう@ヴィンセント、それは癖があることを示しています。 – Ben

+0

ありがとう、ありがとう、遅い応答を申し訳ありませんが、これは私のコードと同等であれば、私は同じエラー(場合)を得るwouldnt。私はまだ同じエラーが発生する理由は何でも – Dan

関連する問題