2012-04-11 7 views
0

Ich bekomme einen ORA-06532-Fehler in meinem pl/SQL-Verfahren. Es hat mit meinem Array zu tun, und es scheint auf der Linie zu passieren, die beginnt: "term_1: = ...". Die Abfrage, die in auswählt, erhält 7 Datensätze, also sollte es die gleiche Menge sein, für die ich anrufe. Ich bin ein wenig neu in der SQL-Array-Sache, also habe ich etwas offensichtlich übersehen. Jede Hilfe wird geschätzt, danke.ORA-06532: Tiefgestellt außerhalb des Grenzfehlers

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

Antwort

1

Ich denke, dass Sie dies zu komplizieren. Sie Code entspricht:

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; 

Sie dann die Elemente in Ihrer Art durch ihre Indexwerte verweisen können so term_1 die gleiche wie t_listofterms(1) ist. Es ist nicht notwendig, eine zusätzliche Variable mit demselben Wert zu erstellen. Sie können es auf die gleiche Weise beziehen, so dass length(term1) und length(t_listofterms(1)) auch gleich sind.

Es gibt eine Menge Dinge über Array-Verarbeitung, aber PSOUG ist hilfreich, wie the documentation ist.


nach zu urteilen Ihr Kommentar Sie die Sammlung werden ausdrücklich verweisen, das heißt something := t_listofterms(7). Dies setzt voraus, dass eine bestimmte Anzahl von Zeilen vorhanden ist. Bulk collect füllt eine Sammlung von bis n, wobei n die Anzahl der von der Abfrage zurückgegebenen Zeilen ist. Es ist oft besser, dies zu durchlaufen, wenn Sie etwas damit machen wollen, anstatt explizit zu referenzieren. Etwas wie,

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

    do_something; 

end loop; 
+0

Sie brauchen keine 'LOOP', wenn Sie' BULK COLLECT' ohne 'LIMIT' verwenden. –

+0

Danke @Vincent, das ist die Gewohnheit zu zeigen. – Ben

+0

Vielen Dank für die Antwort und Entschuldigung für die späte Antwort, aber wenn das meinem Code entspricht, würde ich nicht den gleichen Fehler bekommen (was der Fall ist). Aus irgendeinem Grund würde ich immer noch den gleichen Fehler bekommen – Dan

Verwandte Themen