【问题标题】:Oracle ORA-01403: No Data Found while doing a JOIN with OPENQUERY on SQL ServerOracle ORA-01403:在 SQL Server 上使用 OPENQUERY 进行 JOIN 时未找到数据
【发布时间】:2016-05-29 10:12:32
【问题描述】:

这是一个真正的头脑风暴(至少对我来说)

我正在运行一个查询,假设它是:

SELECT number FROM equipment e
left outer join OPENQUERY(ORACLESERVER, 'SELECT num FROM equip_nums WHERE MODEL_NO = ''FOOBAR''') ora
ON e.number = ora.num
WHERE num IS NULL
      AND remove = 'no' 
      AND used = 'yes'
      AND model = 'FOOBAR' 

此查询针对多个模型运行,其中大约 50 个。它适用于其中 47 个模型。但随后它失败并给出以下错误:

    OLE DB provider "OraOLEDB.Oracle" for linked server "ORACLESERVER" returned message "ORA-01403: no data found".
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "ORACLESERVER".

现在,我知道你在想什么。“OPENQUERY 中的查询返回为空,你需要处理它!”虽然我同意应该处理这个案例。问题是那个查询不应该是空的!如果我从同一台服务器运行此查询

SELECT * FROM OPENQUERY(ORACLESERVER, 'SELECT num FROM equip_nums WHERE MODEL_NO = ''FOOBAR''')

我拉回了大约 1100 行。所以我觉得那里应该有用于联接的数据。

任何人都可以对此有所了解吗?我真的很困惑……

【问题讨论】:

  • 我觉得奇怪的是您的查询完全有效,因为两个表都有字段 num 并且您没有在 where 子句中为其设置别名。
  • 您可以尝试将 openquery 中的数据提取到临时表中,然后加入该表

标签: sql sql-server oracle oracle11g


【解决方案1】:

我知道这已经很老了,但由于我花了一些时间来解决这个问题并拯救下一个可能面临同样问题的人,所以我发现了以下内容:

链接服务器可能是使用 Oracle Provider for OLE DB 创建的。 有一个 Oracle Bug 12861185 和 Doc ID 1462403.1 指出使用 openquery 集连接数据可能会导致 No data found 或 Cannot get the data of the row from the OLE DB provider ...。

提供的解决方案是

  1. 使用 Oracle ODBC 驱动程序。

如果您可以访问 ADO 生成的代码,那么您有以下选择:

  1. 使用 adOpenStatic 的 CursorType,而不是 adOpenForwardOnly。

  2. 使用 adOpenStatic 的 CursorType,而不是 adOpenForwardOnly。

  3. 使用 adUseClient(Microsoft 的光标库)而不是 adUseServer(Oracle 的光标库)的 CursorLocation - 这会将默认 CursorType 更改为 adOpenStatic。

  4. 将 fetchsize 增加到总数或行数的值。

虽然将数据提取到本地表然后按照已经回答的方式加入可能会更容易。

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多