尝试格式化日期时间时出现“操作中不兼容的数据类型”错误

时间:2019-08-29 07:06:54

标签: sql exception sqldatatypes oracle-data-integrator

在ODI中,我从MS SQL Server中的表中获取字段[datetime]。 MS SQL中的日期时间格式为: 2019-06-26 07:41:00.000

我需要将其转换为以下格式:26-06-2019 10:41:00即 DD-MM-YYYY HH:MI:SS ,小时会增加3 ,然后将其写入JSON文件。

JSON中的对应字段为VARCHAR(string)。

但是我收到错误消息: 原因:java.sql.SQLSyntaxErrorException:操作中的数据类型不兼容

我在ODI 12c映射属性表达式编辑器中给出了以下表达:

TO_CHAR(TO_DATE(NVL(SUBSTR(L_MAILITM_EVENTS.EVENT_GMT_DT, 0, INSTR(L_MAILITM_EVENTS.EVENT_GMT_DT, '.')-1), 
L_MAILITM_EVENTS.EVENT_GMT_DT ),'YYYY-MM-DD HH24:MI:SS')+ 3/24, 
'DD-MM-YYYY HH24:MI:SS')

enter image description here

整个错误:

  

ODI-1228:任务插入新行-IKM XML控件附录-在   目标连接IPSEvents_Array_Json。造成原因:    java.sql.SQLSyntaxErrorException:操作中的数据类型不兼容     在org.hsqldb.jdbc.JDBCUtil.sqlException(未知源)处   org.hsqldb.jdbc.JDBCUtil.sqlException(来源不明)   org.hsqldb.jdbc.JDBCStatement.fetchResult(未知来源)位于   org.hsqldb.jdbc.JDBCStatement.execute(来源不明)   com.sunopsis.jdbc.driver.xml.SnpsXmlStatementRedirector.execute(SnpsXmlStatementRedirector.java:77)     在   com.sunopsis.jdbc.driver.xml.SnpsXmlStatement.execute(SnpsXmlStatement.java:31)     在   oracle.odi.runtime.agent.execution.sql.SQLCommand.execute(SQLCommand.java:205)     在   oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:142)     在   oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:28)     在   oracle.odi.runtime.agent.execution.TaskExecutionHandler.handleTask(TaskExecutionHandler.java:52)     在   oracle.odi.runtime.agent.execution.SessionTask.processTask(SessionTask.java:206)     在   oracle.odi.runtime.agent.execution.SessionTask.doExecuteTask(SessionTask.java:117)     在   oracle.odi.runtime.agent.execution.AbstractSessionTask.execute(AbstractSessionTask.java:886)     在   oracle.odi.runtime.agent.execution.SessionExecutor $ SerialTrain.runTasks(SessionExecutor.java:2225)     在   oracle.odi.runtime.agent.execution.SessionExecutor.executeSession(SessionExecutor.java:610)     在   oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor $ 1.doAction(TaskExecutorAgentRequestProcessor.java:718)     在   oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor $ 1.doAction(TaskExecutorAgentRequestProcessor.java:611)     在   oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:203)     在   oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor.doProcessStartAgentTask(TaskExecutorAgentRequestProcessor.java:800)     在   oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access $ 1400(StartSessRequestProcessor.java:74)     在   oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor $ StartSessTask.doExecute(StartSessRequestProcessor.java:702)     在   oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:180)     在   oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor $ 2.run(DefaultAgentTaskExecutor.java:108)     在java.lang.Thread.run(Thread.java:748)造成原因:   org.hsqldb.HsqlException:操作中的数据类型不兼容   org.hsqldb.error.Error.error(未知源)位于   org.hsqldb.error.Error.error(未知源)位于   org.hsqldb.FunctionSQL.resolveTypes(未知来源)位于   org.hsqldb.FunctionCustom.resolveTypes(未知来源)位于   org.hsqldb.ExpressionArithmetic.resolveTypes(未知来源)位于   org.hsqldb.FunctionSQL.resolveTypes(未知来源)位于   org.hsqldb.ExpressionLogical.resolveTypes(未知来源)位于   org.hsqldb.ExpressionOp.resolveTypesForCaseWhen(来源未知)   org.hsqldb.ExpressionOp.resolveTypes(未知来源)位于   org.hsqldb.FunctionCustom.resolveTypes(未知来源)位于   org.hsqldb.ExpressionArithmetic.resolveTypes(未知来源)位于   org.hsqldb.FunctionCustom.resolveTypes(未知来源)位于   org.hsqldb.QuerySpecification.resolveExpressionTypes(未知来源)     在org.hsqldb.QuerySpecification.resolveTypesPartOne(未知来源)     在org.hsqldb.RangeVariable.resolveRangeTable(未知源)处   org.hsqldb.QuerySpecification.resolveRangeVariables(未知来源)     在org.hsqldb.QuerySpecification.resolveReferences(未知来源)     在org.hsqldb.QueryExpression.resolve(未知来源)处   org.hsqldb.ParserDML.compileInsertStatement(来源未知)   org.hsqldb.ParserCommand.compilePart(未知源)位于   org.hsqldb.ParserCommand.compileStatements(未知来源)位于   org.hsqldb.Session.executeDirectStatement(来源未知)   org.hsqldb.Session.execute(未知来源)...还有22个

我要去哪里错了?

1 个答案:

答案 0 :(得分:2)

由于目标是文件,因此它不是进行转换的Oracle数据库,而是ODI Studio或ODI代理的内部HSQL数据库。此处不能使用Oracle函数,但可以用HSQL函数代替。以下是可用的功能:http://hsqldb.org/doc/guide/builtinfunctions-chapt.html

或者,可以在L_MAILITM_EVENTS数据存储区之后,向映射中添加一个表达式,以使用MS SQL特定功能对源数据库进行转换。这将更改在MS SQL上执行的SELECT语句以直接应用功能。确保将表达式的执行位置更改为源。