在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')
整个错误:
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个
我要去哪里错了?
答案 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语句以直接应用功能。确保将表达式的执行位置更改为源。