DDLの出題ポイント
データ定義言語といえば、CREATE、ALTER、DROPですね。 定義するオブジェクトには、表、ビュー、シノニム、順序があります。 12c SQLの試験対策的には、表と順序が重要オブジェクトです。
表の定義時に指定するものには、データ型と制約があります。 データ型は、LONGとINTERVALが最重要ポイント。 制約は、CREATE TABLE AS SELECTまたはALTERとの合わせ技で出題されることが多く、要注意です。
なんだか、盛りだくさんですね。1つずつポイントを押さえていきましょう。
データ型
では、問題を解きながら、基本のおさらいをしましょう。
問1
EMPLOYEES表の構造を確認してください。
名前 NULL? 型 ----------------- -------- ------------ EMPLOYEE_ID NOT NULL NUMBER(6) EMPLOYEE_NAME VARCHAR2(50) GENDER CHAR PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE SALARY NUMBER COMMISSION_PCT NUMBER(2,2) EMPLOYEE_IMAGE LONG DEPARTMENT_ID NUMBER(4)
この表の作成とデータ型について正しいものをすべて選択しなさい。
- a. HIRE_DATE列には、世紀、年、月、日、曜日、時、分、秒、小数秒を格納できる
- b. GENDER列は有効桁数を指定していないので、作成時エラーになる
- c. SALARY列は有効桁数を指定していないので、作成時エラーになる
- d. COMMISSION_PCT列に2桁の整数を入力するとエラーになる
- e. データ型がLONGの新しい列をこの表に追加することができる
- f. データ型がCLOBの新しい列をこの表に追加することができる
日付を扱うデータ型には、DATEとTIMESTAMPがあります。 小数秒を格納できるのはTIMESTAMP型であって、DATE型ではありません(選択肢aは不正解)。
文字を扱うCHAR型、VARCHAR2型と数値を扱うNUMBER型は、格納できるデータの有効桁数(最大桁数)を指定できます。VARCHAR2は桁数の指定を省略するとエラーになりますが、CHARとNUMBERにはデフォルト値が設定されるため(CHARは1文字、NUMBERは38桁)、エラーにはなりません(選択肢b、cは不正解)。
NUMBER型では、全体の桁数と小数点以下の桁数を指定できます。 例えば、NUMBER(5,2)は「全体の桁数が5桁そのうち小数点以下が2桁」という定義で、整数部に格納可能なのは3桁です。 ということは、NUMBER(2,2)は「全体の桁数2桁のうち2桁とも小数点以下」という定義ですから、整数2桁の値を入力(更新)すると次のとおりエラーになります(選択肢dは正解)。
SQL> SELECT commission_pct FROM employees
2 WHERE employee_id = 178;
COMMISSION_PCT
--------------
.15
SQL> UPDATE employees SET commission_pct = 98
2 WHERE employee_id = 178;
UPDATE employees SET commission_pct = 98
*
行1でエラーが発生しました。:
ORA-01438: この列に許容される指定精度より大きな値です
VARCHAR2で格納できるサイズよりも大きな文字列を格納できるデータ型として、LONGとCLOBがあります。 CLOBは、最大「(4GB-1)× DB_BLOCK_SIZE初期化パラメータ[1]の値」まで文字を格納できるラージオブジェクトの1つで、Oracle8から実装されました。それ以前にはLONG型しかありませんでした。 LONG型には次のような制限があり、CLOBではそれらの制限が緩和されているのはそうした経緯によるものです(選択肢eは不正解、fは正解)。
LONG型の制限
- 1つの表当たり1列しか定義できない
- 制約を指定できない
-
GROUP BY句およびORDER BY句で使用できない - 副問合せを使用して表を作成した場合、コピーされない
試験でLONGの出題が多いのは、「LONGを使用するような案件があるならば、CLOBが適切でないか検討してください」と注意を促しているのでしょうね。
注
[1]: Oracleが使用するメモリやプロセスまたはデータベース全体に関わる設定値。

