首页 > 解决方案 > 函数中的值或数字错误,我无法检测到哪里出错了 Oracle

问题描述

我有一个用 SQL 开发人员编写的函数,每次我想执行时都会得到值或数字错误,我根本无法找到我出错的地方。

这是我的代码,所以如果有人能给我一些关于我的错误隐藏在哪里的提示,我将不胜感激。

代码中使用的类型已定义,主要由 varchar 对象和对象表组成,我正确地将它们作为输入变量。

我对这个错误感到沮丧,因为我已经编写了类似的函数并且它工作得很好,但现在我花了 4 个小时试图找出值或数字错误在哪里。

function get_tbank_service_status_bulk (
        p_bank_id_tab IN bank_id_tab,
        p_service_status_tab OUT bank_service_status_tab
      ) return ITF_RETURN_REC
    is
    v_count         number;
    n_message_id    number;
    k_out           number := 0;
    ret_rec         ITF_RETURN_REC;

    cursor tbstatus_cur (p_bank_id_tab bank_id_tab)
     is select tbc.rowid row_id, tbc.BANK_ID bank_id, tbc.service_status service_status
    from TABLE (CAST (p_bank_id_tab AS bank_id_tab)) bid, mdm.mdm_tbank_customer tbc where bid.bank_id=tbc.bank_id ;

    type cur_tbstatus_tab is table of tbstatus_cur%rowtype;
    l_tbstatus_status           cur_tbstatus_tab;
   BEGIN
      select MESSAGE_ID_SEQ.nextval into n_message_id from dual;
      v_count := p_bank_id_tab.COUNT;
      p_service_status_tab  := bank_service_status_tab();
      if v_count = 0 then
         return itf_return_rec(0, ' ', n_message_id, ' ');
      end if;
        open tbstatus_cur(p_bank_id_tab);
           fetch tbstatus_cur bulk collect into l_tbstatus_status;
              for i in l_tbstatus_status.first..l_tbstatus_status.last
                loop
                    if  l_tbstatus_status(i).row_id is null then
                        p_service_status_tab.extend;
                        k_out := p_service_status_tab.last;
                        p_service_status_tab(k_out) := bank_service_status_rec(l_tbstatus_status(i).bank_id, -1);
                         DBMS_OUTPUT.PUT_LINE(  'nes1 || : ' );
                    else
                    DBMS_OUTPUT.PUT_LINE(  'nes4 || : ' );
                        p_service_status_tab.extend;
                        k_out := p_service_status_tab.last;
                        p_service_status_tab(k_out) := bank_service_status_rec(l_tbstatus_status(i).bank_id,l_tbstatus_status(i).service_status);
                    end if;
                end loop; 
    if tbstatus_cur%isopen then
        close tbstatus_cur;
    end if;
    ret_rec := ITF_RETURN_REC(0, ' ', n_message_id, ' ');
    commit; 
    return ret_rec;
    exception
    when others then
      rollback;
      if tbstatus_cur%isopen then
        close tbstatus_cur;
      end if;
      ret_rec := ITF_RETURN_REC(-1, 'Error while performing operation!', n_message_id, SQLERRM);
      mdm_itf_logger.log_end('ERROR');
      return ret_rec;

    end get_tbank_service_status_bulk;

标签: oracleexceptionplsqloracle11gstored-functions

解决方案


添加以下内容以列出错误发生的确切位置。

  DBMS_OUTPUT.put_line( SQLERRM || UTL_TCP.crlf || DBMS_UTILITY.format_error_backtrace );

推荐阅读