您的位置:首页 > 数据库 > Oracle

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

2006-06-29 20:15 676 查看
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还有:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: