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

ODI-1593问题:Procedure中时间字符串被误判为绑定变量求助

解决ODI中时间字符串被识别为绑定变量的ODI-1593错误

问题描述

在ODI Procedure中执行以下代码时,出现错误 ODI-1593: The following bind parameters (MI:SS',499) in the task command (...) are not bound to any value:

DECLARE
  v_msg           CLOB; 

BEGIN 
  v_msg := q'[
  <%=odiRef.getPrevStepLog("MESSAGE")%>
  ]';
  
  INSERT INTO SICGSI.ODI_ERROR_LOG (SESION_ID, SESION_NOMBRE, MENSAJE)
  VALUES (
    <%=odiRef.getSession("SESS_NO")%>,
    '<%=odiRef.getSession("SESS_NAME")%>',
    v_msg
  );  

  COMMIT;
END;

错误原因是odiRef.getPrevStepLog("MESSAGE")返回的错误消息包含HH24:MI:SS格式的时间字符串,ODI会将字符串中的冒号(:)识别为绑定变量的标记,进而判定存在未绑定的变量。

解决方案

通过将消息中的单个冒号替换为两个冒号来避免ODI的绑定变量解析逻辑误判。在Oracle PL/SQL中,两个冒号最终会被解析为单个冒号,但ODI不会将其识别为绑定变量标记。

修改后的代码

DECLARE
  v_msg           CLOB; 

BEGIN 
  -- 将消息中的冒号替换为双冒号,避免ODI识别为绑定变量
  v_msg := REPLACE(q'[<%=odiRef.getPrevStepLog("MESSAGE")%>]', ':', '::');
  
  INSERT INTO SICGSI.ODI_ERROR_LOG (SESION_ID, SESION_NOMBRE, MENSAJE)
  VALUES (
    <%=odiRef.getSession("SESS_NO")%>,
    '<%=odiRef.getSession("SESS_NAME")%>',
    v_msg
  );  

  COMMIT;
END;

另一种方式:在ODI表达式中直接替换

也可以在ODI的EL表达式中提前替换冒号,减少PL/SQL层面的处理:

DECLARE
  v_msg           CLOB; 

BEGIN 
  v_msg := q'[
  <%=odiRef.getPrevStepLog("MESSAGE").replaceAll(":", "::")%>
  ]';
  
  INSERT INTO SICGSI.ODI_ERROR_LOG (SESION_ID, SESION_NOMBRE, MENSAJE)
  VALUES (
    <%=odiRef.getSession("SESS_NO")%>,
    '<%=odiRef.getSession("SESS_NAME")%>',
    v_msg
  );  

  COMMIT;
END;

两种方式都能有效避免ODI将时间字符串中的冒号识别为未绑定的变量,同时保证最终插入到日志表中的消息格式正确(双冒号会被Oracle自动解析为单个冒号)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:33:15