Oracle 函数中的值或数字错误,我可以';我没发现我哪里做错了

Oracle 函数中的值或数字错误,我可以';我没发现我哪里做错了,oracle,exception,plsql,oracle11g,stored-functions,Oracle,Exception,Plsql,Oracle11g,Stored Functions,我有一个用sqldeveloper编写的函数,每次我想要执行时,我都会得到值或数字错误,我根本无法得到我出错的地方 这是我的代码,如果有人能告诉我我的错误隐藏在哪里,我将不胜感激 代码中使用的类型是已定义的,主要由varchar对象和对象表组成,我正确地将它们作为输入变量 我对这个错误感到沮丧,因为我已经编写了类似的函数,它工作得很好,但现在我花了4个小时试图找出值或数字错误的位置 function get_tbank_service_status_bulk ( p_bank_i

我有一个用sqldeveloper编写的函数,每次我想要执行时,我都会得到值或数字错误,我根本无法得到我出错的地方

这是我的代码,如果有人能告诉我我的错误隐藏在哪里,我将不胜感激

代码中使用的类型是已定义的,主要由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;

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

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

错误发生在哪一行?首先,在开头添加
create或replace
。请包括您得到的完整错误堆栈,以及在函数出现异常时调用函数的语句-问题可能在调用方(尝试使用或分配返回值)而不是函数中。类型定义也可能是相关的。尽管如果您正在查看来自
ret_rec:=ITF_RETURN_rec(-1,“执行操作时出错!”,n_message_id,SQLERRM)的输出这可能没有多大帮助。最好用日志记录整个堆栈。最简单的调试步骤是注释掉异常处理程序,因为原始错误堆栈应该显示行号。