3.19.1 CREATE TYPEの形式と規則
(2) 使用権限
- スキーマを所有するユーザ
-
自分が所有する抽象データ型を定義できます。
(3) 形式
CREATE TYPE 〔認可識別子.〕データ型識別子 〔サブタイプ句〕 〔デフォルトコンストラクタオプション〕 〔メンバリスト〕 サブタイプ句::=UNDER 〔認可識別子.〕データ型識別子 デフォルトコンストラクタオプション::= CONSTRUCTOR {PRIVATE|PROTECTED|PUBLIC} メンバリスト::=(メンバ〔,メンバ〕…) メンバ::={属性定義|ルーチン宣言} 属性定義::=〔隠蔽レベル〕 属性名 データ型 〔NO SPLIT〕 隠蔽レベル::={PRIVATE|PROTECTED|PUBLIC} ルーチン宣言::=〔隠蔽レベル〕 ルーチン本体 ルーチン本体::={関数本体|手続き本体}
(4) オペランド
(a) 〔認可識別子.〕データ型識別子
- 認可識別子
-
定義する抽象データ型の所有者の認可識別子を指定します。
- データ型識別子
-
定義する抽象データ型の名称を指定します。
(b) サブタイプ句::=UNDER 〔認可識別子.〕データ型識別子
サブタイプ句は,指定した抽象データ型を継承するサブタイプを定義する場合に指定します。スーパタイプとなる抽象データ型の認可識別子とデータ型識別子を指定してください。
サブタイプ句を指定すると,そのスーパタイプで定義されているすべての属性及びルーチンが,定義した抽象データ型に継承されます。
- 認可識別子.
-
スーパタイプの抽象データ型の所有者の認可識別子を指定します。
認可識別子を省略した場合,省略時に仮定される認可識別子に同一名称の抽象データ型がないときは,認可識別子'MASTER'に同一名称の抽象データ型があれば,その抽象データ型を指定したものとします。
- データ型識別子
-
スーパタイプの抽象データ型を指定します。
(c) デフォルトコンストラクタオプション::=CONSTRUCTOR {PRIVATE|PROTECTED|PUBLIC}
デフォルトコンストラクタオプションは,デフォルトコンストラクタ関数の隠蔽レベルを指定します。省略した場合,PRIVATEが仮定されます。
デフォルトコンストラクタ関数は,定義した抽象データ型の名称と同一の関数名を持つ関数が定義されることになります。デフォルトコンストラクタ関数には,引数がありません。この関数では,抽象データ型のそれぞれ各属性のナル値が設定された抽象データ型の値が戻されます。
(d) 属性定義::=〔隠蔽レベル〕 属性名 データ型 〔NO SPLIT〕
属性定義では,抽象データ型を構成する属性を指定します。
- 隠蔽レベル
-
隠蔽レベルは三つあります。この隠蔽レベルは,属性又は抽象データ型に対する操作を記述するルーチンに対して指定できます。省略した場合は,その定義部分より上の隠蔽レベルが仮定されます。また,最初の属性に隠蔽レベルを指定していない場合,PUBLICが仮定されます。
- PRIVATE
-
PRIVATEを指定した場合,隠蔽されることになります。指定された属性は,その抽象データ型の定義中でだけ利用できます。
- PROTECTED
-
PROTECTEDを指定した場合,部分的に隠蔽されることになります。指定された属性は,その抽象データ型の定義中と,その抽象データ型のすべてのサブタイプの定義内でだけ利用できます。
- PUBLIC
-
PUBLICを指定した場合,指定された属性は継承関係に関係なく利用できるようになります。
- 属性名
-
抽象データ型の属性の名称を指定します。
- データ型
-
抽象データ型の属性のデータ型を指定します。
指定するデータ型が抽象データ型で,認可識別子を省略した場合,省略時に仮定される認可識別子に同一名称の抽象データ型がないときは,認可識別子'MASTER'に同一名称の抽象データ型があれば,その抽象データ型を指定したものとします。
なお,次のデータ型は指定できません。
-
文字集合を指定したCHAR,VARCHAR
-
- NO SPLIT
-
可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)の実際のデータ長が256バイト以上の場合,1行を1ページに格納したいときに指定します。NO SPLITを指定すると,データベース容量を削減できる場合があります。これをノースプリットオプションといいます。
ノースプリットオプションについては,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
(e) ルーチン宣言::=〔隠蔽レベル〕 ルーチン本体
- ルーチン本体::={関数本体|手続き本体}
-
ルーチン宣言では,データへの操作を指定するルーチンを書きます。隠蔽レベルについては,属性定義と同じです。
ルーチン本体には,関数又は手続きを書きます。関数及び手続きについては,それぞれ「CREATE 〔PUBLIC〕FUNCTION(関数定義,パブリック関数定義)」及び「CREATE 〔PUBLIC〕PROCEDURE(手続き定義,パブリック手続き定義)」を参照してください。
(5) 共通規則
-
ルーチンで認可識別子を指定する場合,実行ユーザの認可識別子と同じものを指定します。
-
関数本体及び手続き本体中で指定するCALL文の手続き,及び関数呼出しの関数は,次のものでなければなりません。
-
このCREATE TYPE外で,既に定義されている関数及び手続き
-
このルーチン宣言より前のルーチン宣言で定義されている関数及び手続き
-
-
抽象データ型の属性名は,継承関係にあるすべての抽象データ型内でユニークでなければなりません。
-
継承するサブタイプの世代数は,最大30,000です。
-
CREATE TYPEで定義する抽象データ型は,次の式を満たす必要があります。各属性の長さ(データ長)を次の表に示します。
表3‒36 データ長一覧 分類
データ型
データ長
(単位:バイト)
INTEGER(4バイト2進形式の整数)
4
SMALLINT(2バイト2進形式の整数)
2
[LARGE] DECIMAL〔m,n〕※
(パック10進形式の固定小数点数)
↓m/2↓+1
FLOAT(8バイトの浮動小数点数)
8
SMALLFLT(4バイトの浮動小数点数)
4
CHARACTER〔n〕(nバイトの固定長文字列)
n
VARCHAR〔n〕(nバイトの可変長文字列)
35
NCHAR〔n〕(n文字の固定長各国文字列)
2n
NVARCHAR〔n〕(n文字の可変長各国文字列)
35
MCHAR〔n〕(nバイトの固定長混在文字列)
n
MVARCHAR〔n〕(nバイトの可変長混在文字列)
35
DATE(日付)
4
INTERVAL YEAR TO DAY(日間隔)
5
TIME(時刻)
3
INTERVAL HOUR TO SECOND(時間隔)
4
TIMESTAMP〔p〕(pけたの小数秒)(時刻印)
7+p/2
BLOB(nバイトのバイナリ列)
35
BINARY〔n〕(nバイトのバイナリデータ列)
35
CREATE TYPEで定義したユーザ定義型
35
-
ALTER PROCEDURE,又はALTER ROUTINEでSQLコンパイルオプションを指定する場合,再作成するルーチンの元のCREATE TYPEにSQLコンパイルオプションを反映してできるSQL文は,SQL文の最大長を超えないようにしてください。
-
実行中のSQLオブジェクトが無効になる場合,Java手続き中からCREATE TYPEは実行できません。
(6) 留意事項
-
CREATE TYPEは,OLTP下のX/Openに従ったUAPから指定できません。
-
型定義に伴うSQLオブジェクトの無効化について示します。
-
抽象データ型を定義する場合,その抽象データ型と同じ継承関係にある抽象データ型(最上位のデータ型の,すべてのサブタイプ)を使用する関数,手続き,及びトリガの有効なSQLオブジェクトがあれば,そのSQLオブジェクトは無効となります。
-
抽象データ型を定義する場合,定義する抽象データ型と,同じデータ型が認可識別子'MASTER'である場合,認可識別子'MASTER'のデータ型を使用する関数,手続き,及びトリガの有効なSQLオブジェクトのうち,定義する抽象データ型の認可識別子のSQLオブジェクトは無効になります。また,パブリック関数及びパブリック手続きの場合,定義する抽象データ型の認可識別子と,パブリック関数及びパブリック手続きを定義した認可識別子が同じならば,そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。
-
関数本体を指定して関数を定義する場合のSQLオブジェクトの無効化については,「CREATE 〔PUBLIC〕FUNCTION(関数定義,パブリック関数定義)」の留意事項を参照してください。
-
手続き本体を指定して手続きを定義する場合のSQLオブジェクトの無効化については,「CREATE 〔PUBLIC〕PROCEDURE(手続き定義,パブリック手続き定義)」の留意事項を参照してください。
-
-
関数,手続き,及びトリガの有効なSQLオブジェクトが無効となった場合,ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数,手続き,及びトリガの行は削除されます。
-
2に示した無効になる関数のうち,次のどちらかの条件を満たす関数をビュー定義で使用している場合,型定義がエラーになります。
-
引数のデータ型に抽象データ型を使用している
-
戻り値のデータ型に抽象データ型を使用している
-
-
無効となった関数,手続き,及びトリガのSQLオブジェクトを実行するためには,ALTER ROUTINE,ALTER PROCEDURE,又はALTER TRIGGERを実行して,関数,手続き,及びトリガのSQLオブジェクトを再作成しておく必要があります。
-
型定義に伴って無効となった関数を使用したビュー表がある場合,そのビュー表を操作するにはALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。
-
プラグイン開発者によって提供され,pdplgrgstコマンドによってHiRDBに登録される抽象データ型を継承した場合,その抽象データ型のサブタイプは定義できません。