【问题标题】:ORA-06533: Subscript beyond count with associative arrayORA-06533: 下标超出关联数组的计数
【发布时间】:2021-05-03 08:02:02
【问题描述】:

我在执行该过程时收到超出计数错误的下标。我试图在我的过程中填充一个关联数组,然后最终使用它来插入。我认为数组的初始化存在错误

包头中的类型定义

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;  

程序代码,仅贴出package_body的相关代码

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;

【问题讨论】:

    标签: arrays oracle associative


    【解决方案1】:

    您正在尝试填充嵌套表,而不是关联数组。

    如果sonic_tab 是一个关联数组,它将被声明为

        TYPE sonic_tab IS TABLE OF sonic_data_rec INDEX BY BINARY_INTEGER;
    

    有关可在 PL/SQL 中使用的不同类型的集合的更多信息,请参阅Oracle documentation on PL/SQL collection types。

    由于您有一个嵌套表格,您需要添加对sonic_tab.EXTEND 的调用以使表格更大。它从大小 0 开始,因为当您通过调用 sonic_tab() 创建它时,您没有将任何记录传递给构造函数。在您尝试向表格的该项目添加任何内容之前,在循环的每次迭代中调用sonic_tab.EXTEND(1);,或者如果您提前知道表格中有多少项目,则在循环之前调用sonic_tab.EXTEND(5000);一次。

    【讨论】:

    • 谢谢。添加 l_son_array.extend(list_size); 后工作正常; list_size 是根据 p_data_list 的大小动态设置的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多