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

被折叠的 条评论
为什么被折叠?



