助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26941
問題を開く
下図はOS(Linux)上にあるテキストファイル「ext1.csv」です。


このテキストファイルをデータソースとしてOracle Databaseに外部表EXT1を作成します。
次のSQL文のうち、デフォルト値と同じであるため省略できる句はどれですか(3つ選択して下さい)。

CREATE TABLE ext1
( id NUMBER(4),
 text VARCHAR2(10))
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
 DEFAULT DIRECTORY ext_data
 ACCESS PARAMETERS (
  RECORDS DELIMITED BY NEWLINE
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  ( id,
   text)
 )
 LOCATION ('ext1.csv')
)
REJECT LIMIT 0;

正解

TYPE

ACCESS PARAMETERS

REJECT LIMIT

解説

選択肢を1つずつ確認します。

・ORGANIZATION EXTERNAL
外部表を作成するための句なので省略できません。

・TYPE
外部表には主に2つの型があり、次のアクセスドライバ(外部データを解析するAPI)によってサポートされます。
・ORACLE_LOADER:テキスト形式の外部ファイルのデータをロードする(読み込む)。デフォルト値
・ORACLE_DATAPUMP:既存の表のデータをバイナリ形式のダンプファイルにアンロード(書き込む)、ダンプファイルのデータをデータベースにロードする(読み込む)

設問のデータソースはテキストファイルなのでORACLE_LOADERを使用しますが、ORACLE_LOADERはデフォルト値なので省略できます。

・DEFAULT DIRECTORY
デフォルトで使用するディレクトリを、ディレクトリのパスではなくディレクトリオブジェクトとして指定します。LOCATION句のデータファイルやACCESS PARAMETERS句のログファイルなどのディレクトリオブジェクトを省略した場合に使用されます。DEFAULT DIRECTORYのデフォルト値は無いので、本設問では省略できません。

・ACCESS PARAMETERS
データソースのレコードやフィールド形式などの情報を指定します。
- RECORDSパラメータ
DELIMITED BY:レコードの区切り文字の指定。デフォルト値は改行を示す「NEWLINE」

- FIELDSパラメータ
TERMINATED BY:フィールドの区切り文字の指定。デフォルト値は「,」
OPTIONALLY ENCLOSED BY:囲み文字の指定。デフォルト値は「"」
(列名 データ型):データソースの列名とデータ型の指定。省略した場合、区切り文字付きの列はCHAR(255)となる

設問のACCESS PARAMETERS句のRECORDSパラメータとFIELDSパラメータは、デフォルト値を指定しているので省略できます。

・LOCATION
外部のデータファイルを指定します。デフォルト値は無いので省略できません。

・REJECT LIMIT
外部データの問い合わせで許容される変換エラーの数を指定します。デフォルト値は0で設問のSQL文と同じなので省略できます。

以上より、
・TYPE
・ACCESS PARAMETERS
・REJECT LIMIT
が正解です。

以下はこれらの句を省略したSQL文の実行例です。

SQLを表示
CREATE TABLE ext1
( id NUMBER(4),
 text VARCHAR2(10))
ORGANIZATION EXTERNAL
( DEFAULT DIRECTORY ext_data
 LOCATION ('ext1.csv')
);

DESC ext1;

SELECT * FROM ext1;

参考

【外部表】
外部表は、データベース外部のファイルに格納されたデータにアクセスするための仕組みです。データベースには外部表の情報を記述するメタデータのみ格納されます。
類似機能のSQL*Loaderは外部ファイルのデータをデータベースの実表にロードするツールですが、外部表は作成した時点で外部のデータを問い合わせることができます。
外部表のデータはソートや結合を行えます。外部表に索引を作成したり、DML文での更新はできません。

外部表の作成には「CREATE TABLE ~ ORGANIZATION EXTERNAL」文を使用します。
外部表には主に2つの型があり、次のアクセスドライバ(外部データを解析するAPI)によってサポートされます。
・ORACLE_LOADER:テキスト形式の外部ファイルのデータをロードする(読み込む)。デフォルト値
・ORACLE_DATAPUMP:既存の表のデータをバイナリ形式のダンプファイルにアンロード(書き込む)、ダンプファイルのデータをデータベースにロードする(読み込む)

■ORACLE_LOADERの使用
以下はアクセスドライバにORACLE_LOADERを使用してテキストデータをロードする外部表の作成方法です。

 CREATE TABLE 外部表名
 (
  列名 データ型
  [,列名 データ型 …]
 )
 ORGANIZATION EXTERNAL
 ( TYPE ORACLE_LOADER
  DEFAULT DIRECTORY デフォルトのディレクトリ
  ACCESS PARAMETERS (
    アクセスドライバ固有の構文
  )
  LOCATION ([ディレクトリ:]'データファイル')
 )
 REJECT LIMIT エラー数|UNLIMITED;

各句の意味は次のとおりです。

・ORGANIZATION EXTERNAL
外部表を作成します。

・TYPE ORACLE_LOADER
外部表の型にORACLE_LOADERを指定します。

・DEFAULT DIRECTORY
デフォルトで使用するディレクトリを、ディレクトリのパスではなくディレクトリオブジェクトとして指定します。
ディレクトリオブジェクトを作成するにはCREATE ANY DIRECTORY権限が、利用するにはオブジェクトへの読み取り/書き込み権限が必要です。
ディレクトリオブジェクトは事前に次のように作成しておきます。

 CREATE [OR REPLACE] DIRECTORY ディレクトリオブジェクト名
  AS 'ディレクトリのパス';

例)SYSTEMユーザーとして、パス「/usr/oracle/data」をディレクトリオブジェクトEXT_DATAとして作成し、オブジェクト権限をpingtユーザーに付与する

SQLを表示
CREATE DIRECTORY ext_data
AS '/usr/oracle/data';

GRANT READ, WRITE ON DIRECTORY ext_data TO pingt;


・ACCESS PARAMETERS
データソースのレコードやフィールド形式などの情報を指定します。
- RECORDSパラメータ
DELIMITED BY:レコードの区切り文字の指定。デフォルト値は改行を示す「NEWLINE」

- FIELDSパラメータ
TERMINATED BY:フィールドの区切り文字の指定。デフォルト値は「,」
OPTIONALLY ENCLOSED BY:囲み文字の指定。デフォルト値は「"」
(列名 データ型):データソースの列名とデータ型の指定。省略した場合、区切り文字付きの列はCHAR(255)となる

・LOCATION
外部のデータファイルを指定します。「ディレクトリ:」を省略した場合はデフォルトのディレクトリであるDEFAULT DIRECTORYが使用されます。

・REJECT LIMIT
外部データの問い合わせで許容される変換エラーの数を指定します。これを超えるとOracle Databaseエラーが戻されます。デフォルト値は0です。

以下はORACLE_LOADERを使用してOS(Linux)上のテキストデータファイル「ext1.csv」をロードする外部表の例です。

例)テキストデータファイル「ext1.csv」


外部表EXT1を作成直後に外部ファイルのデータを問合せできます。

SQLを表示
CREATE TABLE ext1
( id NUMBER(4),
text VARCHAR2(10))
ORGANIZATION EXTERNAL
( TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_data
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
( id,
text)
)
LOCATION ('ext1.csv')
);

SELECT * FROM ext1;


■ORACLE_DATAPUMPの使用
以下はアクセスドライバにORACLE_DATAPUMPを使用する方法です。

[アンロード]
AS SELECT句で既存の表のデータをダンプファイルにアンロードします(書き込む)。
作成されたダンプファイルはバイナリ形式でORACLE_DATAPUMPのみが読み取りできます。ダンプファイルは他のデータベースの外部表でも使用できます。

 CREATE TABLE 外部表名
 ORGANIZATION EXTERNAL
 ( TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY デフォルトのディレクトリ
  LOCATION ([ディレクトリ:]'データファイル')
 )
 AS SELECT 列名[, 列名 ...] FROM 表名 [WHERE 条件]);

※各句の意味は「■ORACLE_LOADERの使用」をご参照ください。

例)外部表EXT_STUDENTSを作成し、STUDENTS表のデータをダンプファイル「ext_students.dmp」にアンロードする

SQLを表示
CREATE TABLE ext_students
ORGANIZATION EXTERNAL
( TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY ext_data
LOCATION ('ext_students.dmp')
)
AS SELECT * FROM students;

DESC ext_students;

SELECT * FROM ext_students;


OS上には指定した名前のダンプファイルが作成されます。


[ロード]
AS SELECT句で作成されたダンプファイルのデータをデータベースにロードします(読み込む)。

 CREATE TABLE 外部表名
 (
  列名 データ型
  [,列名 データ型 …]
 )
 ORGANIZATION EXTERNAL
 ( TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY デフォルトのディレクトリ
  LOCATION ([ディレクトリ:]'データファイル')
 );

例)ダンプファイル「ext_students.dmp」のデータをCOPY_STUDENTS表にロードする

SQLを表示
CREATE TABLE copy_students
( student_id NUMBER(2),
  name VARCHAR2(30))
ORGANIZATION EXTERNAL
( TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY ext_data
  LOCATION ('ext_students.dmp')
);

SELECT * FROM copy_students;
上に戻る

解説の誤り

公開日 2024/05/10
  • FIELDSパラメータ
    TERMINATED BY:フィールドの区切り文字の指定。デフォルト値は「'」
    とありますが、
  • FIELDSパラメータ
    TERMINATED BY:フィールドの区切り文字の指定。デフォルト値は「,」
    の間違いではないでしょうか?
スタッフからの返信

s staff_ishii

2024/05/13 09:36

tsukasa39 さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?