【问题标题】:ORA-00933 when running procedure in ODI 12c在 ODI 12c 中运行过程时出现 ORA-00933
【发布时间】:2019-07-02 03:50:01
【问题描述】:

我正在创建一个一次性过程,以从现有源更新目标表中新添加的列。我创建了更新语句,在 SQLDeveloper 中对其进行了测试,并确认它完全符合我的要求。但是,当我将此代码添加到过程任务中时,它给了我一个 ORA-00933(SQL 命令未正确结束)错误。我附上了有问题的 sql 语句以及我选择的选项的一些解释。

已经完成:

  • 新列添加到数据库表中
  • 目标表模型已更新
  • 映射已更新
  • 验证初始加载在新列中的结果正确
  • 已验证日志负载在新列中的结果正确

尝试过(没有区别):

  • 添加和删除分号 (;)
  • 简化查询以删除“WHERE EXISTS”子句

目标命令:

UPDATE <%=odiRef.getSchemaName( "TARGET_SCHEMA", "D")%>.TARGET_TABLE target
   SET NEW_COLUMN = (SELECT source.EXISTING_COLUMN
                         FROM <%=odiRef.getSchemaName( "SOURCE_SCHEMA", "D")%>.SOURCE_TABLE source
                        WHERE target.SOURCE_KEY = source.PRIM_KEY)
 WHERE EXISTS (
    SELECT 1
      FROM <%=odiRef.getSchemaName( "SOURCE_SCHEMA", "D")%>.SOURCE_TABLE source
     WHERE target.SOURCE_KEY = source.PRIM_KEY)

目标命令设置:

技术:甲骨文
事务隔离:无变化
上下文:执行上下文
逻辑架构:TARGET_SCHEMA
事务:自动提交
提交:未定义

错误信息:

ODI-1217: Session POPULATE_TARGET_TABLE_NEW_FLAG (123456789) fails with return code 933.
ODI-1226: Step Populate_target_table_new_flag fails after 1 attempt(s).
ODI-1232: Procedure Populate_target_table_new_flag execution fails.
ODI-1228: Task Procedure-Populate_target_table_new_flag-Populate target table with New Flag fails on the target connection SOURCE_SCHEMA.
Caused By: java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:495)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:447)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1055)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:624)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:253)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:613)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:214)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:38)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:891)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1194)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1835)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1790)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:301)
    at oracle.odi.runtime.agent.execution.sql.SQLCommand.execute(SQLCommand.java:208)
    at oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:142)
    at oracle.odi.runtime.agent.execution.sql.SQLExecutor.execute(SQLExecutor.java:28)
    at oracle.odi.runtime.agent.execution.TaskExecutionHandler.handleTask(TaskExecutionHandler.java:52)
    at oracle.odi.runtime.agent.execution.SessionTask.processTask(SessionTask.java:216)
    at oracle.odi.runtime.agent.execution.SessionTask.doExecuteTask(SessionTask.java:127)
    at oracle.odi.runtime.agent.execution.AbstractSessionTask.execute(AbstractSessionTask.java:886)
    at oracle.odi.runtime.agent.execution.SessionExecutor$SerialTrain.runTasks(SessionExecutor.java:2225)
    at oracle.odi.runtime.agent.execution.SessionExecutor.executeSession(SessionExecutor.java:610)
    at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor$1.doAction(TaskExecutorAgentRequestProcessor.java:718)
    at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor$1.doAction(TaskExecutorAgentRequestProcessor.java:611)
    at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:203)
    at oracle.odi.runtime.agent.processor.TaskExecutorAgentRequestProcessor.doProcessStartAgentTask(TaskExecutorAgentRequestProcessor.java:800)
    at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor.access$2700(StartScenRequestProcessor.java:85)
    at oracle.odi.runtime.agent.processor.impl.StartScenRequestProcessor$StartScenTask.doExecute(StartScenRequestProcessor.java:917)
    at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:180)
    at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:108)
    at java.lang.Thread.run(Thread.java:748)
Caused by: Error : 933, Position : 331, Sql = UPDATE TARGET_TABLE target 
SET NEW_COLUMN = (SELECT source.EXISTING_COLUMN
FROM SOURCE_SCHEMA.SOURCE_TABLE source 
WHERE target.SOURCE_KEY = source.PRIM_KEY) 
 WHERE EXISTS ( 
SELECT 1 
  FROM SOURCE_SCHEMA.SOURCE_TABLE source 
 WHERE target.SOURCE_KEY = source.PRIM_KEY);, OriginalSql = UPDATE 
TARGET_TABLE target 
SET NEW_COLUMN = (SELECT source.EXISTING_COLUMN
                     FROM SOURCE_SCHEMA.SOURCE_TABLE source 
                    WHERE target.SOURCE_KEY = source.PRIM_KEY) 
 WHERE EXISTS ( 
SELECT 1 
  FROM SOURCE_SCHEMA.SOURCE_TABLE source 
     WHERE target.SOURCE_KEY = source.PRIM_KEY);, Error Msg = ORA-00933: SQL command not properly ended

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:499)
... 30 more

【问题讨论】:

  • 日志中的SQL语句包含分号,我认为是问题,尝试摆脱它...

标签: oracle oracle-data-integrator


【解决方案1】:

所以问题不在于完全代码本身,而是我没有在代码更改之间重新生成我的场景这一事实。我自己的错,我在 ODI 中主要是自学成才,没想到要尝试...

感谢 Marmite Bomber,您的评论让我更深入地研究了这个问题,并意识到“生成”的代码在我做出任何更改时都没有更新。

【讨论】:

    【解决方案2】:

    由于发布的代码中存在无效字符,我希望这些无效字符应该被传递给 Oracle 执行的代码中的目标表所有者和 table_name 替换,因此我怀疑生成的 SQL 不正确。无论如何,您可以捕获传递给 Oracle 的代码吗?

    【讨论】:

    • 错误消息确实包含生成的 SQL(在放入 SQL Developer 时确实有效。值得注意的是,“TARGET_SCHEMA”被忽略了,但我认为这是因为它被逻辑架构,因此 ODI 正在使用更改会话处理该问题(如果不是,我预计会出现不同的错误)。错误消息太长,无法评论,将使用它更新原始问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多