Oracleでは、内部データ型と外部データ型という2種類のデータ型が認識されます。内部データ型は、Oracleでデータベース列にデータを格納する方法を指定します。Oracleでは、データベース擬似列を表す内部データ型も使用されます。外部データ型は、データがホスト変数にどのように格納されるかを指定します。
プリコンパイル時に、宣言部の各ホスト変数は、外部データ型コードに関連付けられます。SQL文で使用するすべてのホスト変数のデータ型コードは、実行時にOracleに渡されます。Oracleは、コードを使用して内部データ型と外部データ型の間で変換します。
表3-1は、Oracleでデータベースの列および擬似列に使用される内部データ型の一覧です。
表3-1 列および擬似列のデータ型
名前 | コード | 説明 |
---|---|---|
|
96 |
固定長文字列(255バイト以下) |
|
12 |
7バイト、固定長日付/時刻値 |
|
8 |
可変長文字列(2147483647バイト以下) |
|
24 |
可変長バイナリ・データ(2147483647バイト以下) |
|
105 |
可変長バイナリ・ラベル(5バイト以下) |
|
2 |
固定数または浮動小数点数 |
|
23 |
可変長バイナリ・データ(255バイト以下) |
|
11 |
固定長バイナリ値 |
|
1 |
可変長文字列(2000バイト以下) |
これらの内部データ型は、ホスト言語のデータ型とは大きく異なる場合があります。たとえば、NUMBER
データ型は、移植性、精度(四捨五入のエラーなし)および正しい照合のために設計されました。これに相当するデータ型を持つホスト言語はありません。
次に内部データ型について簡単に説明します。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
CHAR
データ型は、固定長の文字データの格納に使用します。データが内部でどのように表されるかは、データベースのキャラクタ・セットによって決まります。CHAR
データ型には、255バイトまでの最大幅を指定できるオプションのパラメータがあります。構文は次のとおりです。
CHAR[(maximum_width)]
最大幅の指定には、定数または変数は使用できません。整数リテラルを使用する必要があります。最大幅を指定しない場合、デフォルトで1になります。CHAR
(n)列の最大幅は、文字単位ではなくバイト単位で指定することを思い出してください。そのため、CHAR
(n)列にマルチバイト(2バイト)文字が格納される場合、その最大幅はn/2文字未満になります。
MLSLABEL
データ型は、可変長バイナリ・オペレーティング・システム・ラベルの格納に使用します。Oracleでは、データのアクセス制御にラベルを使用します。詳細は、『Oracle Database管理者ガイド』を参照してください。
MLSLABEL
データ型を使用すれば、データベース列を定義できます。データ型がMLSLABEL
の列には、任意の有効なオペレーティング・システム・ラベルを挿入できます。ラベルがテキスト形式の場合、Oracleではそのラベルをバイナリ値に自動的に変換します。テキスト文字列の長さは、最大255バイトです。ただし、MLSLABEL
値の内部での長さは、2バイトから5バイトの間です。
MLSLABEL
列から値を選択し、文字変数に代入することもできます。Oracleでは、内部バイナリ値はVARCHAR2
値から自動的に変換されます。
NUMBER
データ型は、固定数または浮動小数点数の格納に使用し、事実上サイズに制限はありません。精度(合計桁数)と位取り(四捨五入が発生する位を決定)を指定できます。
NUMBER
値の最大精度は38です。大きさの範囲は1.0E-129から9.99E125です。位取りの範囲は-84から127です。たとえば、位取りが-3とは、数が1000単位で近似されることを意味します(3456は3000になります)。位取りが2とは、値が1/100単位で近似されることを意味します(3.456は3.46になります)。
精度と位取りを指定すると、Oracleはデータを格納する前に追加の整合性チェックをします。値が精度を超えると、Oracleはエラー・メッセージを発行します。値が位取りを上回ると、Oracleは値を丸めます。
RAW
データ型は、バイナリ・データまたはバイト文字列の格納に使用します(グラフィックス文字のシーケンスなど)。RAW
データは、Oracleでは解釈されません。
RAW
データ型には、255バイトまでの最大幅を指定できる必須パラメータを指定します。構文は次のとおりです。
RAW(maximum_width)
最大幅の指定には、定数または変数は使用できません。整数リテラルを使用する必要があります。
RAW
データはCHAR
データと似ていますが、OracleではRAW
データの意味は解釈されず、あるシステムから別のシステムにRAW
データを送信しても、キャラクタ・セットの変換(たとえば、7ビットASCIIからEBCDIC Code Page 500への変換)は行われない点が異なります。
内部的には、Oracleデータベース内のすべての表にはROWID
という擬似列が1つあり、ここには行IDというバイナリ値が格納されます。ROWID
は行を一意に識別し、特定の行にアクセスする最速の方法です。
VARCHAR2
データ型は、可変長文字列の格納に使用します。文字列が内部でどのように表されるかは、データベース・キャラクタ・セット(たとえば、7ビットASCIIまたはEBCDIC Code Page 500など)によって異なります。
VARCHAR2
データベース列の最大幅は2000バイトです。VARCHAR2
列を定義するには、次の構文を使用します。
VARCHAR2(maximum_width)
maximum_widthは、1から2000の範囲の整数リテラルです。
VARCHAR2
(n)列の最大幅は、文字単位ではなくバイト単位で指定します。そのため、VARCHAR2
(n)列にマルチバイト(2バイト)文字が格納される場合、その最大幅はn/2文字未満になります。
SQLでは、表3-2の擬似列を認識し、擬似列からは特定のデータ項目が戻されます。
表3-2 擬似列のデータ型
疑似列 | 内部データ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
疑似列は、実際に表に存在する列ではありません。ただし、疑似列は列のように扱われるため、疑似列の値を表からSELECTする必要があります。ダミーの表から擬似列の値を選択すると便利な場合があります。
さらに、SQLでは、表3-3のパラメータがなく、特定のデータ項目を戻すファンクションを認識します。
表3-3 パラメータのないファンクションのデータ型
ファンクション | 内部データ型 |
---|---|
|
|
|
|
|
|
SQLの擬似列およびファンクションは、SELECT
文、INSERT
文、UPDATE
文およびDELETE
文で参照できます。次の例では、SYSDATE
を使用して、従業員が雇用されてからの月数を計算しています。
EXEC SQL SELECT MONTHS_BETWEEN(SYSDATE, HIREDATE) INTO :months_of_service FROM EMP WHERE EMPNO = :emp_number;
これから、SQLの疑似列および関数を簡単に説明します。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
CURRVALは、指定された順序における現行の番号を戻します。CURRVAL
を参照する前に、NEXTVAL
を使用して順序番号を生成する必要があります。
LEVELは、ツリー構造におけるノードのレベル番号を戻します。ルートはレベル1、ルートの子はレベル2、孫はレベル3になります。
LEVEL
をSELECT
CONNECT
BY
文で使用して、表の一部または全部の行をツリー構造に組み込むことができます。ORDER
BY
句またはGROUP
BY
句でLEVEL
を使用すると、ツリーの各レベルでデータが分離されます。
問合せでツリーが検索される方向(ルートから下へ、またはブランチから上へ)は、PRIOR演算子で指定します。ツリーのルートを識別する条件は、START
WITH
句で指定します。
NEXTVALは、指定された順序における次の番号を戻します。順序を作成した後、それを使用してトランザクション用に一意の順序番号を作成できます。次の例では、partnoという順序で部品番号を割り当てます。
EXEC SQL INSERT INTO PARTS VALUES (partno.NEXTVAL, :description, :quantity, :price);
トランザクションで順序番号が生成された場合、そのトランザクションをコミットまたはロールバックすると順序番号が増やされます。NEXTVAL
を参照すると、現在の順序番号がCURRVAL
に格納されます。
ROWIDは、16進数で行アドレスを戻します。
ROWNUMは、表から行が選択された順序を示す番号を戻します。最初に選択された行のROWNUM
は1に、2番目の行のROWNUM
は2になります。SELECT
文にORDER
BY
句が含まれている場合は、選択された行にROWNUM
が割り当てられた後にソートが実行されます。
ROWNUM
を使用して、SELECT
文で戻される行数を制限できます。また、UPDATE
文でROWNUM
を使用して、表の各行に一意の値を割り当てることもできます。WHERE
句でROWNUM
を使用した場合は、取得する行数が制限されるのみで、SELECT
文の処理は停止されません。WHERE句でのROWNUM
の適切な使用方法は、次の方法のみです。
... WHERE ROWNUM < constant;
これは、ROWNUM
の値は行が取得されたときにのみ増加するためです。次のように指定した場合、4行目までは取り出されないため、この検索条件が満たされません。
... WHERE ROWNUM = 5;
UIDは、Oracleユーザーに割り当てられた一意のID番号を戻します。
USERは、Oracleカレント・ユーザーの名前を戻します。
SQLでは、Oracleでデータベースごとに作成される特殊な列ROWLABEL
も認識されます。他の列と同様に、ROWLABEL
は、SQL文で参照できます。ROWLABEL
は、行のオペレーティング・システムのラベルを戻します。
ROWLABEL
の一般的な使用方法、問合せ結果のフィルタ処理です。たとえば、次の文ではセキュリティ・レベルがunclassifiedより高い行のみが数えられます。
EXEC SQL SELECT COUNT(*) INTO :head_count FROM EMP WHERE ROWLABEL > 'UNCLASSIFIED';
ROWLABEL
列の詳細は、『Oracle Database管理者ガイド』を参照してください。
表3-4のように、外部データ型にはすべての内部データ型と、サポートされている他のホスト言語で使用するいくつかのデータ型が含まれています。たとえば、STRING
外部データ型は、C言語ではNULLで終了する文字列を指し、DECIMAL
データ型は、COBOLパック10進数を指します。データ型の名前はデータ型の同値化で使用し、データ型のコードは動的SQLの方法4で使用します。
表3-4 外部データ型
名前 | コード | 説明 |
---|---|---|
|
1 96 |
可変長文字列(65535バイト以下)、固定長文字列(65535バイト以下)(注意1を参照) |
|
96 |
<= 65535バイト、固定長文字列 |
|
97 |
NULLで終了する固定長文字列(65535バイト以下)(注意2を参照) |
|
12 |
7バイト、固定長日付/時刻値 |
|
7 |
COBOLパック10進数 |
|
91 |
COBOL数値文字列 |
|
4 |
4バイトまたは8バイトの浮動小数点数 |
|
3 |
符号付き整数(2バイトまたは4バイト) |
|
8 |
固定長文字列(2147483647バイト以下) |
|
24 |
固定長バイナリ・データ(217483647バイト以下)(注意3を参照) |
|
94 |
可変長文字列(217483643バイト以下)(注意3を参照) |
|
95 |
<= 217483643バイト、可変長バイナリ・データ |
|
106 |
可変長バイナリ・データ(2バイトから5バイト) |
|
2 |
整数または浮動小数点数 |
|
23 |
固定長バイナリ・データ(65535バイト以下)(注意2を参照) |
|
11 |
固定長バイナリ値(通常13バイト) |
|
5 |
NULLで終了する可変長文字列(65535バイト以下)(注意2を参照) |
|
68 |
2バイトまたは4バイトの符号なし整数 |
|
9 |
可変長文字列(65533バイト以下)(注意3を参照) |
|
1 |
可変長文字列(65535バイト以下)(注意2を参照) |
|
6 |
可変長2進数 |
|
15 |
可変長バイナリ・データ(65533バイト以下)(注意3を参照) |
注意:
CHAR
は、MODE={ORACLE|ANSI13|ANSI14}
の場合はデータ型1、MODE=ANSI
の場合はデータ型96です。
一部のプラットフォームでは、最大サイズが32767 (32K)です。
EXEC SQL VAR
文にはnバイト長のフィールドを含めないでください。
MODE=ANSIの場合、OracleではCHARデータ型はすべての文字ホスト変数に割り当てられます。CHARデータ型は、固定長文字列の格納に使用します。ほとんどのプラットフォームでは、CHAR値の最大長は65535バイト(64KB)です。DBMSオプションとMODEオプションの関係の詳細は、表6-4を参照してください。
入力時。Oracleでは、入力ホスト変数に指定されたバイト数を読み取り、後続の空白を切り捨てずに、ターゲット・データベース列に入力値を格納します。
入力値がデータベース列の定義より長い場合は、エラーが発生します。入力値がすべて空白の場合は、空白が文字値と同様に扱われます。
出力時。Oracleからは出力ホスト変数に指定したバイト数が戻され、必要に応じて空白が埋め込まれて、出力値がターゲット・ホスト変数に割り当てられます。NULLが戻される場合、ホスト変数は空白で埋められます。
出力値がホスト変数の宣言長より長い場合、Oracleはホスト変数に割り当てる前に出力値を切り捨てます。インディケータ変数が使用可能な場合、インディケータ変数は出力値の元の長さに設定されます。
DATE
データ型は、日付および時刻を7バイトの固定長フィールドに格納するために使用します。表3-5に示すように、世紀、年、月、日、時(24時間形式)、分および秒は、左から右にこの順序で格納されます。
表3-5 DATEデータ型の例
バイト | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
意味 |
世紀 |
年 |
月 |
日 |
時 |
分 |
秒 |
例 1994年10月17日午後1時23分12秒 |
119 |
194 |
10 |
17 |
14 |
24 |
13 |
世紀と年を表すバイトは、100を加算した表記です。時間、分および秒は、1を加算した表記です。B.C.E.(西暦紀元前)の日付は99以下です。エポックは、紀元前4712年1月1日です。この日付の場合、世紀のバイトは53で、年のバイトは88です。時間のバイト範囲は1から24です。分と秒の範囲は、1から60です。時刻のデフォルトは、午前零時(1, 1, 1)です。
INTEGER
データ型は、小数部分のない数値の格納に使用します。整数は、2バイトまたは4バイトの符号付き2進数です。1語内のバイトの順序は、システムによって異なります。入力および出力ホスト変数に長さを指定する必要があります。出力時には、列値が浮動小数点数であれば、小数部が切り捨てられます。
MLSLABEL
データ型は、可変長のバイナリ・オペレーティング・システム・ラベルの格納に使用します。Oracleでは、データのアクセス制御にラベルを使用します。MLSLABEL
データ型を使用して列を定義できます。データ型がMLSLABEL
の列には、任意の有効なオペレーティング・システム・ラベルを挿入できます。
入力時。Oracleでは、入力値は有効なオペレーティング・システム・ラベルであるバイナリ・ラベルに変換します。無効のラベルの場合は、エラー・メッセージが出ます。ラベルが有効ならば、ターゲット・データベース列に格納されます。
出力時。Oracleでは、バイナリ・ラベルを文字列に変換し、文字列はCHAR
、CHARZ
、STRING
、VARCHAR
またはVARCHAR2
のいずれかのデータ型です。
NUMBER
データ型は、固定または浮動小数点のOracle数値を格納するために使用します。精度および位取りを指定できます。NUMBER
値の最大精度は38です。大きさの範囲は1.0E-129から9.99E125です。位取りの範囲は-84から127です。
NUMBER
値は、可変長形式(1バイトの指数部に最大20バイトの仮数部が続く)で格納されます。指数バイトの上位1ビットは符号ビットであり、正数の場合に設定します。下位7ビットは指数を表し、100の位を底とし、オフセットは65です。
各仮数バイトは基数100で範囲1から100の数字です。正数の場合は、それに1を加算した数字となります。負数の場合、101からそれが引かれ、20バイトの仮数部があるのでないかぎり、102を含んでいるバイトがデータ・バイトに追加されます。各仮数バイトは、2つの10進数を表すことができます。仮数は正規化され、先行する0(ゼロ)は格納されません。仮数部には最大20のデータ・バイトを使用できますが、正確さが保証されているのは19バイトのみです。19個のデータ・バイトは、それぞれ基数100の数字を表し、38桁の最大精度を提供します。
出力時、ホスト変数にはOracleで内部的に表されたとおりの数値が含まれます。考えられる最大の数値を含めるには、出力ホスト変数は21バイトの長さが必要です。数値を表すために使用されるバイトのみが戻されます。Oracleでは出力値の空白を埋め込んだり、NULLで終了させたりしません。戻り値の長さを知る必要がある場合は、かわりにVARNUM
データ型を使用してください。通常、このデータ型を使用する理由はほとんどありません。
RAW
データ型は、固定長のバイナリ・データまたはバイト文字列の格納に使用します。ほとんどのプラットフォームでは、RAW
値の最大長は65535バイトです。RAW
データはCHAR
データと似ていますが、OracleではRAW
データの意味は解釈されず、RAWデータをあるシステムから別のシステムに送信しても、キャラクタ・セットは変換されません。
ROWID
データ型は、バイナリ行IDを固定長(通常は13バイト)に格納するために使用します。フィールド・サイズは、ポート固有です。そのため、使用しているシステム固有のOracleマニュアルをチェックしてください。VARCHAR2
ホスト変数を使用すると、読取り可能な形式で行IDを格納できます。行IDを選択またはフェッチしてVARCHAR2
ホスト変数に入れると、Oracleではそのバイナリ値を18バイトの文字列に変換し、次の書式で戻します。
BBBBBBBB.RRRR.FFFF
ここで、BBBBBBBBはデータベース・ファイルのブロック、RRRRはブロック内の行(最初の行は0)、FFFFはデータベース・ファイルを示します。これらの値は16進数です。たとえば、次の行IDがあるとします。
0000000E.000A.0007
これは、7番目のデータベース・ファイルの15番目のブロックの11行目を示します。
通常、行IDをVARCHAR2
ホスト変数にフェッチし、ホスト変数をUPDATE
文またはDELETE
文のWHERE
句のROWID
擬似列と比較します。そのようにして、カーソルによってフェッチされた最終行を識別できます。
注意:
完全な移植性が必要な場合、あるいはアプリケーションでTransparent Gatewayを使用してOracle以外のデータベースと通信する場合は、VARCHAR2
ホスト変数を宣言するときに、最大長を(18ではなく)256に指定してください。また、アプリケーションがOracle Open Gatewayを介してOracle以外のデータ・ソースと通信する場合も、最大長として256バイトを指定します。ホスト変数の内容については推測できませんが、ホスト変数はSQL文中で正常に機能します。
STRING
データ型はVARCHAR2
データ型と似ていますが、STRING
値は常にNULL文字で終了する点が異なります。
入力時。Oracleは指定された長さを使用して、ヌル終端文字のスキャンを制限します。ヌル終端文字が見つからなければ、エラーが生成されます。長さを指定しない場合、Oracleは最大長とみなします。大部分のプラットフォームでは65535です。
STRING
値の最小長は2バイトです。最初の文字がNULL終了文字で、指定した長さが2の場合、列がNOT
NULL
と定義されていなければ、OracleではNULLを挿入します。空白のみの値またはNULLで終了する値はそのまま格納されます。
出力時。Oracleは戻された最後の文字に1バイトのヌル文字を追加します。文字列長が指定された長さを超える場合は、Oracleは出力値を切り捨て、1バイトのヌル文字を追加します。
UNSIGNED
データ型は、符号なし整数の格納に使用します。符号なし整数は、2バイトまたは4バイトの2進数です。1語内のバイトの順序は、システムによって異なります。入力および出力ホスト変数に長さを指定する必要があります。出力時には、列値が浮動小数点数であれば、小数部が切り捨てられます。Pro*COBOLまたはPro*FORTRANでは、この外部データ型は必要ありません。
VARCHAR
データ型は、可変長文字列の格納に使用します。VARCHAR
変数では、2バイト長のフィールドの後に65533バイト以下の文字列フィールドが続きます。ただし、VARCHAR
配列要素では、文字列フィールドの最大長は65530バイトです。VARCHAR
変数の長さを指定するときには、長さフィールド用の2バイトが含まれていることを確認してください。これより長い文字列には、LONG
VARCHAR
データ型を使用してください。EXEC
SQL
VAR
文では、2バイト長のフィールドを含めないでください。
MODE=ORACLE
の場合、OracleではVARCHAR2
データ型をすべての文字ホスト変数に割り当てます。VARCHAR2
データ型は、可変長文字列の格納に使用します。ほとんどのプラットフォームでは、VARCHAR2
値の最大長は65535バイトです。
VARCHAR2
(n)値の最大長は、文字単位ではなくバイト単位で指定します。したがって、VARCHAR2
(n)変数にマルチバイト・キャラクタを格納する場合、最大長はn文字未満になります。
入力時。Oracleは入力ホスト変数に指定されたバイト数を読み込み、後続の空白文字を取り除き、入力値をターゲット・データベース列に格納します。ここでは注意が必要です。未初期化ホスト変数には、一連のヌル文字が含まれている場合があります。したがって、常に文字入力ホスト変数の宣言長まで空白文字で埋めてください。(COBOL PIC X(n)およびFORTRAN CHARACTER*nの各変数では、これは自動的に行われます。)
入力値がデータベース列の定義より長い場合は、エラーが発生します。入力値がすべて空白の場合は、空白がNULLと同様に扱われます。
文字値が有効な数を表す場合、NUMBER
列値に変換できます。文字値が有効な数値を表していない場合は、エラーが発生します。
出力時。Oracleからは出力ホスト変数に指定したバイト数が戻され、必要に応じて空白が埋め込まれて、出力値がターゲット・ホスト変数に割り当てられます。NULLが戻される場合、ホスト変数は空白で埋められます。
出力値がホスト変数の宣言長より長い場合、Oracleはホスト変数に割り当てる前に出力値を切り捨てます。インディケータ変数が使用可能な場合、インディケータ変数は出力値の元の長さに設定されます。
NUMBER
列値は文字値に変換できます。文字ホスト変数の長さによって精度が決定します。ホスト変数の長さがその数に対して短すぎる場合は、科学表記法が使用されます。たとえば、列値abcdefg89を長さ6のホスト変数に選択すると、ホスト変数に値1.2E08が戻されます。
VARNUM
データ型はNUMBER
データ型に似ていますが、VARNUM
変数の1バイト目に値の長さが格納される点が異なります。入力時には、ホスト変数の1バイト目を値の長さに設定する必要があります。出力時には、ホスト変数に長さとそれに続いてOracleで内部的に表現された数が含まれます。この数が最大になっても対応できるように、ホスト変数の長さは22バイトにする必要があります。列値をVARNUM
ホスト変数に選択した後、1バイト目をチェックすれば値の長さがわかります。