sql - Oracle ANSI 左外连接在 11gR2 中具有超过 1050 列

标签 sql oracle join

我在 Oracle (11.2.0.1.0) 上遇到问题,过多的左外连接(或者连接表中的列过多)会导致以下错误:

ORA-03113: 通信 channel 上的文件结尾

alert.log 文件显示的基本错误如下:

ORA-07445:遇到异常:核心转储...

我们之前见过类似的问题,但出现了不同的错误:

ORA-01445: 无法从没有连接 View 的连接 View 中选择 ROWID 或示例 key 保留表

When ANSI SQL Join Syntax Does Not Work in Oracle

ORA-01445

测试用例:

-- create 100 colum table
CREATE TABLE BIG_TABLE
(
  c1 NVARCHAR2(1), c2 NVARCHAR2(1), c3 NVARCHAR2(1), c4 NVARCHAR2(1), c5 NVARCHAR2(1), c6 NVARCHAR2(1), c7 NVARCHAR2(1), c8 NVARCHAR2(1), c9 NVARCHAR2(1), c10 NVARCHAR2(1), 
  c11 NVARCHAR2(1), c12 NVARCHAR2(1), c13 NVARCHAR2(1), c14 NVARCHAR2(1), c15 NVARCHAR2(1), c16 NVARCHAR2(1), c17 NVARCHAR2(1), c18 NVARCHAR2(1), c19 NVARCHAR2(1), c20 NVARCHAR2(1), 
  c21 NVARCHAR2(1), c22 NVARCHAR2(1), c23 NVARCHAR2(1), c24 NVARCHAR2(1), c25 NVARCHAR2(1), c26 NVARCHAR2(1), c27 NVARCHAR2(1), c28 NVARCHAR2(1), c29 NVARCHAR2(1), c30 NVARCHAR2(1), 
  c31 NVARCHAR2(1), c32 NVARCHAR2(1), c33 NVARCHAR2(1), c34 NVARCHAR2(1), c35 NVARCHAR2(1), c36 NVARCHAR2(1), c37 NVARCHAR2(1), c38 NVARCHAR2(1), c39 NVARCHAR2(1), c40 NVARCHAR2(1), 
  c41 NVARCHAR2(1), c42 NVARCHAR2(1), c43 NVARCHAR2(1), c44 NVARCHAR2(1), c45 NVARCHAR2(1), c46 NVARCHAR2(1), c47 NVARCHAR2(1), c48 NVARCHAR2(1), c49 NVARCHAR2(1), c50 NVARCHAR2(1), 
  c51 NVARCHAR2(1), c52 NVARCHAR2(1), c53 NVARCHAR2(1), c54 NVARCHAR2(1), c55 NVARCHAR2(1), c56 NVARCHAR2(1), c57 NVARCHAR2(1), c58 NVARCHAR2(1), c59 NVARCHAR2(1), c60 NVARCHAR2(1), 
  c61 NVARCHAR2(1), c62 NVARCHAR2(1), c63 NVARCHAR2(1), c64 NVARCHAR2(1), c65 NVARCHAR2(1), c66 NVARCHAR2(1), c67 NVARCHAR2(1), c68 NVARCHAR2(1), c69 NVARCHAR2(1), c70 NVARCHAR2(1), 
  c71 NVARCHAR2(1), c72 NVARCHAR2(1), c73 NVARCHAR2(1), c74 NVARCHAR2(1), c75 NVARCHAR2(1), c76 NVARCHAR2(1), c77 NVARCHAR2(1), c78 NVARCHAR2(1), c79 NVARCHAR2(1), c80 NVARCHAR2(1), 
  c81 NVARCHAR2(1), c82 NVARCHAR2(1), c83 NVARCHAR2(1), c84 NVARCHAR2(1), c85 NVARCHAR2(1), c86 NVARCHAR2(1), c87 NVARCHAR2(1), c88 NVARCHAR2(1), c89 NVARCHAR2(1), c90 NVARCHAR2(1), 
  c91 NVARCHAR2(1), c92 NVARCHAR2(1), c93 NVARCHAR2(1), c94 NVARCHAR2(1), c95 NVARCHAR2(1), c96 NVARCHAR2(1), c97 NVARCHAR2(1), c98 NVARCHAR2(1), c99 NVARCHAR2(1), c100 NVARCHAR2(1)
)
/

-- left outer join query (10 joins = 1000 columns)
SELECT
  *
FROM
  BIG_TABLE
  LEFT OUTER JOIN BIG_TABLE BT1 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT2 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT3 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT4 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT5 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT6 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT7 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT8 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT9 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT10 ON 1 = 1
  --LEFT OUTER JOIN BIG_TABLE BT11 ON 1 = 1

如果取消最后一行的注释,将会导致错误。

--

我已经针对以下版本进行了测试:

10.2.0.1.0 = ORA-01445: 无法从没有键保留表的联接 View 中选择 ROWID。

(请注意,您需要注释掉最后两个联接才能完成这项工作 - 除了联接的表之外,它似乎还包括第一个表的列)

11.1.0.6.0 = 好的

11.2.0.1.0 = ORA-03113: 通信 channel 上的文件结尾

有人可以确认我的结果(尤其是最后的结果)吗?如果可能的话,请提出任何解决方法?

谢谢, 本

最佳答案

在 Linux x86-64 上的 11.2.0.3 中工作正常。 因此,我建议您升级 11.2.0.1.0 -> 11.2.0.3.0。 它不仅会修复这个错误,还会修复数千个其他错误。 此外,如果您使用 Oracle 打开 SR,他们做的第一件事就是要求您升级到 11.2.0.3。

-标记

关于sql - Oracle ANSI 左外连接在 11gR2 中具有超过 1050 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242293/

相关文章:

1 对 n 关系中的 MySQL 数据透视表

mysql - Symfony2 查询在两个表上使用左连接

sql - 在 PostgreSQL 中计算速率

MySql 准备语句 - 是否可以参数化列名或函数名?

c# - 首先在 EF 4.1 代码中以 "schema.tablename"格式映射 POCO,使用 dotconnect for Oracle

oracle - 找出表空间上的可用空间

sql - 使用 oracle db 中的查询获取表名称及其行数

SQL 连接条件 A 或 B,但不能同时是 A 和 B

sql - 如何在 SQL 中将字符串 dd.mm.yyyy 转换为日期

sql - postgresql 的更新类型