1

我们知道Oracle 常规表支持所有DML语句,但外部表不支持所有 DML 语句?我在下面试过:

SQL> INSERT INTO  xtern_empl_rpt VALUES ('70','Rakshit','Nantu','4587966214','na
tu.rakshit@ge.com','55');
INSERT INTO  xtern_empl_rpt VALUES ('70','Rakshit','Nantu','4587966214','natu.ra
kshit@ge.com','55')
             *
ERROR at line 1:
ORA-30657: operation not supported on external organized table


SQL> update xtern_empl_rpt set FIRST_NAME='Arup' where SSN='896743856';
update xtern_empl_rpt set FIRST_NAME='Arup' where SSN='896743856'
       *
ERROR at line 1:
ORA-30657: operation not supported on external organized table


SQL>

所以看起来外部表不支持这个。但我的问题是——这种设计背后的逻辑原因是什么?

4

3 回答 3

3

Oracle 中没有用于锁定外部表中的行的机制,也没有我们通过常规堆表获得的并发控制。所以不允许更新。

使用 Oracle Loader 驱动程序创建的外部表是只读的;Datapump 驱动程序允许我们写入外部表文件,但只能在 CTAS 模式下。

问题是永恒表基本上是操作系统文件上的窗口,没有内部表提供的抽象层和控制。基本上,数据库无法锁定 OS 文件中的记录,因为“记录”的概念是数据库,而不是 OS 文件。

于 2013-01-27T21:50:21.897 回答
1

外部表只为一件事而设计:数据加载和卸载。它们根本不适合与普通 DML 一起使用,它们也不是真正用于 normal selects - 这很有效,但是如果您需要在外部表上进行大量选择,那么您“做错了” :将数据加载到适当的表中,计算统计数据并根据需要添加索引。

让外部表表现得像普通表一样需要为它们实现所有事务机制,这非常复杂,而且不值得,因为这不是它们的目的。

如果您需要普通表并希望将它们从一个 Oracle 数据库移植到另一个数据库,那么您也应该评估是否使用可传输表空间

于 2013-01-27T17:16:29.537 回答
0

外部表的限制是它们只读的一个明显结果;它们是参与 SQL 查询的适配器,可以是任意的记录组织文件(ORACLE_LOADER 类型)或另一个数据库中表的导出副本(ORACLE_DATAPUMP 类型)。

如前所述,外部表只适用于全表扫描查询;如果需要在繁重的查询中使用索引或修改从文件中导入的外部数据集,可以使用 SQL Loader 工具填充常规表。

于 2013-07-05T16:02:25.227 回答