You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-06502错误排查:执行PL/SQL时遇字符转数字转换异常

ORA-06502: PL/SQL 数值或值错误排查求助

执行PL/SQL代码时触发ORA-06502: PL/SQL: numeric or value error错误,错误提示指向第26行(该行是空行),其下方是调用AR_TRANSACTION_GRP.INCOMPLETE_TRANSACTION的语句。尝试多种方法仍未解决,附上代码及错误详情,求定位问题及操作失误点。

我的PL/SQL代码

SET SERVEROUTPUT ON
declare
l_api_version           NUMBER ;
l_init_msg_list         VARCHAR2(1000);
l_commit                VARCHAR2(1000);
l_validation_level      NUMBER  ;
l_customer_trx_id       ra_customer_trx.customer_trx_id%type;
lx_return_status        VARCHAR2(1000);
lx_msg_count            NUMBER;
lx_msg_data             VARCHAR2(2000);

L_TIPO NUMBER;
L_GCC NUMBER;
L_NC_ID NUMBER := 4855753;
begin

MO_GLOBAL.SET_POLICY_CONTEXT('S',281);
fnd_global.APPS_INITIALIZE(user_id=>7028,resp_id=>51944,resp_appl_id=>222);

DBMS_OUTPUT.PUT_LINE('NOT COMPLETE');

select  cust_trx_type_id , TO_NUMBER(GL_ID_REC) 
INTO L_TIPO,L_GCC
from ra_cust_trx_types_all where NAME = 'NC B 0018 VI Closed';


AR_TRANSACTION_GRP.INCOMPLETE_TRANSACTION(
      p_api_version           =>'1.0',
      p_init_msg_list         =>fnd_api.g_true,
      p_commit                =>fnd_api.g_true,
      p_validation_level      =>fnd_api.g_valid_level_none,
      p_customer_trx_id       =>L_NC_ID,
      x_return_status         =>Lx_return_status,
      x_msg_count             =>Lx_msg_counT,
      x_msg_data              =>Lx_msg_data);

DBMS_OUTPUT.PUT_LINE('Lx_return_status '||Lx_return_status);
DBMS_OUTPUT.PUT_LINE('Lx_msg_counT '||Lx_msg_counT);
DBMS_OUTPUT.PUT_LINE('Lx_msg_data '||Lx_msg_data);

IF Lx_return_status = 'S' THEN

  update ra_customer_trx_all 
     set cust_trx_type_id = L_TIPO,
         doc_sequence_value =L_NC_ID
   where customer_trx_id = L_NC_ID;

   UPDATE RA_CUST_TRX_LINE_GL_DIST_ALL 
      SET CODE_COMBINATION_ID = L_GCC
    WHERE CUSTOMER_tRX_ID = L_NC_ID
      AND ACCOUNT_CLASS = 'REC';

DBMS_OUTPUT.PUT_LINE('COMPLETO');

AR_TRANSACTION_GRP.COMPLETE_TRANSACTION(
      p_api_version           =>'1.0',
      p_init_msg_list         =>fnd_api.g_true,
      p_commit                =>fnd_api.g_true,
      p_validation_level      =>fnd_api.g_valid_level_none,
      p_customer_trx_id       =>L_NC_ID,
      x_return_status         =>Lx_return_status,
      x_msg_count             =>Lx_msg_counT,
      x_msg_data              =>Lx_msg_data);


DBMS_OUTPUT.PUT_LINE('Lx_return_status '||Lx_return_status);
DBMS_OUTPUT.PUT_LINE('Lx_msg_counT '||Lx_msg_counT);
DBMS_OUTPUT.PUT_LINE('Lx_msg_data '||Lx_msg_data);

  update ra_customer_trx_all 
     set doc_sequence_value =NULL
   where customer_trx_id = L_NC_ID;

      
END IF;      
      
COMMIT;

end;

错误信息详情

  1. 00000 - "PL/SQL: numeric or value error%s"
    *原因: 发生了算术、数值、字符串、转换或约束错误。例如,尝试将NULL值分配给声明为NOT NULL的变量,或者尝试将大于99的整数分配给声明为NUMBER(2)的变量时,会触发此错误。
    *操作: 修改数据、数据操作方式或变量声明,确保值不违反约束。

问题排查方向

1. API参数类型不匹配

AR_TRANSACTION_GRP.INCOMPLETE_TRANSACTION的p_api_version参数,你传入的是字符串'1.0',但这类EBS标准API的版本参数通常定义为数值类型(NUMBER)。需将参数改为数值形式,同时同步修改后续COMPLETE_TRANSACTION调用的对应参数:

p_api_version           =>1.0,

2. TO_NUMBER(GL_ID_REC)转换失败

查询语句中的类型转换可能存在问题:

  • 单独执行以下SQL,验证目标行的GL_ID_REC是否能正常转成数值:
select cust_trx_type_id, GL_ID_REC, TO_NUMBER(GL_ID_REC) 
from ra_cust_trx_types_all where NAME = 'NC B 0018 VI Closed';
  • 如果GL_ID_REC包含非数字字符、NULL值,都会触发转换错误,需要先修复数据或添加异常处理。

3. 输出变量长度不足

lx_msg_data当前定义为VARCHAR2(2000),如果API返回的错误信息超过该长度会导致溢出。建议调整为VARCHAR2(4000),Oracle 12c及以上版本可改用CLOB类型。

4. 交易数据本身异常

传入的L_NC_ID=4855753对应的交易可能不符合API调用条件:

  • 检查ra_customer_trx_all中该交易的状态是否允许调用INCOMPLETE_TRANSACTION(比如是否已经是完成状态)
  • 验证该交易关联的行项目、GL分配记录是否存在数据缺失或约束违反

5. 添加异常捕获辅助排查

当前代码无异常处理逻辑,建议添加EXCEPTION块捕获详细错误:

EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('错误代码: ' || SQLCODE);
    DBMS_OUTPUT.PUT_LINE('错误信息: ' || SQLERRM);
    RAISE;

内容的提问来源于stack exchange,提问作者JustChilling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:04:52