【问题标题】:Error ORA-12154 in Oracle Data IntegratorOracle 数据集成器中的错误 ORA-12154
【发布时间】:2019-02-04 13:31:48
【问题描述】:

我在运行映射时遇到错误。

我创建了一个“新数据服务器”

我可以通过点击“测试连接”按钮成功测试连接。

但映射无法成功运行。完整的错误信息如下:

ODI-1228: Task Merge rows-IKM Oracle Merge-Load USERS fails on the target connection DB-TARGET.
Caused By: java.sql.SQLException: ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения

    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:205)
    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:206)
    at oracle.odi.runtime.agent.execution.SessionTask.doExecuteTask(SessionTask.java:117)
    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.StartSessRequestProcessor.access$1400(StartSessRequestProcessor.java:74)
    at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:702)
    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 : 12154, Position : 154, Sql = 
    MERGE 
  INTO TARGET.USERS USERS
  USING
  (
SELECT 
  USE.NAME AS NAME ,
  USE.PASSWD AS PASSWD ,
  USE.USER_ROLE AS USER_ROLE   
FROM 
  **SOURCE.USERS@"MySource" USE**  
  ) MERGE_SUBQUERY
  ON
  (
    USERS.NAME = MERGE_SUBQUERY.NAME 
   )
  WHEN NOT MATCHED THEN
    INSERT
    (
      NAME ,
      PASSWD ,
      USER_ROLE 
    )
    VALUES
    (
      MERGE_SUBQUERY.NAME ,
      MERGE_SUBQUERY.PASSWD ,
      MERGE_SUBQUERY.USER_ROLE 
    )
  WHEN MATCHED THEN
    UPDATE SET
      PASSWD = MERGE_SUBQUERY.PASSWD ,
      USER_ROLE = MERGE_SUBQUERY.USER_ROLE    , OriginalSql = 
    MERGE 
  INTO TARGET.USERS USERS
  USING
  (
SELECT 
  USE.NAME AS NAME ,
  USE.PASSWD AS PASSWD ,
  USE.USER_ROLE AS USER_ROLE   
FROM 
  SOURCE.USERS@"MySource" USE  
  ) MERGE_SUBQUERY
  ON
  (
    USERS.NAME = MERGE_SUBQUERY.NAME 
   )
  WHEN NOT MATCHED THEN
    INSERT
    (
      NAME ,
      PASSWD ,
      USER_ROLE 
    )
    VALUES
    (
      MERGE_SUBQUERY.NAME ,
      MERGE_SUBQUERY.PASSWD ,
      MERGE_SUBQUERY.USER_ROLE 
    )
  WHEN MATCHED THEN
    UPDATE SET
      PASSWD = MERGE_SUBQUERY.PASSWD ,
      USER_ROLE = MERGE_SUBQUERY.USER_ROLE    , Error Msg = ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения

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

不要与错误 ORA-12154 的俄语描述相混淆。 这意味着 TNS:无法解析指定的连接标识符。

tnsnames.ora 文件存在。我也可以使用 SQL Developer 进行连接

经过一番调查,我觉得这条线

SOURCE.USERS@"MySource" USE

是罪魁祸首

但在执行此脚本之前,ODI 执行了另一个脚本并成功执行。以下是其内容:

create database link "MySource" connect to SOURCE identified by <@=odiRef.getInfo("SRC_PASS") @> using '***'

【问题讨论】:

  • 那里只有一个 TNSNAMES.ORA 文件吗?如果有多个文件(因为每个 Oracle 产品都包含自己的副本),那么您可能没有使用正确的文件...如果是这种情况,请考虑创建 TNSADMIN 环境变量,该变量指向包含您的 TNSNAMES.ORA 文件的目录会保持最新,以便每个 Oracle 软件产品都使用相同的数据。

标签: oracle


【解决方案1】:

我在 SQL Developer 中运行了这两个查询,并将 &lt;@=odiRef.getInfo("SRC_PASS") @&gt; 替换为实际值。

我可以重现错误。

我运行了以下查询以确保已创建 dblink:

select * from all_db_links;

然后我遇到了有人建议以这种方式创建 dblink 的讨论:

create database link "MySource" connect to SOURCE identified by *** using 
'(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oracle.****.***.**)
    )
)';

成功了。我可以在后续查询中使用此链接。但我注意到一种更短的方法是仅使用 SID 创建一个 dblink:

create database link "MySource" connect to SOURCE identified by *** using oracle;

所以我切换到 ODI 并将所有数据服务器中使用的连接字符串从 jdbc:oracle:thin:@&lt;host&gt;:&lt;port&gt;/&lt;service name&gt; 更改为格式 jdbc:oracle:thin:@&lt;host&gt;:&lt;port&gt;:&lt;sid&gt;

这解决了问题。我可以成功运行映射。

不知道为什么不能使用基于服务名称创建的 dblink。

Oracle 并没有按照文档禁止它

创建数据库链接:

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多