LastUpdate: 2019/06/05 23:45:37

戻る

データ型

 Oracle7によって操作されるリテラル値や列値はそれぞれデータ型を持っています。値の「データ型」は、値に対して固定されたある特性を持つ集合を対応付けます。これらの特性によって、Oracle7はあるデータ型の値を別のデータ型の値とは異なる取り扱いをします。たとえば、NUMBERデータ型の値を加算することはできますが、RAWデータ型の値を加算することはできません。

表やクラスタを作成するとき、その列のそれぞれについて内部データ型を指定しなければなりません。プロシージャやストアド・ファンクションを作成するとき、その引数の各データ型を指定しなければなりません。データ型は、各列が含むことのできる値の定義域、または各引数が持つことのできる値の定義域を規定します。たとえば、DATE列は、2月29日(うるう年を除く)、2、あるいは'SHOE'という値を受け入れることはできません。列に入れられる各値は列のデータ型を受け継ぎます。たとえば、DATE列に'01-JAN-92'を挿入すると、Oracle7はそれが有効な日付に解釈されることを確認したあとで、文字列'01-JAN-92'をDATE値として扱います。

表 2 - 1に、Oracle7の内部データ型をまとめます。これらのデータ型について以下に詳しく説明します。

Note: Oracleプリコンパイラは、埋込みSQLプログラムで他のデータ型を区別します。このようなデータ型を外部データ型と呼び、ホスト変数に対応付けられます。内部データ型を外部データ型と混同しないでください。Oracle7での内部データ型と外部データ型の変換を含めて、外部データ型に関する説明は、『Oracleプリコンパイラ・プログラマーズ・ガイド』を参照してください。

コード データ型 記述

コード データ型 記述
VARCHAR(size)  最大長がsizeバイトの可変長文字列。sizeの最大は2000、最小は1。VARCHAR2ではsizeを必ず指定しなければならない。
2 NUMBER(p,s) 精度p、位取りsを持つ数。精度pには1から38までの値を指定することができる。位取りsには-84から127までの値を指定することができる。
8 LONG  最大2ギガバイト(231-1バイト)の可変長の文字データ。
12 DATE 紀元前4712年1月1日から紀元4712年12月31日までの日付を指定することができる。
23 RAW(size)  長さがsizeバイトの2進データ。最大sizeは255バイト。RAW値ではsizeを必ず指定しなければならない。
24 LONG RAW  最大2ギガバイトの可変長の2進データ。
69  ROWID(下記の注意を参照) 表の中の行のアドレスを一意に表す16進列。ROWID疑似列によって戻される値のためのデータ型。
96  CHAR(size) 長さsizeバイトの固定長文字データ。最大sizeは255バイト。デフォルトと最小sizeは1。
106 MLSLABEL  バイナリ形式のオペレーティング・システム・ラベル。このデータ型はTrusted Oracle7で使用します。

表 2 - 1 . 内部データ型のまとめ

リストされているデータ型のコードはOracle7によって内部的に使用されます。DUMP関数を使用すると、列のデータ型コードが戻されます。

Note: 埋込みSQLコマンドDESCRIBEとOracleコール・インタフェース(OCI)のODESCRコールは、ROWIDデータ型に対してコード11を戻します。

文字データ型

文字データ型は、単語やテキストを操作するために使用され、データベースのキャラクタ・セットで文字(英数字)データを格納します。他のデータ型よりも制限が少なく、その結果わずかな特性を持つだけになっています。たとえば、文字データ型の列はすべての英数字の値を格納できますが、NUMBER列が数値以外を格納することはできません。

文字データは、7ビットASCIIやEBCDICコード・ページ500など、データベース作成時に指定されたキャラクタ・セットに対応しているバイト値で格納されます。Oracle7は、シングルバイトのキャラクタ・セットとマルチバイトのキャラクタ・セットの両方をサポートします。

以下のデータ型が文字データに対して使用されます。

・ CHAR
・ VARCHAR2

Oracle7の文字データ型は、Oracleバージョン6の文字データ型と異なります。これらの相違点と互換性の問題については、このマニュアルの付録C「オペレーティング・システム固有の情報」を参照してください。

CHARデータ型

CHARデータ型は固定長の文字列を指定します。CHAR列で表を作成する際には、列の長さ(単位はバイト)を指定することができます。Oracle7は、その列の中に格納される値がすべてこの長さを持つように調整し、列の長さよりも短い値が挿入されると、その値に空白を埋め込んで列の長さに合わせます。列に対して長すぎる値を挿入しようとすると、Oracle7はエラーを戻します。

CHAR列のデフォルトは1文字で、この許容最大値は255文字です。長さがゼロの文字列をCHAR列に挿入できますが、このCHAR列が比較されるときには、空白が1文字埋め込まれます。比較方法に関する説明は、2 - 29ページ「データ型の比較規則」を参照してください。

VARCHAR2データ型

VARCHAR2データ型は可変長の文字列を指定します。作成時にVARCHAR2列が持つことのできるデータの最大バイト数を指定することができます。列の最大長を超えないかぎり、Oracle7は列の各値を指定されたとおり正確に格納します。この最大値は1バイト以上でなければなりません。ただし、格納される文字列の実際の長さは0(ゼロ)でもかまいません。最大長を超える値を挿入しようとすると、Oracle7はエラーを戻します。

VARCHAR2列では最大長を指定しなければなりません。VARCHAR2データの最大長は2000バイトです。Oracle7は、非空白埋め比較を使用してVARCHAR2値を比較します。比較方法に関する説明は、
2 - 29ページ「データ型の比較規則」を参照してください。

VARCHARデータ型

現在、VARCHARデータ型はVARCHAR2データ型と同義です。VARCHARよりもVARCHAR2を使用することをお勧めします。 Oracle7の将来のバージョンでは、VARCHARデータ型が変更され、異なる比較方法で比較される別の可変長文字列の型になる可能性もあります。

NUMBERデータ型

NUMBERデータ型は、38桁の精度を持ち、1.0×10-130から9.9...9×10125(38個の9のあとに0が88個続く)までの範囲にある、正と負の固定小数点数と浮動小数点数とゼロを格納するために使用されます。1.0×10126以上の値を持つ算術式を指定した場合、Oracle7はエラーを戻します。

次の書式で固定小数点数を指定できます。

NUMBER(p,s)

ここで、それぞれの意味は次のようになります。

p 「精度(precision)」、すなわち全体の桁数です。Oracle7は38桁までの精度で数の移植性を保証します。
s 「位取り(scale)」、すなわち小数点の右側にある桁数です。位取りの有効範囲は-84から127までです。

次の書式で整数を指定できます。

NUMBER(p) 精度がpで位取りが0の固定小数点数です。(NUMBER(p,0)と等しい。)

次の書式で浮動小数点数を指定します。

NUMBER 精度が38の浮動小数点数です。なお、浮動小数点数では位取りを指定することはできません。

位取りと精度

入力に対する特別の整合性検査として、固定小数点数列の位取りと精度を指定してください。位取りと精度を指定しても、すべての値が固定長に強制されるわけではありません。値が精度の有効範囲を超えると、Oracle7はエラーを戻します。値が位取りの有効範囲を超えると、Oracle7はその値を丸めます。

次に、いろいろな精度と位取りを使用してOracle7がデータを格納する例を示します。

実際のデータ 指定 格納

実際のデータ 指定  格納
7456123.89 NUMBER  7456123.89
7456123.89 NUMBER(9) 7456124
7456123.89 NUMBER(9,2) 7456123.89
7456123.89 NUMBER(9,1) 7456123.9
7456123.8  NUMBER(6)  精度を超える
7456123.8 NUMBER(15,1) 7456123.8
7456123.89 NUMBER(7,-2) 7456100
7456123.89 NUMBER(7,2) 精度を超える

負の位取り

位取りが負の場合には、実際のデータは指定された数だけ小数点の左側の位が丸められます。たとえば、(10,-2)という指定は100の位に丸められます。

精度より大きな位取り

通常はありえないことですが、精度よりも大きな位取りを指定することもできます。この場合、精度は小数点の右側にある最大有効桁数を示します。すべてのNUMBERデータ型と同じように、値が精度を超えるとOracle7はエラー・メッセージを戻します。値が位取りを超えると、Oracle7は値を丸めます。たとえば、NUMBER(4,5)として定義された列は、小数点の後の最初の桁がゼロでなければならず、小数点以下5桁を超える値はすべて丸められます。以下に、精度より大きな位取りを指定した場合の例を示します。

実際のデータ  指定  格納
0.01234 NUMBER(4,5)  0.01234
0.00012 NUMBER(4,5)  0.00012
0.000127 NUMBER(4,5) 0.00013
0.0000012 NUMBER(2,7)  0.0000012
0.00000123 NUMBER(2,7)  0.0000012

浮動小数点数

Oracle7では浮動小数点数を指定することもできます。浮動小数点値は、最初の桁から最後の桁までの任意の位置に小数点を置くことも、小数点を省略することもできます。小数点以降に現れる桁数に制限はないため、浮動小数点数に対して位取りを指定することはできません。
2 - 21ページ「NUMBERデータ型」で説明しているように、適切なNUMBERデータ型の書式を使用して浮動小数点数を指定できます。また、Oracle7はANSIデータ型FLOATもサポートします。以下の構文書式のいずれかを使用してこのデータ型を指定します。

FLOAT 38桁の10進精度または126桁の2進精度で浮動小数点数を指定します。
FLOAT(b) 2進精度bで浮動小数点数を指定します。精度bは1から126までの範囲で指定します。

2進精度から10進精度に変換するにはbに0.30103を乗じてください。10進精度から2進精度に変換するには3.32193を10進精度に乗じてください。2進数精度の126桁は10進精度の38桁におよそ等しくなります。

LONGデータ型

LONG列は、2ギガバイト(231-1バイト)までの可変長の文字列を格納します。LONG列は多くの点でVARCHAR2列と同じ特性を持っています。長いテキスト列を格納するためにLONG列を使用することができます。Oracle7は、ビュー定義のテキストを格納するために、データ・ディクショナリにおいてLONG列を使用しています。また、LONG値の長さは、使用しているコンピュータで利用できるメモリーによって制限される可能性もあります。

以下の場所においてSQL文の中でLONG列を参照することができます。

・ SELECTリスト
・ UPDATE文のSET句
・ INSERT文のVALUES句

LONG値を使用する場合には以下の制限があります。

・ 表は複数のLONG列を持つことはできません。
・ LONG列は整合性制約に使用することはできません(NULL制約とNOT NULL制約を除きます)。
・ LONG列に索引を付けることはできません。
・ ストアド・ファンクションはLONG値を戻すことはできません。
・ 単一のSQL文に指定する、すべてのLONG列、順序、更新対象の表、ロック対象の表は、同一データベース上に位置していなければなりません。

また、LONG列は次のようなSQL文で使用することはできません。

・ CREATE SNAPSHOT

また、LONG列は以下のようなSQL文の一部で使用することはできません。

・ SELECT文におけるWHERE句、GROUP BY句、ORDER BY句、CONNECT BY句、またはDISTINCT演算子
・ SELECT文のUNIQUE句
・ CREATE CLUSTER文の列データ型句
・ SQL関数(SUBSTRやINSTRなど)
・ 式または条件
・ GROUP BY句を含む問合せの選択リスト
・ 集合演算子によって結合されている副問合せや問合せの選択リスト
・ CREATE TABLE AS SELECT文の選択のリスト
・ INSERT文の副問合せの選択リスト

トリガーは、次のようにLONGデータ型を使用します。

・ トリガー内のSQL文で、データをLONG列に挿入できます。
・ LONG列のデータをCHARやVARCHAR2などの制約があるデータ型に変換できる場合は、トリガー内のSQL文でLONG列を参照できます。これらのデータ型の最大長は32キロバイトです。
・ トリガー内の変数は、LONGデータ型を使用して宣言することはできません。
・ :NEWと:OLDはLONG列で使用できません。

Oracleコール・インタフェースを使用して、データベースからLONG値の一部を検索することができます。詳しくは、『Oracleコール・インタフェース・プログラマーズ・ガイド』を参照してください。

DATEデータ型

DATEデータ型は日付と時間の情報を格納するために使用されます。日付と時間の情報はCHARデータ型とNUMBERデータ型で表現することもできますが、DATEデータ型には特別に対応付けられている特性があります。

各DATE値には以下の情報が格納されます。

・ 世紀
・ 年
・ 月
・ 日
・ 時
・ 分
・ 秒

日付値を指定するには、文字値や数値をTO_DATE関数によって日付値に変換しなければなりません。デフォルト日付書式の文字値が日付式で使用されると、Oracle7は自動的にそれらを日付値に変換します。デフォルトの日付書式は、初期化パラメータNLS_DATE_FORMATによって指定され、たとえば'DD-MON-YY'のような文字列になります。'DD-MON-YY'は、日付としての2桁の数、月の名前の省略形、年の下2桁を含む日付書式です。

日付値を指定する場合に時間要素を指定しないと、デフォルト時間である12:00:00a.m.(真夜中)が採用されます。日付値を指定する場合に日付を指定しないと、デフォルト日付である現在の月の最初の日が採用されます。

演算子、関数、式、条件日付関数SYSDATEは現在の日付と時間を戻します。SYSDATE関数とTO_DATE関数、およびデフォルト日付書式に関する説明は、このマニュアルの第3章「演算子、関数、式、条件」を参照してください。

日付算術

日付に対しては、日付の加算や減算だけでなく、数定数の加算や減算を行うことができます。Oracle7は算術日付式における数定数を日付の数として解釈します。たとえば、SYSDATE+1は明日です。SYSDATE-7は1週間前です。SYSDATE+(10/1440)は10分後です。SYSDATEからEMP表のHIREDATE列を引くと、各従業員が雇用されてから経過した日数が戻されます。DATE値の乗算や除算はできません。

Oracle7は一般的な日付操作のために関数を用意しています。たとえば、ADD_MONTHS関数によって日付から月を加えたり、減じたりすることができます。MONTHS_BETWEEN関数は2つの日付の間の月数を戻します。結果の小数部は月(1ヶ月は31日)を単位として表されています。日付関数に関する説明は、3 - 36ページ「日付関数」を参照してください。

各日付には時間要素が含まれるため、日付操作のほとんどの結果には小数部が含まれます。この小数部は日を単位として表されています。たとえば、1.5日は36時間です。

ユリウス日を使用する
ユリウス日は紀元前4712年1月1日以降経過した日数です。ユリウス日によって共通の基準で日付を算定することができます。日付関数TO_DATEとTO_CHARで日付書式モデル「J」を使用して、Oracle7のDATE値とユリウス日の間で変換を行うことができます。

例 次の文は1992年1月1日と等価なユリウス日を戻します。

SELECT TO_CHAR(TO_DATE('01-01-1992', 'MM-DD-YYYY'),'J')
FROM DUAL
TO_CHAR(TO_DATE('01-01-1992','MM-DD-YYYY),'J')
----------------------------------------------
2448623


RAWデータ型とLONG RAWデータ型

RAWデータ型とLONG RAWデータ型のデータは、Oracleによって解釈されません(異なるシステム間でデータを移動する際に変換されない)。これらのデータ型は、バイナリ・データまたはバイト列に使用されます。たとえば、LONG RAWは、図形または音声、文書、バイナリ・データの配列の格納に使用できます。変換処理は使用状況によって異なります。

RAWは、VARCHAR2文字データ型と同様の可変長データ型です。ただし、SQL*Net(ユーザー・セッションとインスタンスを接続する)とImportおよびExportユーティリティは、RAWまたはLONG RAWデータの転送時には文字変換を行いません。それとは対照的に、SQL*NetとImport/Exportは、データベースのキャラクタ・セットとユーザーのセッションのキャラクタ・セット(ALTER SESSIONコマンドのNLS_LANGUAGEパラメータによって設定)が異なる場合に、CHARおよびVARCHAR2、LONGデータをこれら2つのキャラクタ・セット間で自動的に変換します。

RAWデータまたはLONG RAWデータとCHARデータ間の自動変換時に、バイナリ・データは16進数で表現され、1つの16進文字はRAWデータの4ビットすべてを表します。たとえば、ビットが11001011であるRAWデータの1バイトは、「CB」として表示されたり、入力されたりします。
LONG RAWデータに索引を付けることはできませんが、RAWデータには索引を付けられます。

ROWIDデータ型

データベース内の各行はアドレスを持っています。疑似列ROWIDを問い合わせることによって行のアドレスを調べることができます。この疑似列の値は、各行のアドレスを表す16進列(ストリング)です。これらはデータ型ROWIDを持っています。ROWID疑似列に関する説明は、2 - 38ページ「疑似列」を参照してください。また、ROWIDデータ型を持つ実際の列を含む表やクラスタを作成することもできます。Oracle7は、そのような列の値が有効なROWIDであることを保証するわけではありません。

ROWIDは次のような文字値で表現されます。

block.row.file


ここで、それぞれの意味は次のようになります。

block 行を含むデータ・ファイルのデータ・ブロックを識別する16進列(ストリング)です。この16進列の長さはオペレーティング・システムによって異なることがあります。
row データ・ブロック内の行を識別する4桁の16進列です。ブロック内の最初の行は0になります。
file 行を含むデータ・ファイルを識別する16進列です。最初のデータ・ファイルは1になります。この16進列の長さはオペレーティング・システムによって異なることがあります。

例 次のROWID値について考えます。

0000000F.0000.0002


このROWIDに対応する行は、2番目のデータ・ファイル(0002)の15番目のデータ・ブロック(0000000F)内の最初の行(0000)です。

MLSLABELデータ型

MLSLABELデータ型は、安全なオペレーティング・システムで使用されるバイナリ形式のラベルを格納するために使用します。ラベルは情報へのアクセスを調停して解決するために、Trusted Oracle7が使用します。標準のOracle7 Serverを使用している場合も、これらのデータ型で列を定義できます。これらのデータ型とラベルも含めて、Trusted Oracle7に関する説明は、『Trusted Oracle7 Server Administrator's Guide』を参照してください。

ANSI、DB2、SQL/DSのデータ型
表とクラスタを作成するSQLコマンドは、ANSIデータ型、およびIBM社の製品SQL/DSとDB2のデータ型も受け入れます。Oracle7は、表 2 - 2と表 2 - 3で規定される変換に基づくOracle7データ型を使用して、列を作成します。

ANSI SQLデータ型 Oracle7データ型

CHARACTER(n)
CHAR(n) CHAR(n)
CHARACTER VARYING(n)CHAR
VARYING(n) VARCHAR(n)
NUMERIC(p,s)DECIMAL(p,s) NUMBER(p,s)
INTEGERINTSMALLINT NUMBER(38)
FLOAT(b) 2
DOUBLE PRECISION 3
REAL 4 NUMBER
表 2 - 2 . Oracle7データ型に変換されるANSIデータ型


SQL/DSとDB2データ型 Oracle7データ型
CHARACTER(n) CHAR(n)
VARCHAR(n) VARCHAR(n)
LONG VARCHAR(n) LONG
DECIMAL(p,s) 1 NUMBER(p,s)
INTEGERSMALLINT NUMBER(38)
FLOAT(b) 2 NUMBER
表 2 - 3 . Oracle7データ型に変換されるSQL/DSとDB2のデータ型
1 NUMERICデータ型、DECIMALデータ型、およびDECデータ型は固定小数点数だけを指定することができます。これらのデータ型では、sのデフォルトは0です。
2 FLOATデータ型は2進精度bを持つ浮動小数点数です。このデータ型のデフォルト精度は126桁の2進精度または38桁の10進精度です。
3 DOUBLE PRECISIONデータ型は126桁の2進精度を持つ浮動小数点数です。
4 REALデータ型は63桁の2進精度または18桁の10進精度を持つ浮動小数点数です。
次のSQL/DSとDB2のデータ型には対応するOracle7データ型がありません。これらのデータ型を持つ列を定義しないでください。

・ GRAPHIC
・ LONG VARGRAPHIC
・ VARGRAPHIC
・ TIME
・ TIMESTAMP

TIMEとTIMESTAMPのデータは、Oracle7のDATEデータとして表現できることにも注意してください。

データ型の比較規則
ここではOracle7が各データ型の値を比較する方法について記述します。
数値
大きな値は小さな値よりも大きいと見なされます。すべての負の数は、ゼロとすべての正の数より小さいと見なされます。したがって、-1は100より小さく、-100は-1より小さいと見なされます。
日付値
後の日付は前の日付よりも大きいと見なされます。たとえば、'29-MAR-199l'(1991年3月29日)に等しい日付は'05-JAN-1992'(1992年1月5日)に等しい日付よりも小さく、'05-JAN-1992 1:35pm'(1992年1月5日午後1時35分)に等しい日付は'05-JAN-1992 10:09am'(1992年1月5日午前10時9分)に等しい日付よりも大きいと見なされます。

文字列値

文字値は、次のどちらかの比較方法を使用して比較されます。

・ 空白埋め比較
・ 非空白埋め比較

ここでは、これらの比較方法について説明します。これらの異なる比較方法を使用して2つの文字値を比較した場合、その結果が異なることもあります。表 2 - 4に、それぞれの比較方法を使用して5組の文字を比較した結果が示されています。表における最後の比較によって、空白埋め比較と非空白埋め比較の相違が明確になっています。
空白埋め比較と非空白埋め比較の結果を表 2 - 4に示します。通常、空白埋め比較と非空白埋め比較の結果は同じです。ただし、例外があります。表 2 - 4に強調表示しているので、注意してください。ここでは、空白はどの文字よりも小さいとみなされます。これは、ほとんどのキャラクタ・セットでいえることです。

空白埋め比較 非空白埋め比較
'ab' > 'aa' 'ab' > 'aa'
'ab' > 'a ' 'ab' > 'a '
'ab' > 'a' 'ab' > 'a'
'ab' = 'ab' 'ab' = 'ab'
'a ' = 'a' 'a ' > 'a'
表 2 - 4 . 空白埋め比較と非空白埋め比較による比較結果
空白埋め比較 2つの値が異なる長さを持っている場合、Oracle7は、それらの長さが等しくなるように短い値の終わりに空白を追加します。その後、Oracle7は異なる最初の文字が見つかるまで1文字ずつ文字を比較します。最初に異なる文字の見つかった位置で大きい文字を持つ値が、大きいと見なされます。2つの値に異なる文字がまったくない場合にそれらは等価と見なされます。この規則では、後続の空白の数が異なるだけであれば、 2つの値は等しくなります。Oracle7は、比較される両方の値がデータ型CHARを持っている(すなわちテキスト・リテラルである)、あるいはユーザー・ファンクションによって戻される値であるときだけ、空白埋め比較を使用します。

非空白埋め比較 Oracle7は異なる最初の文字が見つかるまで1文字ずつ文字を比較します。最初に異なる文字の見つかった位置で大きい文字を持つ値が、大きいと見なされます。異なる長さの2つの値が、短いほうの値の終わりまで同一である場合、長いほうの値が大きいと見なされます。2つの値の長さが等しく、異なる文字が存在しない場合、2つの値は等価と見なされます。Oracle7は、比較される値のどちらか、あるいは両方がデータ型VARCHAR2 を持っている場合、必ず非空白埋め比較を使用します。
単一文字
Oracle7は、単一文字をデータベースのキャラクタ・セットの照合順番における値に従って比較します。ある文字がもう一方の文字よりも照合順番で大きな値を持っている場合、前者は後者よりも大きいと見なされます。表 2 - 4では、空白はどの文字よりも小さいとみなされます。これは、ほとんどのキャラクタ・セットでいえることです。

以下に、一般的なキャラクタ・セットをいくつか列挙します。

・ 7ビットASCII(情報交換用米国標準コード)
・ EBCDIC(拡張2進化10進コード)コード・ページ500
・ ISO 8859/1(国際標準化機構)
・ JEUC日本語拡張UNIX

ASCIIとEBCDICのキャラクタ・セットの一部を表 2 - 5と表 2 - 6に示します。なお、大文字と小文字は等価ではありません。また、キャラクタ・セットの照合順番は、特定の言語に対する言語順序と一致しない場合があります。


戻る