Oracle无法通过同义词访问远端分区表的某个分区

本文介绍Oracle9i数据库在访问远端数据库表分区时遇到的ORA-14100错误,并通过建立同义词的方式进行访问,但发现分区语句并未生效。

Oracle9i中访问远端数据库表的分区会报错ORA-14100。如果在本地建立远端数据库表的同义词,然后通过同义词进行分区的访问会得到错误的结果。

数据库版本9204


看下面这个例子,首先在远端数据库建立一个分区表:

SQL> CONN TEST/TEST@TEST2已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;

已创建2541行。

SQL> COMMIT;

提交完成。

SQL> SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
22

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
31

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
2488

下面在本地数据库建立一个连接到远端数据库的数据库链。

SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';

数据库链接已创建。

SQL> SELECT COUNT(*) FROM T@TEST2;

COUNT(*)
----------
2541

SQL> SELECT COUNT(*) FROM T@TEST2 PARTITION (P1);
SELECT COUNT(*) FROM T@TEST2 PARTITION (P1)
*
1 行出现错误:
ORA-14100:
分区扩展表名不能指远程对象


SQL> CREATE SYNONYM S_T_TEST2 FOR T@TEST2;

同义词已创建。

SQL> SELECT COUNT(*) FROM S_T_TEST2;

COUNT(*)
----------
2541

SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1);

COUNT(*)
----------
2541

SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1234);

COUNT(*)
----------
2541

测试发现虽然通过建立远端对象同义词的方式可以使用PARTITION语句,但是PARTITION语句并没有起任何作用。而且在最后的查询中,指定了一个不存在的分区,但是并没有报错,说明Oracle忽略了PARTITION语句。

而建立本地对象的同义词则不存在这个问题:

SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;

已创建1549行。

SQL> COMMIT;

提交完成。

SQL> SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
22

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
31

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
1496

SQL> CREATE SYNONYM S_T FOR T;

同义词已创建。

SQL> SELECT COUNT(*) FROM S_T PARTITION (P1);

COUNT(*)
----------
22

说明Oracle还是不能通过数据库链进行PARTITION相关的操作,但是如果对同义词采用这种方式的查询,则Oracle没有进行相应的判断,而仅仅是忽略分区语句。

Oracle的同义词的问题相对比较多,类似的bug还有: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值