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
相关产品推荐
相关产品推荐

