ORA-06533: Subscript beyond count with associative array

1.2k Views Asked by At

I am getting Subscript beyond count error while executing the procedure. I am trying to populate an associative array in my procedure and then eventually use it to insert. I think there is somewhere error in initialization of the array

Type definitions in a package header

TYPE sonic_data_rec IS RECORD(
    ep_a_num          LOG_PICK.EP_A_NUM%TYPE,
    wvy_num           LOG_PICK.WVY_NUM%TYPE,
    ltrl_name         LOG_PICK.Ltrl_Name%TYPE,
    vel_pick_sq_num   LOG_PICK.w_vel_pick_sq_num%TYPE,
    vel_sv_typ_cd     LOG_PICK.W_VEL_SV_TYP_CD%TYPE,
    vel_sv_dt         LOG_PICK.W_VEL_SV_DT%TYPE,
    w_vel_log_pick_cd LOG_PICK.w_vel_log_pick_cd%TYPE,
    sq_num            LOG_PICK.W_VEL_PICK_SQ_NUM%TYPE,
    pick_cd           LOG_PICK.W_VEL_LOG_PICK_CD%TYPE,
    onew_tm                 LOG_PICK.W_VEL_ONE_WAY_TV_TM%TYPE,
    sonic_log               LOG_PICK.W_VEL_SOLOG_CALB_VSP%TYPE,
    ms_dpth                 LOG_PICK.W_VEL_PICK_DPTH%TYPE,
    tv_dpth                 LOG_PICK.W_VEL_PICK_DPTH%TYPE);
    
TYPE sonic_tab IS TABLE OF sonic_data_rec;  

Procedure code, only relevant code of package_body posted

PROCEDURE LOAD_LOG_PICK
   (p_wvy_num IN  WELL_VEL_SURVEY.WVY_NUM%TYPE
   ,p_noofpts IN NUMBER
   ,p_data_list IN STRINGARRAY)
   IS
   
   l_son_array sonic_tab := sonic_tab(); 
   
   BEGIN
   
    count1 := 1;
            LOOP
            
            l_son_array(count1).ep_a_num := p_ep_a_num;
               l_son_array(count1).wvy_num := p_wvy_num;
               l_son_array(count1).vel_sv_typ_cd := 'L';
               l_son_array(count1).vel_sv_dt := p_pick_date;
               l_son_array(count1).vel_pick_sq_num := count1;
               l_son_array(count1).w_vel_log_pick_cd := 'O';
               l_son_array(count1).ms_dpth := l_ms_dpth;
               l_son_array(count1).onew_tm := regexp_substr(p_data_list(count1), '[^ ]+', 1, 1);
               l_son_array(count1).sonic_log := regexp_substr(p_data_list(count1), '[^ ]+', 1, 1);
               
               EXIT WHEN count1=5000;
              count1 := count1+1;
            END LOOP;
1

There are 1 best solutions below

1
Luke Woodward On

You are attempting to populate a nested table, not an associative array.

If sonic_tab was an associative array, it would be declared as

    TYPE sonic_tab IS TABLE OF sonic_data_rec INDEX BY BINARY_INTEGER;

See the Oracle documentation on PL/SQL collection types for further information about the different types of collections you can use in PL/SQL.

As you have a nested table, you need to add calls to sonic_tab.EXTEND to make the table larger. It starts with size 0 because when you create it by calling sonic_tab(), you aren't passing any records into the constructor. Either call sonic_tab.EXTEND(1); in each iteration of the loop before you try to add anything to that item of the table, or call sonic_tab.EXTEND(5000); once before the loop if you know in advance how many items you will have in the table.