1

これは、すべてのDMLステートメントがOracle Regular Tableでサポートされているが、External Tableではサポートされていないことがわかっています。私は以下を試しました:

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 ファイル内のレコードをロックする方法はありません。これは、「レコード」の概念が OS ファイルではなくデータベースであるためです。

于 2013-01-27T21:50:21.897 に答える
1

外部テーブルは、データのロードとアンロードという 1 つの目的だけのために設計されています。それらは単に通常の DML で使用することを意図したものではなく、通常selectの s を実際に使用することを意図したものでもありません-それは機能しますが、外部テーブルで多くの選択を行う必要がある場合は、「間違っています」 : データを適切なテーブルにロードし、統計を計算し、必要に応じてインデックスを追加します。

外部テーブルを通常のテーブルのように動作させるには、すべてのトランザクション機構を実装する必要がありますが、これは非常に複雑であり、それが目的ではないため価値がありません。

通常のテーブルが必要で、ある Oracle データベースから別の Oracle データベースに移植したい場合は、トランスポータブル テーブルスペースも使用して評価する必要があります。

于 2013-01-27T17:16:29.537 に答える
0

外部テーブルの制限は、それらが読み取り専用であることの明らかな結果です。これらは、任意のレコード編成ファイル (ORACLE_LOADER タイプ) または別のデータベースにエクスポートされたテーブルのコピー (ORACLE_DATAPUMP タイプ) のいずれかを SQL クエリに含めるためのアダプタです。

既に述べたように、外部テーブルは全テーブル スキャン クエリにのみ適しています。負荷の高いクエリでインデックスを使用する必要がある場合、またはファイルからインポートされた外部データ セットを変更する必要がある場合は、SQL ローダー ツールを使用して通常のテーブルにデータを入力できます。

于 2013-07-05T16:02:25.227 に答える