ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 PL/SQLのデータ型

すべての定数、変数およびパラメータは、記憶形式、制約、値の有効範囲および実行できる演算を決定するデータ型とも呼ばれる)を持っています。 PL/SQLには、多くの事前定義のデータ型およびサブタイプが用意されています。また、PL/SQLを使用して、独自のPL/SQLサブタイプを定義することもできます。

サブタイプとは、別のデータ型のサブセットのことです。その別のデータ型は、そのサブタイプのベース型と呼ばれます。 サブタイプには、そのベース型で有効な演算と同じ演算が含まれています。ただし、ベース型の有効な値のサブセットのみが含まれています。 サブタイプを使用すると、信頼性が向上し、ANSI/ISO型との互換性が保たれ、さらに定数や変数の使用意図を示すことで読みやすさが向上します。

この章では、頻繁に使用する基本的な事前定義のPL/SQLのデータ型とサブタイプ、独自のPL/SQLサブタイプを定義して使用する方法およびPL/SQLのデータ型変換について説明します。 特化された事前定義のデータ型については、以降の章を参照してください。

表3-1に、事前定義のPL/SQLデータ型のカテゴリ、それらのデータ型が格納するデータ、および特化されたデータ型に関する情報の参照先を示します。

表3-1 事前定義のPL/SQLデータ型のカテゴリ

データ型のカテゴリ データの説明

スカラー

内部コンポーネントがない単一の値。

コンポジット

個別にアクセスできる内部コンポーネントがあるデータ項目。 詳細は、第5章「PL/SQLのコレクションおよびレコードの使用」を参照してください。

参照

他のデータ項目へのポインタ。 詳細は、「カーソル変数(REF CURSOR)の使用」を参照してください。

ラージ・オブジェクト(LOB)

他のデータ項目とは別に格納されている大きいオブジェクト(テキスト、図形イメージ、ビデオ・クリップ、サウンド・ウェーブ形式など)へのポインタ。


ここでのトピック:

事前定義のPL/SQLのスカラー・データ型およびサブタイプ

スカラー・データ型は、内部コンポーネントがない単一の値を格納します。 表3-2に、事前定義のPL/SQLのスカラー・データ型、およびそれらが格納するデータを示します。

表3-2 事前定義のPL/SQLのスカラー・データ型のカテゴリ

カテゴリ データの説明

数値

算術演算を実行できる数値。

文字

単一文字または文字列を表す操作可能な英数字値。

BOOLEAN

論理演算を実行できる論理値。

日時

操作可能な日付および時刻。

時間隔

操作可能な時間間隔。


ここでのトピック:

事前定義のPL/SQLの数値データ型およびサブタイプ

数値データ型を使用すると、数値データの格納、量の表現および計算の実行を行うことができます。 表3-3に、事前定義のPL/SQLの数値型、およびそれらが格納するデータを示します。

表3-3 事前定義のPL/SQLの数値データ型

データ型 データの説明

PLS_INTEGERまたはBINARY_INTEGER

32ビットで表される-2147483648から2147483647の範囲の符号付き整数。

BINARY_FLOAT

単精度のIEEE 754形式の浮動小数点数。

BINARY_DOUBLE

倍精度のIEEE 754形式の浮動小数点数。

NUMBER

1E-130から1.0E126(ただし1.0E126を含まない)までの絶対値を持つ固定小数点数または浮動小数点数。 NUMBER変数は0を表すこともできます。


ここでのトピック:

PLS_INTEGERおよびBINARY_INTEGERデータ型

PLS_INTEGERデータ型とBINARY_INTEGERデータ型は同じです。 わかりやすくするために、このマニュアルでは、PLS_INTEGERBINARY_INTEGERの両方を表すためにPLS_INTEGERを使用します。

PLS_INTEGERデータ型は、32ビットで表される-2147483648から2147483647の範囲の符号付き整数を格納します。

PLS_INTEGERデータ型には、NUMBERデータ型およびNUMBERサブタイプと比べて、次のようなメリットがあります。

  • PLS_INTEGER値の方が、必要な記憶域が少なくなります。

  • PLS_INTEGER演算はハードウェア算術計算を使用するため、ライブラリ算術計算を使用するNUMBER演算より処理速度が速くなります。

効率のために、PLS_INTEGERの範囲内でのすべての計算にPLS_INTEGER値を使用してください。 PLS_INTEGERの範囲外の計算には、NUMBERデータ型の事前定義のサブタイプであるINTEGERを使用します。


注意:

2つのPLS_INTEGERデータ型で計算してPLS_INTEGERの範囲をオーバーフローした場合は、結果をNUMBERデータ型に代入しても、オーバーフロー例外が発生します。

表3-4に、PLS_INTEGERデータ型の事前定義のサブタイプ、およびそれらが格納するデータを示します。

表3-4 PLS_INTEGERデータ型の事前定義のサブタイプ

データ型 データの説明

NATURAL

負でないPLS_INTEGER値。

NATURALN

NOT NULL制約が指定された負でないPLS_INTEGER値。

POSITIVE

正のPLS_INTEGER値。

POSITIVEN

NOT NULL制約が指定された正のPLS_INTEGER値。

SIGNTYPE

-1、0または1のPLS_INTEGER値(3値論理のプログラミングに有効です)。

SIMPLE_INTEGER

NOT NULL制約が指定されたPLS_INTEGER値。


PLS_INTEGERのSIMPLE_INTEGERサブタイプ

SIMPLE_INTEGERPLS_INTEGERデータ型の事前定義のサブタイプです。PLS_INTEGERと同じ範囲(-2147483648から2147483647)を取り、NOT NULL制約を含んでいます。 PLS_INTEGERとの大きな違いはオーバーフローの方法です。

SIMPLE_INTEGERは、値がNULLになることがなく、オーバーフロー・チェックが不要な場合に使用できます。 SIMPLE_INTEGER値に対する算術演算はハードウェアで直接実行されるため、SIMPLE_INTEGERを使用すると、NULLかどうかのチェックおよびオーバーフロー・チェックのためのオーバーヘッドが発生せず、PLSQL_CODE_TYPE='NATIVE'の場合、PLS_INTEGERを使用するよりパフォーマンスが大幅に向上します。 PLSQL_CODE_TYPE='INTERPRETED'の場合、パフォーマンスの向上は少なくなります。

ここでのトピック:

オーバーフローの方法

SIMPLE_INTEGERのオーバーフローの方法は、PLS_INTEGERのオーバーフローの方法とは大きく異なります。 PLS_INTEGER値を2147483647より大きくする算術演算、またはPLS_INTEGER値を-2147483648より小さくする算術演算を実行すると、エラーORA-01426が発生します。一方、SQL*Plusから次のPL/SQLブロックを実行すると、このブロックはエラーが発生することなく実行されます。

SQL> DECLARE
  2    n SIMPLE_INTEGER := 2147483645;
  3  BEGIN
  4    FOR j IN 1..4 LOOP
  5      n := n + 1;
  6      DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
  7    END LOOP;
  8    FOR j IN 1..4 LOOP
  9      n := n - 1;
 10      DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
 11    END LOOP;
 12  END;
 13  /
+2147483646
+2147483647
-2147483648
-2147483647
-2147483648
+2147483647
+2147483646
+2147483645

PL/SQL procedure successfully completed.

SQL>
オーバーロード規則
  • オーバーロードされたサブプログラムでは、SIMPLE_INTEGERの実パラメータとPLS_INTEGERの実パラメータを相互に代用できます。

  • それらのすべてのオペランドまたは引数のデータ型がSIMPLE_INTEGERの場合は、2の補数算術が使用され、オーバーフローが無視されて、次のSIMPLE_INTEGER結果が生成されます。

    • 演算子:

      • 加算(+)

      • 減算(-)

      • 乗算(*)

    • 組込みファンクション:

      • MAX

      • MIN

      • ROUND

      • SIGN

      • TRUNC

    • CASE

    すべてではなく一部のオペランドまたは引数のデータ型がSIMPLE_INTEGERの場合、データ型SIMPLE_INTEGERのオペランドまたは引数は、PLS_INTEGER NOT NULLに暗黙的にキャストされます。

整数リテラル

SIMPLE_INTEGERの範囲内の整数リテラルのデータ型はSIMPLE_INTEGERになります。 このため、2の補数算術を使用して計算される算術式で、各整数リテラルをSIMPLE_INTEGERに明示的にキャストする必要がなくなります。

すべてのオペランドおよび引数のデータ型がSIMPLE_INTEGERの場合にのみ、PL/SQLで2の補数算術が使用され、オーバーフローが無視されます。 オーバーフローが無視されるため、値を正から負、または負から正にラップできます。次に例を示します。

230 + 230 = 0x40000000 + 0x40000000 = 0x80000000 = -231

-231 + -231 = 0x80000000 + 0x80000000 = 0x00000000 = 0

算術式内のすべてのオペランドが整数リテラルである場合、PL/SQLでは、下位互換性を確保するために、PLS_INTEGERにキャストされた場合と同様にその整数リテラルが処理されます。

キャスト演算

PLS_INTEGER値をSIMPLE_INTEGERデータ型に強制変換するキャスト演算では、ソース値がNULLでない場合、変換は行われません。 ソース値がNULLの場合は、ランタイム例外が発生します。

SIMPLE_INTEGER値をPLS_INTEGERデータ型に強制変換するキャスト演算では、変換は行われません。 この演算は常に成功します(例外は発生しません)。

コンパイラの警告

コンパイラは、次の場合に警告を発行します。

  • 1つの演算で、SIMPLE_INTEGER値がその他の数値型の値と混用されている場合。

  • PLS_INTEGERが期待されている箇所で、SIMPLE_INTEGER値がパラメータ、バインドまたは定義として渡される場合。

BINARY_FLOATおよびBINARY_DOUBLEデータ型

BINARY_FLOATおよびBINARY_DOUBLEデータ型は、それぞれ単精度および倍精度のIEEE 754形式の浮動小数点数を表します。

BINARY_FLOATリテラルは、末尾にfが付きます(2.07fなど)。 BINARY_DOUBLEリテラルは、末尾にdが付きます(3.000094dなど)。

BINARY_FLOATおよびBINARY_DOUBLEの計算では、例外は発生しません。このため、表3-5に示されている事前定義の定数を使用して、これらの計算によって生成された値をオーバーフローやアンダーフローなどの条件に関して確認する必要があります。 次に例を示します。

SELECT COUNT(*)
  FROM employees
    WHERE salary < BINARY_FLOAT_INFINITY;

表3-5 事前定義のPL/SQLのBINARY_FLOATおよびBINARY_DOUBLEの定数1

定数 説明

BINARY_FLOAT_NAN1

条件IS NAN(非数値)がTRUEになっているBINARY_FLOAT値。

BINARY_FLOAT_INFINITY1

単精度の正の無限大。

BINARY_FLOAT_MAX_NORMAL1

最大正規BINARY_FLOAT値。

BINARY_FLOAT_MIN_NORMAL1

最小正規BINARY_FLOAT値。

BINARY_FLOAT_MAX_SUBNORMAL1

最大非正規BINARY_FLOAT値。

BINARY_FLOAT_MIN_SUBNORMAL1

最小非正規BINARY_FLOAT値。

BINARY_DOUBLE_NAN1

条件IS NAN(非数値)がTRUEになっているBINARY_DOUBLE値。

BINARY_DOUBLE_INFINITY1

倍精度の正の無限大。

BINARY_DOUBLE_MAX_NORMAL

最大正規BINARY_DOUBLE値。

BINARY_DOUBLE_MIN_NORMAL

最小正規BINARY_DOUBLE値。

BINARY_DOUBLE_MAX_SUBNORMAL

最大非正規BINARY_DOUBLE値。

BINARY_DOUBLE_MIN_SUBNORMAL

最小非正規BINARY_DOUBLE値。


1SQLによっても事前定義されます。

IEEE-754標準では、アンダーフローによって発生する問題をなくすために非正規値の範囲が使用されます。

BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型は、「計算集中型PL/SQLプログラムの記述」で説明されているように、主に科学的な高速計算に使用されます。


参照:

異なる数値型を受け入れるライブラリを記述する方法は、「数値型のオーバーロードのガイドライン」を参照してください。

SIMPLE_FLOATおよびSIMPLE_DOUBLEは、それぞれBINARY_FLOATおよびBINARY_DOUBLEデータ型の事前定義のサブタイプです。 各サブタイプはそのベース型と同じ範囲を取り、NOT NULL制約を含んでいます。

SIMPLE_INTEGERおよびSIMPLE_DOUBLEは、値がNULLになることがない場合に使用できます。 SIMPLE_FLOATおよびSIMPLE_DOUBLE値に対する算術演算はハードウェアで直接実行されるため、SIMPLE_FLOATおよびSIMPLE_DOUBLEを使用すると、NULLかどうかのチェックのためのオーバーヘッドが発生せず、PLSQL_CODE_TYPE='NATIVE'の場合、BINARY_FLOATおよびBINARY_DOUBLEを使用するよりパフォーマンスが大幅に向上します。 PLSQL_CODE_TYPE='INTERPRETED'の場合、パフォーマンスの向上は少なくなります。

NUMBERデータ型

NUMBERデータ型は、1E-130から1.0E126(ただし1.0E126を含まない)までの絶対値を持つ固定小数点数または浮動小数点数を格納します。 NUMBER変数は0を表すこともできます。

指定した範囲内のNUMBERリテラルおよびNUMBERの計算結果のみを使用することをお薦めします。 そうしない場合、次の状況が発生します。

  • 小さすぎる値は、0(ゼロ)に丸められます。

  • リテラル値が大きすぎる場合は、コンパイル・エラーが発生します。

  • 計算結果が大きすぎる場合、計算結果は未定義となり、信頼性がなくなります。ランタイム・エラーが発生する可能性もあります。

NUMBER値には、精度(precision)位取り(scale)の両方があります。精度(precision)は全体の桁数を表し、位取り(scale)は小数点以下の桁数を表します。

固定小数点NUMBERを指定するための構文は、次のとおりです。

NUMBER(precision, scale)

次に例を示します。

NUMBER(8,2)

整数の場合、位取り(scale)は0(ゼロ)です。 整数NUMBERを指定するための構文は、次のとおりです。

NUMBER(precision)

次に例を示します。

NUMBER(2)

浮動小数点数では、小数点は任意の位置に浮動できます。 浮動小数点NUMBERを指定するための構文は、次のとおりです。

NUMBER

precisionscaleは両方とも、定数または変数ではなく、整数リテラルである必要があります。

precisionの最大値は38です。デフォルト値は、39、40、または使用しているシステムでの最大値のうちの最も小さい値になります。

scaleの最小値は-84、最大値は127です。 デフォルト値は0(ゼロ)です。

位取り(scale)によって、四捨五入の位置が決まります。 たとえば、位取り(scale)が2と指定されている値は、小数点以下2桁に四捨五入されます(3.454は3.45になり、3.456は3.46になります)。 負の位取り(scale)を指定すると、小数点の左側で四捨五入されます。 たとえば、位取り(scale)が-3と指定されている値は、1000の位で四捨五入されます(34462は34000になり、34562は35000になります)。 位取り(scale)が0(ゼロ)と指定されている値は、最も近い整数に四捨五入されます(3.4562は3になり、3.56は4になります)。

NUMBERデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

表3-6に、NUMBERデータ型の事前定義のサブタイプ、およびそれらが格納するデータを示します。

表3-6 NUMBERデータ型の事前定義のサブタイプ

データ型 説明

DECDECIMALまたはNUMERIC

精度(precision)の最大値が38桁の10進数である固定小数点NUMBER

DOUBLE PRECISIONまたはFLOAT

精度(precision)の最大値が126桁の2進数(38桁の10進数とほぼ同等)である浮動小数点NUMBER

INTINTEGERまたはSMALLINT

精度(precision)の最大値が38桁の10進数である整数。

REAL

精度(precision)の最大値が63桁の2進数(18桁の10進数とほぼ同等)である浮動小数点NUMBER


事前定義のPL/SQLの文字データ型およびサブタイプ

文字データ型を使用すると、単一文字または文字列を表す操作可能な英数字値を格納できます。 表3-7に、事前定義のPL/SQLの文字型、およびそれらが格納するデータを示します。

表3-7 事前定義のPL/SQLの文字データ型1

データ型 データの説明

CHAR

最大サイズが32767バイトである固定長の文字列。

VARCHAR2

最大サイズが32767バイトである可変長の文字列。

RAW

PL/SQLによって解釈されない、最大サイズが32767バイトである可変長のバイナリ文字列またはバイト文字列。

NCHAR

最大サイズが32767バイトである固定長の各国語キャラクタ文字列。

NVARCHAR2

最大サイズが32767バイトである可変長の各国語キャラクタ文字列。

LONG1

最大サイズが32760バイトである可変長の文字列。

LONG RAW1

PL/SQLによって解釈されない、最大サイズが32760バイトである可変長のバイナリ文字列またはバイト文字列。

ROWID1

通常の表内の行のアドレスである物理行識別子。

UROWID

ユニバーサル行識別子(物理行識別子、論理識別子または外部行識別子)。


1既存のアプリケーションとの下位互換性のためにのみサポートされています。

ここでのトピック:

CHARおよびVARCHAR2データ型

CHARデータ型は固定長の文字列を格納し、VARCHAR2データ型は可変長の文字列を格納します。 すべての文字列リテラルは、CHARデータ型を持っています。

CHARおよびVARCHAR2データの内部表現形式は、CREATE DATABASE文のCHARACTER SET句によって指定されたデータベース・キャラクタ・セットによって異なります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

CHARまたはVARCHAR2データ項目を指定するための構文は、次のとおりです。

[ CHAR | VARCHAR2 ] [( maximum_size [ CHAR | BYTE ] )]

次に例を示します。

CHAR
VARCHAR2
CHAR(10 CHAR)
VARCHAR2(32 BYTE)

maximum_sizeは、定数または変数ではなく、1から32767の範囲の整数リテラルである必要があります。 デフォルト値は1です。

デフォルトのサイズ単位(CHARまたはBYTE)は、NLS_LENGTH_SEMANTICS初期化パラメータによって決定されます。 PL/SQLサブプログラムのコンパイル時には、このパラメータの設定が記録されるため、サブプログラムが無効になった後に再コンパイルするときにも同じ設定が使用されます。 NLS_LENGTH_SEMANTICSの詳細は、『Oracle Databaseリファレンス』を参照してください。

CHARまたはVARCHAR2データ項目の最大サイズは、maximum_sizeを文字数で指定するか、バイト数で指定するかに関係なく、32767バイトです。 CHARまたはVARCHAR2データ項目の最大文字数は、キャラクタ・セットのエンコード方法によって異なります。 シングルバイト・キャラクタ・セットでは、CHARまたはVARCHAR2データ項目の最大サイズは32767文字です。 nバイトのキャラクタ・セットでは、CHARまたはVARCHAR2データ項目の最大サイズは32767/n文字です。この最大サイズの少数点以下は切り捨てられ、最も近い整数になります。 マルチバイトのキャラクタ・セットでは、CHAR(nまたはVARCHAR2(n変数でn個のマルチバイト文字を格納できるようにmaximum_sizeを文字数で指定します。

文字変数に代入した文字値がこの変数の最大サイズより長い場合、PL/SQLはこの値を切り捨てたり、後続する空白を削除せずに、代入を中止して、事前定義の例外VALUE_ERRORを呼び出します。

たとえば、次のような宣言があるとします。

acronym CHAR(4);

次のような代入を試みるとVALUE_ERRORが呼び出されます。

acronym := 'SPCA ';  -- note trailing blank

データベース列に挿入した文字値が定義されている列幅より長い場合、PL/SQLはこの値を切り捨てたり、後続する空白を削除せずに、挿入を中止して例外を呼び出します。

文字値を変数に代入したり、データベース列に挿入する前に、その文字値から後続する空白を削除するには、組込みファンクションRTRIMを使用します。 たとえば、前述の宣言の場合、次の代入を実行しても例外は呼び出されません。

acronym := RTRIM('SPCA ');  -- note trailing blank

RTRIMの構文は、『Oracle Database SQL言語リファレンス』を参照してください。

CHARとVARCHAR2のデータ型の違い

CHARVARCHAR2のデータ型は、次の点で異なっています。

文字データ型の事前定義のサブタイプ

CHARデータ型には、CHARACTERという1つの事前定義のサブタイプがあります。 VARCHAR2データ型には、VARCHARSTRINGという2つの事前定義のサブタイプがあります。 これらの各サブタイプはそれぞれのベース型と同じ値の範囲を取り、ANSI/ISOおよびIBM型との互換性を保つためにそれぞれのベース型のかわりに使用できます。


注意:

PL/SQLの今後のリリースでのVARCHARは、新しいSQL標準に従うために別のデータ型になり、VARCHAR2と同義ではなくなる可能性があります。

文字変数用のメモリー割当て

CHAR変数または最大サイズが2000バイト未満のVARCHAR2変数の場合、PL/SQLは、コンパイル時に最大サイズに対応できる十分なメモリーを割り当てます。 最大サイズが2000バイト以上のVARCHAR2の場合、PL/SQLは、実行時に実際の値を格納するための十分なメモリーを割り当てます。 このようにして、PL/SQLは、VARCHAR2変数が小さい場合はパフォーマンスに応じて変数を最適化し、大きい場合はメモリーを効率的に使用するために変数を最適化します。

たとえば、VARCHAR2(1999 BYTE)変数とVARCHAR2(2000 BYTE)変数に同じ500バイトの値を代入すると、PL/SQLは、前者の変数にはコンパイル時に1999バイト、後者の変数には実行時に500バイトを割り当てます。

短い方の文字値の空白埋め

次の各状況では、PL/SQLによって文字値が空白で埋められるかどうかが、受信者のデータ型によって異なります。

  • PL/SQLの文字変数に代入した文字値がこの変数の最大サイズより短い。

  • 文字データベース列に挿入した文字値が定義されている列幅より短い。

  • 文字データベース列から取り出してPL/SQLの文字変数に入れた値が、この変数の最大長より短い。

受信者のデータ型がCHARの場合、PL/SQLは最大サイズになるまで値を空白で埋めます。 元の値の後続する空白に関する情報は失われます。

たとえば、次の文では、last_nameに代入された値の後に、1つのみではなく6つの空白が含まれます。

last_name CHAR(10) := 'CHEN ';  -- note trailing blank

受信者のデータ型がVARCHAR2の場合、PL/SQLは値の空白埋めも、後続する空白の削除もしません。 文字値はそのまま代入され、情報は失われません。

文字値の比較

表2-4の関係演算子を使用すると、文字値を比較できます。 文字値の比較では、データベース・キャラクタ・セットに使用される照合順番で後の文字値が大きくなります。 次の例では、IF条件はTRUEです。

SQL> DECLARE
  2    last_name1 VARCHAR2(10) := 'COLES';
  3    last_name2 VARCHAR2(10) := 'COLEMAN';
  4  BEGIN
  5    IF last_name1 > last_name2 THEN
  6      DBMS_OUTPUT.PUT_LINE
  7        (last_name1 || ' is greater than ' || last_name2);
  8    ELSE
  9      DBMS_OUTPUT.PUT_LINE
 10        (last_name2 || ' is greater than ' || last_name1 );
 11    END IF;
 12  END;
 13  /
COLES is greater than COLEMAN

PL/SQL procedure successfully completed.

SQL>

等しくなるには、2つの文字値の長さが同じである必要があります。

両方の値のデータ型がCHARの場合、PL/SQLは、これらの値を比較する前に、短い方の値に長い方の値と同じ長さになるまで空白を埋めます。 例3-1では、IF条件はTRUEです。

いずれかの値のデータ型がVARCHAR2の場合、PL/SQLは、これらの値を比較する前に、これらの値の長さを調整することはありません。 例3-2例3-3のいずれも、IF条件はFALSEです。

例3-1 2つのCHAR値の比較

SQL> DECLARE
  2    last_name1 CHAR(5)  := 'BELLO';     -- no trailing blanks
  3    last_name2 CHAR(10) := 'BELLO   ';  -- trailing blanks
  4  BEGIN
  5    IF last_name1 = last_name2 THEN
  6      DBMS_OUTPUT.PUT_LINE
  7        (last_name1 || ' is equal to ' || last_name2);
  8    ELSE
  9      DBMS_OUTPUT.PUT_LINE
 10      (last_name2 || ' is not equal to ' || last_name1);
 11    END IF;
 12  END;
 13  /
BELLO is equal to BELLO

PL/SQL procedure successfully completed.

SQL>

例3-2 2つのVARCHAR2値の比較

SQL> DECLARE
  2    last_name1 VARCHAR2(10) := 'DOW';     -- no trailing blanks
  3    last_name2 VARCHAR2(10) := 'DOW   ';  -- trailing blanks
  4  BEGIN
  5    IF last_name1 = last_name2 THEN
  6      DBMS_OUTPUT.PUT_LINE
  7        (last_name1 || ' is equal to ' || last_name2 );
  8    ELSE
  9      DBMS_OUTPUT.PUT_LINE
 10      (last_name2 || ' is not equal to ' || last_name1);
 11    END IF;
 12  END;
 13  /
DOW    is not equal to DOW

PL/SQL procedure successfully completed.

SQL>

例3-3 CHAR値とVARCHAR2値の比較

SQL> DECLARE
  2    last_name1 VARCHAR2(10) := 'STAUB';
  3    last_name2 CHAR(10)     := 'STAUB';  -- PL/SQL blank-pads value
  4  BEGIN
  5    IF last_name1 = last_name2 THEN
  6      DBMS_OUTPUT.PUT_LINE
  7        (last_name1 || ' is equal to ' || last_name2);
  8    ELSE
  9      DBMS_OUTPUT.PUT_LINE
 10        (last_name2 || ' is not equal to ' || last_name1 );
 11    END IF;
 12  END;
 13  /
STAUB      is not equal to STAUB

PL/SQL procedure successfully completed.

SQL>
文字データベース列に挿入される値の最大サイズ

CHARデータベース列に挿入できる最大のCHAR値は、2000バイトです。

VARCHAR2データベース列に挿入できる最大のVARCHAR2値は、4000バイトです。

LONG列の最大幅は2147483648バイト(2GB)であるため、すべてのCHAR値またはVARCHAR2値をLONGデータベース列に格納できます。 ただし、LONG列から32767バイトを超える長さの値を取り出してCHAR変数またはVARCHAR2変数に入れることはできません (LONGデータ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。)

RAWデータ型

RAWデータ型は、図形文字の並びやデジタル化された絵といったバイナリまたはバイト列を格納します。 RAWデータはVARCHAR2データと似ていますが、PL/SQLによって解釈されない点が異なります。 RAWデータをシステム間で送信する際に、Oracle Netはキャラクタ・セット変換を実行しません。

RAWデータ項目を指定するための構文は、次のとおりです。

RAW (maximum_size)

次に例を示します。

RAW(256)

maximum_size(バイト単位)は、定数または変数ではなく、1から32767の範囲の整数リテラルである必要があります。 デフォルト値は1です。

RAWデータベース列に挿入できる最大のRAW値は、2000バイトです。

LONG RAW列の最大幅は、2147483648バイト(2GB)であるため、すべてのRAW値をLONG RAWデータベース列に格納できます。 ただし、LONG RAW列から32768バイト以上の値を取り出してRAW変数に入れることはできません。 (LONG RAWデータ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。)

NCHARおよびNVARCHAR2データ型

NCHARデータ型は固定長の各国語キャラクタ文字列を格納し、NVARCHAR2データ型は可変長の各国語キャラクタ文字列を格納します。

各国語キャラクタ文字列は、各国語キャラクタ・セットからの文字で構成されています。各国語キャラクタ・セットは、何千もの文字を持つ言語(日本語など)を表現するために使用されます。各文字に、2バイトまたは3バイトが必要です。

NCHARおよびNVARCHAR2データの内部表現形式は、CREATE DATABASE文のNATIONAL CHARACTER SET句によって指定された各国語キャラクタ・セットによって異なります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

ここでのトピック:

AL16UTF16およびUTF8エンコーディング

各国語キャラクタ・セットでは、データはAL16UTF16またはUTF8エンコーディングを使用してUnicodeとして表されます。 表3-8では、AL16UTF16UTF8エンコーディングを比較しています。

表3-8 AL16UTF16とUTF8エンコーディングの比較

エンコーディング 文字サイズ(バイト) メリット デメリット

AL16UTF16(デフォルト)

2

文字列長を簡単に計算できます。この計算は、複数のプログラミング言語が混在する場合に、切捨てエラーを回避するために実行する必要があります。

主にASCIIまたはEBCDIC文字で構成されている文字列によって、必要以上の領域が使用されます。

UTF8

1、2または3

ほとんどの文字で1バイトのみが使用される場合、変数または表の列に、より多数の文字を入れることができます。

データをバイト単位のバッファに転送すると、切捨てエラーになる可能性があります。


最大限の信頼性が得られるように、できるかぎりデフォルトのAL16UTF16エンコーディングを使用することをお薦めします。 UTFエンコーディングを使用するには、CREATE DATABASE文のNATIONAL CHARACTER SET句でこのエンコーディングを指定します。

Unicode文字列に必要なバイト数を判断するには、組込みファンクションLENGTHBを使用してください。

CREATE DATABASE文のNATIONAL CHARACTER SET句およびLENGTHBファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

各国語キャラクタ・セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

NCHARデータ型

NCHARデータ型は固定長の各国語キャラクタ文字列を格納します。 この型は常にマルチバイト文字に対処できるため、Unicode文字データの格納に使用できます。

NCHARデータ項目を指定するための構文は、次のとおりです。

NCHAR [(maximum_size)]

次に例を示します。

NCHAR
NCHAR(100)

maximum_sizeは、定数または変数ではなく、整数リテラルである必要があります。 これは最大バイト数ではなく、最大文字数を表します。値は32767です。指定できる最大のmaximum_sizeは、AL16UTF16エンコーディングを使用する場合は32767/2、UTF8エンコーディングを使用する場合は32767/3です。 デフォルト値は1です。

NCHARデータベース列に挿入できる最大のNCHAR値は、2000バイトです。

NCHAR値がNCHAR列の定義された幅より短ければ、PL/SQLは定義幅まで値を空白で埋めます。

CHARおよびNCHAR値は、文と式の中で交換できます。 常に安全にCHAR値をNCHAR値に変換できますが、CHAR値のキャラクタ・セットでNCHAR値のすべての文字を表すことができない場合は、NCHAR値をCHAR値に変換するとデータが失われる場合があります。 このようなデータの消失が発生すると、各文字では通常は疑問符(?)のようになります。

NVARCHAR2データ型

NVARCHAR2データ型は可変長の各国語キャラクタ文字列を格納します。 この型は常にマルチバイト文字に対処できるため、Unicode文字データの格納に使用できます。

NVARCHAR2データ項目を指定するための構文は、次のとおりです。

NVARCHAR2 (maximum_size)

次に例を示します。

NVARCHAR2(300)

maximum_sizeは、定数または変数ではなく、整数リテラルである必要があります。 これは最大バイト数ではなく、最大文字数を表します。値は32767です。指定できる最大のmaximum_sizeは、AL16UTF16エンコーディングを使用する場合は32767/2、UTF8エンコーディングを使用する場合は32767/3です。 デフォルト値は1です。

NVARCHAR2データベース列に挿入できる最大のNVARCHAR2値は、4000バイトです。

VARCHAR2およびNVARCHAR2値は、文と式の中で交換できます。 VARCHAR2値をNVARCHAR2値に変換するのは常に問題ありませんが、NVARCHAR2値のすべての文字がVARCHAR2値のキャラクタ・セットで表せるとはかぎらない場合は、NVARCHAR2値をVARCHAR2値に変換するとデータが失われる場合があります。 このようなデータの消失が発生すると、各文字では通常は疑問符(?)のようになります。

LONGおよびLONG RAWデータ型


注意:

LONGおよびLONG RAWデータ型は、既存アプリケーションとの下位互換性のためにのみ使用してください。 新規アプリケーションには、LONGのかわりにCLOBまたはNCLOBを、LONG RAWのかわりにBLOBまたはBFILEを使用してください。 また、既存のLONGおよびLONG RAWデータ型は、LOBデータ型に置き換えることをお薦めします。 詳細は、「事前定義のPL/SQLのラージ・オブジェクト(LOB)・データ型」を参照してください。

LONGデータ型は可変長の文字列を格納します。 LONGデータ型は、LONG値の最大サイズが(32767バイトではなく)32760バイトであるという点を除けば、VARCHAR2データ型と同じです。

LONG RAWデータ型はバイナリまたはバイト文字列を格納します。 LONG RAWデータは、LONG RAWデータがPL/SQLによって解釈されないという点を除けば、LONGデータと同じです。 LONG RAW値の最大サイズは32760バイトです。

LONGまたはLONG RAWデータベース列の最大幅は2147483648バイト(2GB)であるため、すべてのLONG値をLONG列、すべてのLONG RAW値をLONG RAW列に格納できます。 ただし、32760バイトを超える長さの値をLONG列から取り出してLONG変数に入れたり、LONG RAW列から取り出してLONG RAW変数に入れることはできません。

LONG型のデータベース列にはテキスト、文字の配列、短いドキュメントなどを格納できます。


参照:

SQL文内のLONG列の参照の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

ROWIDおよびUROWIDデータ型

内部的に、すべてのデータベース表には、ROWIDというバイナリ値を格納するROWID擬似列があります。 各ROWIDは、行の記憶域アドレスを表します。 物理ROWIDは、通常の表の行を識別します。 論理ROWIDは、索引構成表の行を識別します。 ROWIDデータ型には物理ROWIDのみ格納でき、UROWIDユニバーサルROWID)データ型には物理ROWID、論理ROWID、外部(データベース以外)ROWIDを格納できます。


注意:

ROWIDデータ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 新しいアプリケーションの場合には、UROWIDデータ型を使用します。

物理ROWIDは、複数のコミットにまたがってフェッチする場合に便利です(例6-42を参照)。

ROWIDを取り出してROWID変数に入れる場合は、バイナリ値を18バイトの文字列に変換する組込みファンクションROWIDTOCHARを使用します。 逆に、ファンクションCHARTOROWIDROWID文字列をROWIDに変換します。 文字列が有効なROWIDを表していないために変換が失敗すると、PL/SQLは事前定義の例外SYS_INVALID_ROWIDを発生します。 これは、暗黙的な変換にも適用されます。

UROWID変数と文字列間で変換するには、ファンクション・コールなしで通常の代入文を使用します。 値は、UROWIDとキャラクタ・タイプの間で暗黙的に変換されます。


参照:

  • ROWIDに関する一般情報は、『Oracle Database概要』を参照してください。

  • ROWIDを操作できるサブプログラムが含まれているパッケージDBMS_ROWIDの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


事前定義のPL/SQLのブール・データ型

BOOLEANデータ型は、論理演算で使用できる論理値を格納します。 論理値には、ブール値(TRUEFALSE)およびNULL値があります。

BOOLEANデータ項目を指定するための構文は、次のとおりです。

BOOLEAN

SQLにはBOOLEANに相当するデータ型がありません。このため、次の文またはファンクション内ではBOOLEAN変数またはパラメータを使用できません。

  • SQL文

  • 組込みSQLファンクション(TO_CHARなど)

  • SQL文から起動されるPL/SQLファンクション

データベース列に値TRUEFALSEを挿入できません。 データベース列の値を取り出してBOOLEAN変数に入れることはできません。

BOOLEAN値を出力に表示するには、IF-THEN構造体またはCASE構造体を使用して、BOOLEAN値を別の型(0または1、YまたはN、trueまたはfalseなど)に変換します。

事前定義のPL/SQLの日時データ型および時間隔データ型

この項で説明するデータ型を使用すると、日付、時刻および時間隔(期間)を格納し、操作できます。 日付および時刻データ型の変数には日時と呼ばれる値が格納されます。 時間隔データ型の変数には時間隔と呼ばれる値が格納されます。 日時または時間隔は、その値を決定するフィールドで構成されます。 次のリストに、各フィールドの有効値を示します。

フィールド名 有効な日時値 有効な時間隔値
YEAR -4712から9999(年0を除く) 0以外の任意の整数
MONTH 01から12 0から11
DAY 01から31(ロケールのカレンダの規則に従ってMONTHおよびYEARの値による制限付き) 0以外の任意の整数
HOUR 00から23 0から23
MINUTE 00から59 0から59
SECOND 00から59.9(n)、9(n)は時刻の秒の精度 0から59.9(n)、9(n)は時間隔の秒の精度
TIMEZONE_HOUR -12から14(範囲は夏時間の変更に対応) 該当なし
TIMEZONE_MINUTE 00から59 該当なし
TIMEZONE_REGION 動的パフォーマンス・ビューV$TIMEZONE_NAMESに表示 該当なし
TIMEZONE_ABBR 動的パフォーマンス・ビューV$TIMEZONE_NAMESに表示 該当なし

TIMESTAMP WITH LOCAL TIMEZONEを除き、前述の型はすべてSQL92規格の一部です。 日時および時間隔のフォーマット・モデル、リテラル、タイムゾーン名およびSQLファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

ここでのトピック:

DATEデータ型

DATEデータ型は、午前0時からの経過秒数を含む固定長の日時の格納に使用します。 デフォルトでは、日付部分は現在の月の最初の日であり、時刻の部分は午前0時です。 日付関数SYSDATEは、現在の日付と時刻を戻します。

日付の等価性を各日付の時刻の部分に関係なく比較するには、比較、GROUP BY操作などにファンクションの結果TRUNC(date_variable)を使用します。

DATE変数の時刻の部分のみを確認するには、日付の部分を引きます(date_variable - TRUNC(date_variable))。

使用できる日付は、紀元前4712年1月1日から西暦9999年12月31日までです。 ユリウス日付は、紀元前4712年1月1日からの日数です。 ユリウス日付によって、共通の参照元からの連続した日付が可能になります。 日付関数TO_DATETO_CHARで日付書式モデル'J'を使用すると、DATE値とそれに対応するユリウス日付の値の間で変換できます。

日付式の中では、デフォルトの日付書式の文字値は自動的にDATE値に変換されます。 デフォルトの日付書式は、Oracle初期化パラメータNLS_DATE_FORMATによって設定されます。 たとえば、デフォルトは'DD-MON-YY'であり、これは2桁数字の日、月の省略名、年数の下2桁を含むものということです。

日付に対しては加算および減算ができます。 算術式の中では、PL/SQLは整数リテラルを日数として解釈します。 たとえば、SYSDATE + 1は、次の日の同じ時刻ということです。

TIMESTAMPデータ型

TIMESTAMPデータ型はDATEデータ型への拡張であり、年、月、日、時間、分および秒が格納されます。 次に構文を示します。

TIMESTAMP[(precision)

オプションのprecisionパラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。

デフォルトのタイムスタンプ日付書式は、Oracle初期化パラメータNLS_TIMESTAMP_FORMATによって設定されます。

例3-4では、TIMESTAMP型の変数を宣言して、その変数にリテラル値を代入します。 秒フィールドの小数部は0.275です。

例3-4 TIMESTAMP変数へのリテラル値の代入

SQL> DECLARE
  2    checkout TIMESTAMP(3);
  3  BEGIN
  4    checkout := '22-JUN-2004 07:48:53.275';
  5    DBMS_OUTPUT.PUT_LINE( TO_CHAR(checkout));
  6  END;
  7  /
22-JUN-04 07.48.53.275 AM

PL/SQL procedure successfully completed.

SQL>

例3-5では、SCN_TO_TIMESTAMPおよびTIMESTAMP_TO_SCNファンクションは、TIMESTAMPを操作するために使用されます。

例3-5 SCN_TO_TIMESTAMPおよびTIMESTAMP_TO_SCNファンクションの使用

SQL> DECLARE
  2    right_now  TIMESTAMP;
  3    yesterday  TIMESTAMP;
  4    sometime   TIMESTAMP;
  5    scn1       INTEGER;
  6    scn2       INTEGER;
  7    scn3       INTEGER;
  8  BEGIN
  9    right_now := SYSTIMESTAMP;
 10    scn1 := TIMESTAMP_TO_SCN(right_now);
 11    DBMS_OUTPUT.PUT_LINE('Current SCN is ' || scn1);
 12
 13    yesterday := right_now - 1;
 14    scn2 := TIMESTAMP_TO_SCN(yesterday);
 15    DBMS_OUTPUT.PUT_LINE('SCN from yesterday is ' || scn2);
 16
 17    -- Find arbitrary SCN between yesterday and today
 18
 19    scn3 := (scn1 + scn2) / 2;
 20    sometime := SCN_TO_TIMESTAMP(scn3);
 21    DBMS_OUTPUT.PUT_LINE
 22      ('SCN ' || scn3 || ' was in effect at ' || TO_CHAR(sometime));
 23  END;
 24  /
Current SCN is 3945848
SCN from yesterday is 3899547
SCN 3922698 was in effect at 03-JAN-08 10.00.06.000000 PM

PL/SQL procedure successfully completed.

SQL>

TIMESTAMP WITH TIME ZONEデータ型

TIMESTAMP WITH TIME ZONEデータ型は、TIMESTAMPデータ型への拡張であり、タイムゾーンによる時差を含みます。 タイムゾーンによる時差とは、現地時間と協定世界時(UTC、旧称はグリニッジ標準時(GMT))の時差(時間および分単位)です。 次に構文を示します。

TIMESTAMP[(precision)] WITH TIME ZONE

オプションのprecisionパラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。

デフォルトのタイムゾーン付きタイムスタンプの書式は、Oracle初期化パラメータNLS_TIMESTAMP_TZ_FORMATによって設定されます。

例3-6では、TIMESTAMP WITH TIME ZONE型の変数を宣言して、その変数にリテラル値を代入します。 タイムゾーンによる時差は+02:00です。

例3-6 TIMESTAMP WITH TIME ZONE変数へのリテラルの代入

SQL> DECLARE
  2    logoff TIMESTAMP(3) WITH TIME ZONE;
  3  BEGIN
  4    logoff := '10-OCT-2004 09:42:37.114 AM +02:00';
  5    DBMS_OUTPUT.PUT_LINE (TO_CHAR(logoff));
  6  END;
  7  /
10-OCT-04 09.42.37.114 AM +02:00

PL/SQL procedure successfully completed.

SQL>

また、シンボリック名でタイムゾーンを指定することもできます。 この指定には、'US/Pacific'などの長い形式、'PDT'などの省略形またはその組合せを使用できます。 たとえば、次のリテラルはいずれも同じ時刻を表します。 3番目は、夏時間に切り替わった時点で適用される規則を指定しているため、最も信頼性の高い書式です。

TIMESTAMP '15-APR-2004 8:00:00 -8:00'
TIMESTAMP '15-APR-2004 8:00:00 US/Pacific'
TIMESTAMP '31-OCT-2004 01:30:00 US/Pacific PDT'

タイムゾーンに使用可能な名前は、静的データ・ディクショナリ・ビューV$TIMEZONE_NAMESTIMEZONE_REGIONおよびTIMEZONE_ABBR列にあります。

2つのTIMESTAMP WITH TIME ZONE値は、UTCで同じ時間を表していれば、タイムゾーンによる時差に関係なく同一とみなされます。 たとえば、UTCの太平洋標準時で午前8:00は東部標準時の午前11:00と同じであるため、次の2つの値は同一とみなされます。

'29-AUG-2004 08:00:00 -8:00'
'29-AUG-2004 11:00:00 -5:00'

TIMESTAMP WITH LOCAL TIME ZONEデータ型

TIMESTAMP WITH LOCAL TIME ZONEデータ型は、TIMESTAMPデータ型の拡張であり、タイムゾーンによる時差を含みます。 タイムゾーンによる時差とは、現地時間と協定世界時(UTC、旧称はグリニッジ標準時)の時差(時間および分単位)です。 TIMESTAMP WITH TIME ZONEと同様に、名前付きのタイムゾーンも使用できます。

次に構文を示します。

TIMESTAMP[(precision)] WITH LOCAL TIME ZONE

オプションのprecisionパラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。

このデータ型は、TIMESTAMP WITH TIME ZONEとは異なり、データベース列に値を挿入すると、値はデータベースのタイムゾーンに正規化され、タイムゾーンによる時差は列に格納されません。 値を取り出すときには、ローカル・セッションのタイムゾーンで戻されます。

例3-7および例3-8では、いずれもTIMESTAMP WITH LOCAL TIME ZONE型の変数を宣言して、その変数に値を代入します。 例3-7の値は適切な現地時間ですが、例3-8の値にはタイムゾーンによる時差が含まれているため、エラーが発生します。

例3-7 TIMESTAMP WITH LOCAL TIME ZONEへの適切な代入

SQL> DECLARE
  2    logoff  TIMESTAMP(3) WITH LOCAL TIME ZONE;
  3  BEGIN
  4    logoff := '10-OCT-2004 09:42:37.114 AM ';
  5    DBMS_OUTPUT.PUT_LINE(TO_CHAR(logoff));
  6  END;
  7  /
10-OCT-04 09.42.37.114 AM

PL/SQL procedure successfully completed.

SQL>

例3-8 TIMESTAMP WITH LOCAL TIME ZONEへの不適切な代入

SQL> DECLARE
  2    logoff  TIMESTAMP(3) WITH LOCAL TIME ZONE;
  3  BEGIN
  4    logoff := '10-OCT-2004 09:42:37.114 AM +02:00';
  5  END;
  6  /
DECLARE
*
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at line 4

SQL>

INTERVAL YEAR TO MONTHデータ型

INTERVAL YEAR TO MONTHデータ型は、年および月の時間隔を格納し、操作するために使用します。 次に構文を示します。

INTERVAL YEAR[(precision)] TO MONTH

precisionでは、年フィールドの桁数を指定します。 精度には0から4の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは2です。

例3-9では、INTERVAL YEAR TO MONTH型の変数を宣言して、その変数に3つの方法で101年と3か月という値を代入しています。

例3-9 INTERVAL YEAR TO MONTH変数へのリテラルの代入

SQL> DECLARE
  2    lifetime  INTERVAL YEAR(3) TO MONTH;
  3  BEGIN
  4    lifetime := INTERVAL '101-3' YEAR TO MONTH;  -- Interval literal
  5
  6    lifetime := '101-3';  -- Implicit conversion from character type
  7
  8    lifetime := INTERVAL '101' YEAR;  -- Specify only years
  9    lifetime := INTERVAL '3' MONTH;   -- Specify only months
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL>

INTERVAL DAY TO SECONDデータ型

INTERVAL DAY TO SECONDデータ型は、日、時間、分および秒の時間隔を格納し、操作するために使用します。 次に構文を示します。

INTERVAL DAY[(leading_precision)
  TO SECOND (fractional_seconds_precision)

leading_precisionおよびfractional_seconds_precisionでは、それぞれ日付フィールドと秒フィールドの桁数を指定します。 どちらの場合も、精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトはそれぞれ2および6です。

例3-10では、INTERVAL DAY TO SECOND型の変数を宣言して、その変数に値を代入します。

例3-10 INTERVAL DAY TO SECOND変数へのリテラルの代入

SQL> DECLARE
  2    lag_time  INTERVAL DAY(3) TO SECOND(3);
  3  BEGIN
  4    lag_time := '7 09:24:30';
  5
  6    IF lag_time > INTERVAL '6' DAY THEN
  7      DBMS_OUTPUT.PUT_LINE ('Greater than 6 days');
  8    ELSE
  9      DBMS_OUTPUT.PUT_LINE ('Less than 6 days');
 10    END IF;
 11  END;
 12  /
Greater than 6 days

PL/SQL procedure successfully completed.

SQL>

日時および時間隔の演算

PL/SQLでは、日時式と時間隔式を作成できます。 この種の式に使用できる演算子を次のリストに示します。

オペランド1 演算子 オペランド2 結果タイプ
日時 +
時間隔 日時
日時 - 時間隔 日時
時間隔 +
日時 日時
日時 - 日時 時間隔
時間隔 +
時間隔 時間隔
時間隔 - 時間隔 時間隔
時間隔 *
数値 時間隔
数値 *
時間隔 時間隔
時間隔 /
数値 時間隔


参照:

SQLファンクションを使用して日時値の算術演算を実行する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

日付および時刻のサブタイプを使用する場合の切捨て問題の回避

日時の型のデフォルト精度は、最大精度より低い場合があります。 たとえば、DAY TO SECONDのデフォルトはDAY(2) TO SECOND(6)ですが、最大精度はDAY(9) TO SECOND(9)です。 この種の型の変数を代入し、サブプログラムのパラメータを渡す場合に切捨てを防ぐためには、次のサブタイプの変数とサブプログラムのパラメータを宣言できます。各サブタイプでは、精度に最大値が使用されます。

TIMESTAMP_UNCONSTRAINED
TIMESTAMP_TZ_UNCONSTRAINED
TIMESTAMP_LTZ_UNCONSTRAINED
YMINTERVAL_UNCONSTRAINED
DSINTERVAL_UNCONSTRAINED

事前定義のPL/SQLのラージ・オブジェクト(LOB)・データ型

ラージ・オブジェクト(LOB)・データ型は、他のデータ項目とは別に格納されている大きいオブジェクト(テキスト、図形イメージ、ビデオ・クリップ、サウンド・ウェーブ形式など)を参照します。 LOBデータ型を使用すると、データに対して、効率的でランダムなピース単位のアクセスができます。 表3-9に、事前定義のPL/SQL LOBデータ型を示します。

表3-9 事前定義のPL/SQLのラージ・オブジェクト(LOB)・データ型

データ型 説明 サイズ

BFILE

データベース外のオペレーティング・システム・ファイルに大規模なバイナリ・オブジェクトを格納するために使用されます。

システムによって異なります。 4ギガバイト(GB)以下にする必要があります。

BLOB

データベース内に大規模なバイナリ・オブジェクトを格納するために使用されます。

8から128テラバイト(TB)

CLOB

データベース内に文字データの大規模なブロックを格納するために使用されます。

8から128TB

NCLOB

データベース内にNCHARデータの大規模なブロックを格納するために使用されます。

8から128TB


LOBロケータ

外部ファイルに格納されている大きいオブジェクトを参照するために、LOBデータ型ではLOBロケータが使用されます。LOBロケータは、外部ファイルの行内部(インライン)または行外部(ライン外)のいずれかに格納されます。 外部ファイルでは、LOBロケータはBFILE型、BLOB型、CLOB型およびNCLOB型の列内に配置されます。

PL/SQLは、大きいオブジェクトに対する処理をそれぞれのオブジェクトのLOBロケータを介して行います。 たとえば、BLOB列の値を選択した場合、PL/SQLはその値のロケータのみを戻します。 トランザクション中にPL/SQLがロケータを戻した場合、そのロケータにはトランザクションIDが含まれているため、別のトランザクションでそのロケータを使用してその大きいオブジェクトを更新することはできません。 同様にあるセッション中にあるロケータを保管してから、それを別のセッションで使用することもできません。

LOBデータ型とLONGおよびLONG RAWデータ型の相違点

LOBデータ型は、LONGおよびLONG RAWデータ型とは次の点で異なっています。

相違点 LOBデータ型 LONGおよびLONG RAWデータ型
サポート 機能がリリースごとに拡張されます。 機能は変更されません。 既存のアプリケーションとの下位互換性のためにのみサポートされています。
最大サイズ 8から128TB 2GB
アクセス ランダム 順次
使用可能なオブジェクト型属性 BFILEBLOBCLOB: 使用可能
NCLOB: 使用不可
使用不可


参照:

  • LONGおよびLONG RAWデータ型

  • LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。


ここでのトピック:

BFILEデータ型

BFILEデータ型は、データベース外のオペレーティング・システム・ファイルに大規模なバイナリ・オブジェクトを格納するために使用します。 どのBFILE変数にも、サーバー上の大規模なバイナリ・ファイルを指すファイル・ロケータが格納されています。 ロケータには、フルパス名を指定するディレクトリ別名が含まれています。 論理パス名はサポートされていません。

BFILEは読取り専用です。変更はできません。 指定されたBFILEが存在し、Oracleにその読取り許可があることは、DBAによって保証されます。 基礎となるオペレーティング・システムがファイルの整合性を維持します。

BFILEはトランザクションには関与せず、リカバリ可能ではなく、レプリケートできません。 オープンするBFILEの最大数は、Oracle初期化パラメータSESSION_MAX_OPEN_FILESに設定され、システムによって異なります。

BLOBデータ型

BLOBデータ型は、データベース内の行内部または行外部に大規模なバイナリ・オブジェクトを格納するために使用します。 どのBLOB変数にも、大規模なバイナリ・オブジェクトを指すロケータが格納されます。

BLOBはトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOBによって行われた変更は、コミットまたはロールバックできます。 BLOBロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。

CLOBデータ型

CLOBデータ型は、データベース内の行内部または行外部に文字データの大規模なブロックを格納するために使用します。 固定幅と可変幅の、両方のキャラクタ・セットがサポートされています。 どのCLOB変数にも、文字データの大規模なブロックを指すロケータが格納されます。

CLOBはトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOBによって行われた変更は、コミットまたはロールバックできます。 CLOBロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。

NCLOBデータ型

NCLOBデータ型は、データベース内の行内部または行外部にNCHARデータの大規模なブロックを格納するために使用します。 固定幅と可変幅の、両方のキャラクタ・セットがサポートされています。 どのNCLOB変数にも、NCHARデータの大規模なブロックを指すロケータが格納されます。

NCLOBはトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOBによって行われた変更は、コミットまたはロールバックできます。 NCLOBロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。

ユーザー定義のPL/SQLサブタイプ

サブタイプとは、別のデータ型のサブセットのことです。その別のデータ型は、そのサブタイプのベース型と呼ばれます。 サブタイプには、そのベース型で有効な演算と同じ演算が含まれています。ただし、ベース型の有効な値のサブセットのみが含まれています。 サブタイプを使用すると、信頼性が向上し、ANSI/ISO型との互換性が保たれ、さらに定数や変数の使用意図を示すことで読みやすさが向上します。

PL/SQLでは、パッケージSTANDARDの中にいくつかのサブタイプが事前に定義されています。 たとえば、PL/SQLでは、サブタイプCHARACTERおよびINTEGERが次のようにあらかじめ定義されています。

SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);  -- allows only whole numbers

サブタイプCHARACTERは、そのベース型CHARと同じ値の集合を指定します。したがって、CHARACTERは無制約サブタイプです。 ただし、サブタイプINTEGERは、そのベース・タイプNUMBERの値のサブセットのみを指定するため、INTEGERは制約付きサブタイプです。

ここでのトピック:

サブタイプの定義

ユーザー独自のサブタイプは、次の構文を使用して、任意のPL/SQLブロック、サブプログラムまたはパッケージの宣言部で定義できます。

SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL];

ここでsubtype_nameは後続の宣言で使用される型指定子です。base_typeは任意のスカラーまたはユーザー定義のPL/SQLデータ型で、constraintは精度、およびスケールまたは最大サイズを指定できるベース型にのみ適用されます。 デフォルト値は許可されていません。例3-14を参照してください。

SQL> DECLARE
  2     SUBTYPE BirthDate IS DATE NOT NULL;         -- Based on DATE type
  3     SUBTYPE Counter IS NATURAL;                 -- Based on NATURAL subtype
  4
  5     TYPE NameList IS TABLE OF VARCHAR2(10);
  6     SUBTYPE DutyRoster IS NameList;             -- Based on TABLE type
  7
  8     TYPE TimeRec IS RECORD (minutes INTEGER, hours INTEGER);
  9     SUBTYPE FinishTime IS TimeRec;                -- Based on RECORD type
 10     SUBTYPE ID_Num IS employees.employee_id%TYPE; -- Based on column type
 11  BEGIN
 12    NULL;
 13  END;
 14  /

PL/SQL procedure successfully completed.

SQL>

%TYPEまたは%ROWTYPEを使用してベース型を指定できます。 %TYPEがデータベース列のデータ型を提供する場合、サブタイプはその列のサイズ制約(存在する場合)を継承します。 サブタイプは、例3-15に示すとおり、NOT NULL、チェック制約、デフォルト値のような他の種類の列制約は継承しません。 詳細は、「%TYPE属性の使用」および「%ROWTYPE属性の使用」を参照してください。

サブタイプの使用

サブタイプを定義すると、その型の項目を宣言できます。 サブタイプ名は、変数の使用意図を示します。 ユーザー定義のサブタイプに属する変数を宣言する場合に、そのサブタイプについて制約を設定できます。 次に例を示します。

SQL> DECLARE
  2    SUBTYPE Counter IS NATURAL;
  3    rows Counter;
  4
  5    SUBTYPE Accumulator IS NUMBER;
  6    total Accumulator(7,2);
  7  BEGIN
  8    NULL;
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL>

サブタイプを使用すると、範囲外の値を検出でき、信頼性が向上します。 例3-11では、-9から9の範囲の整数を格納するようにサブタイプpintegerを制限します。プログラムでこの範囲外の数値をpinteger変数に格納しようとすると、PL/SQLによって例外が呼び出されます。

例3-11 サブタイプを使用した範囲の使用

SQL> DECLARE
  2    v_sqlerrm VARCHAR2(64);
  3
  4    SUBTYPE pinteger IS PLS_INTEGER RANGE -9..9;
  5    y_axis pinteger;
  6
  7    PROCEDURE p (x IN pinteger) IS
  8      BEGIN
  9        DBMS_OUTPUT.PUT_LINE (x);
 10      END p;
 11
 12  BEGIN
 13    y_axis := 9;
 14    p(10);
 15
 16  EXCEPTION
 17    WHEN OTHERS THEN
 18      v_sqlerrm := SUBSTR(SQLERRM, 1, 64);
 19      DBMS_OUTPUT.PUT_LINE('Error: ' || v_sqlerrm);
 20  END;
 21  /
Error: ORA-06502: PL/SQL: numeric or value error

PL/SQL procedure successfully completed.

SQL>

ここでのトピック:

サブタイプのデータ型の互換性

無制約のサブタイプは、そのベース型と互換性があります。 例3-12では、amountの値を変換せずにtotalに代入します。

例3-12 NUMBERデータ型のデータ型の互換性

SQL> DECLARE
  2    SUBTYPE Accumulator IS NUMBER;
  3    amount  NUMBER(7,2);
  4    total   Accumulator;
  5  BEGIN
  6    amount := 10000.50;
  7    total  := amount;
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL>

異なるサブタイプでも、ベース型が同じならば互換性があります。

SQL> DECLARE
  2    SUBTYPE b1 IS BOOLEAN;
  3    SUBTYPE b2 IS BOOLEAN;
  4    finished  b1;
  5    debugging b2;
  6  BEGIN
  7    finished  := FALSE;
  8    debugging := finished;
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL>

また、異なるサブタイプの場合、ベース型が同じデータ型の系列ならば互換性があります。 たとえば、verbの値をsentenceに代入できます。

SQL> DECLARE
  2    SUBTYPE Word IS CHAR(15);
  3    SUBTYPE Text IS VARCHAR2(1500);
  4    verb     Word;
  5    sentence Text(150);
  6  BEGIN
  7    verb := 'program';
  8    sentence := verb;
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL>

サブタイプの制約およびデフォルト値

例3-13に、デフォルト値をサブタイプの変数に代入する例を示します。

例3-13 サブタイプの変数へのデフォルト値の代入

SQL> DECLARE
  2    SUBTYPE v_word IS VARCHAR2(10) NOT NULL;
  3    verb  v_word  := 'verb';
  4    noun  v_word  := 'noun';
  5  BEGIN
  6     DBMS_OUTPUT.PUT_LINE (UPPER(verb));
  7     DBMS_OUTPUT.PUT_LINE (UPPER(noun));
  8  END;
  9  /
VERB
NOUN

PL/SQL procedure successfully completed.

SQL>

例3-14では、プロシージャはNOT NULL制約を適用しますが、サイズ制約は適用しません。

例3-14 サブプログラムによるサブタイプ制約の継承

SQL> DECLARE
  2    SUBTYPE v_word IS VARCHAR2(10) NOT NULL;
  3    verb    v_word       := 'run';
  4    noun    VARCHAR2(10) := NULL;
  5
  6    PROCEDURE word_to_upper (w IN v_word) IS
  7    BEGIN
  8      DBMS_OUTPUT.PUT_LINE (UPPER(w));
  9    END word_to_upper;
 10
 11  BEGIN
 12    word_to_upper('more than ten characters');
 13    word_to_upper(noun);
 14  END;
 15  /
MORE THAN TEN CHARACTERS
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 13

SQL>

サブタイプは、例3-15に示すとおり、列制約NOT NULLまたはCHECKは継承しませんが、列サイズ制約は継承します。

例3-15 サブタイプによる列制約の継承

SQL> CREATE TABLE employees_temp (
  2    empid NUMBER(6) NOT NULL PRIMARY KEY,
  3    deptid NUMBER(6) CONSTRAINT c_employees_temp_deptid
  4      CHECK (deptid BETWEEN 100 AND 200),
  5    deptname VARCHAR2(30) DEFAULT 'Sales'
  6  );

Table created.

SQL>
SQL> DECLARE
  2     SUBTYPE v_empid_subtype    IS employees_temp.empid%TYPE;
  3     SUBTYPE v_deptid_subtype   IS employees_temp.deptid%TYPE;
  4     SUBTYPE v_deptname_subtype IS employees_temp.deptname%TYPE;
  5     SUBTYPE v_emprec_subtype   IS employees_temp%ROWTYPE;
  6
  7     v_empid    v_empid_subtype;
  8     v_deptid   v_deptid_subtype;
  9     v_deptname v_deptname_subtype;
 10     v_emprec   v_emprec_subtype;
 11  BEGIN
 12    v_empid  := NULL;         -- NULL constraint not inherited
 13    v_deptid := 50;           -- CHECK constraint not inherited
 14
 15    v_emprec.empid  := NULL;  -- NULL constraint not inherited
 16    v_emprec.deptid := 50;    -- CHECK constraint not inherited
 17
 18    DBMS_OUTPUT.PUT_LINE
 19      ('v_deptname: ' || v_deptname);  -- Default value not inherited
 20
 21    DBMS_OUTPUT.PUT_LINE
 22      ('v_emprec.deptname: ' || v_emprec.deptname);
 23        -- Default value not inherited
 24    v_empid := 10000002;  -- NUMBER(6) constraint inherited
 25  END;
 26  /
v_deptname:
v_emprec.deptname:
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 24

SQL>

PL/SQLのデータ型変換

あるデータ型の値を別のデータ型に変換することが必要な場合があります。 たとえばDATE変数をレポートで使用するには、これを文字列に変換する必要があります。 PL/SQLでは、明示的な変換と暗黙的な変換がサポートされています。

信頼性とメンテナンス性を高めるために、明示的な変換を使用してください。 暗黙的変換は状況依存であるため、結果を常に予測できるとはかぎりません。また、将来のソフトウェア・リリースでこの変換の規則が変更される可能性があります。 さらに、暗黙的変換は、明示的な変換より低速となる可能性もあります。

ここでのトピック:

明示的な変換

値のデータ型を別のデータ型に明示的に変換するには、組込みファンクションを使用します。組込みファンクションについては、『Oracle Database SQL言語リファレンス』を参照してください。 たとえば、CHAR値をDATE値またはNUMBER値に変換するには、それぞれTO_DATEファンクションまたはTO_NUMBERファンクションを使用します。 逆に、DATE値またはNUMBER値をCHAR値に変換するには、TO_CHARファンクションを使用します。

明示的な変換を行うと、エラーまたは予期しない結果の発生を回避できます。 次に例を示します。

  • 連結演算子(||)を使用して文字列と算術式を連結すると、エラーが発生する可能性があります。このエラーは、連結する前に、TO_CHARファンクションを使用して算術式を文字列に変換することによって回避できます。

  • DATE値の形式に関してデータベースでの言語設定に依存すると、予期しない結果が発生する可能性があります。これは、TO_CHARファンクションを使用し、必要な形式を指定することによって回避できます。

暗黙的な変換

PL/SQLによって、あるデータ型の値が別のデータ型に自動的に変換される場合があります。 これは暗黙的変換と呼ばれ、これらのデータ型は互換性があるといわれます。 2つのデータ型に互換性がある場合は、一方の型の値が期待されている場所で、もう一方の型の値を使用できます。 たとえば、通常は文字列を受け取るサブプログラムに数値リテラルを渡すことができます。サブプログラムは、数値の文字列表現を受け取ります。

例3-16では、CHAR型変数であるstart_timefinish_timeに、午前0時からの秒数を表す文字列値が格納されています。 PL/SQLはCHAR値をNUMBER値に自動的に変換するため、これらの値の差をNUMBER型変数のelapsed_timeに代入できます。

例3-16 暗黙的な変換

SQL> DECLARE
  2    start_time   CHAR(5);
  3    finish_time  CHAR(5);
  4    elapsed_time NUMBER(5);
  5  BEGIN
  6     -- Get system time as seconds past midnight:
  7
  8     SELECT TO_CHAR(SYSDATE,'SSSSS') INTO start_time FROM sys.DUAL;
  9
 10     -- Processing done here
 11
 12     -- Get system time again:
 13
 14     SELECT TO_CHAR(SYSDATE,'SSSSS') INTO finish_time FROM sys.DUAL;
 15
 16     -- Compute and report elapsed time in seconds:
 17
 18     elapsed_time := finish_time - start_time;
 19     DBMS_OUTPUT.PUT_LINE ('Elapsed time: ' || TO_CHAR(elapsed_time));
 20  END;
 21  /
Elapsed time: 0

PL/SQL procedure successfully completed.

SQL>

あるデータ型の列から値を選択し、その値を別のデータ型の変数に代入すると、PL/SQLはその値をその変数のデータ型に変換します。 DATE列の値を選択してVARCHAR2変数に入れる場合がこれに該当します。

あるデータ型の変数の値を別のデータ型の列に代入すると、PL/SQLはその変数の値をその列のデータ型に変換します。

PL/SQLでは、どのような暗黙的変換が必要なのかが決定できない場合、コンパイル・エラーが発生します。 このような場合は、明示的な変換を使用する必要があります。

表3-10に、PL/SQLで実行できる暗黙的な変換を示します。ただし、次の点に注意してください。

  • 表3-10は、異なる表現を持つデータ型のみを示しています。

    PLS_INTEGERBINARY_INTEGERCLOBNCLOBCHARNCHARVARCHARNVARCHAR2などの同じ表現を持つ型は、相互に代用できます。

  • 特定の値が実際に変換可能であるかどうかは、ユーザーが自分で確認する必要があります。

    たとえば、PL/SQLはCHAR値である'02-JUN-92'DATE値に変換できますが、CHAR値である'YESTERDAY'DATE値に変換できません。 同様に、英字を含んでいるVARCHAR2型の値はNUMBER値に変換できません。

  • 日付データ型、時刻データ型および時間隔データ型に関して

    • DATEデータ型の変換規則は、日時のデータ型にも適用されます。 ただし、これらの型は内部表現が異なるため、常に相互に変換できるとはかぎりません。 日時のデータ型間の暗黙的な変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

    • DATE値をCHAR値またはVARCHAR2値に暗黙的に変換するために、PL/SQLは、文字列をデフォルトの日付書式で戻すファンクションTO_CHARを起動します。 時刻やユリウス日付などの情報を得るには、書式マスクを明示的に使用してTO_CHARを起動します。

    • CHAR値またはVARCHAR2値をDATE列に挿入すると、PL/SQLは、パラメータがデフォルトの日付書式になっていることを期待するファンクションTO_DATEを起動することによって、CHAR値またはVARCHAR2値をDATE値に暗黙的に変換します。 他の書式の日付を挿入するには、書式マスクを明示的に使用してTO_DATEを起動します。

  • LOBデータ型に関して

    • CLOB値とNCLOB値間の変換には、コストがかかる可能性があります。 この変換を意図的に実行するには、明示的な変換ファンクションTO_CLOBおよびTO_NCLOBを使用します。

    • CLOB値とCHARおよびVARCHAR2値間、BLOB値とRAW値間での暗黙的な変換によって、ほとんどのSQLおよびPL/SQLの文およびファンクションでLOBデータ型を使用できます。 ただし、LOB値に対して読取り、書込みおよびピース単位の操作を行うには、DBMS_LOBパッケージ・サブプログラムを使用する必要があります。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

  • RAWおよびLONG RAWデータ型に関して

    • LONG RAWは、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。

    • RAW型またはLONG RAW型の列の値を選択してCHAR型変数またはVARCHAR2型変数に入れる場合、PL/SQLは内部バイナリ値を文字値に変換する必要があります。 PL/SQLは、RAW型データまたはLONG RAW型データの各バイナリ・バイトを文字のペアとして戻すことによってこれを実行します。 個々の文字はニブル(半バイト)の16進値を表します。 たとえば、PL/SQLはバイナリ・バイト11111111を文字のペア'FF'として戻します。 ファンクションRAWTOHEXも同じ変換を実行します。

    • CHAR型またはVARCHAR2型の値をRAW型またはLONG RAW型の列に挿入する場合にも変換が必要です。 変数内の文字のペアは、いずれもバイナリ・バイトの16進値を表している必要があります。そうでない場合は、PL/SQLによって例外が呼び出されます。

    • SQL文内にLONG値がある場合、PL/SQLはLONG値をVARCHAR2値としてバインドします。 ただし、バインドされたVARCHAR2の長さがVARCHAR2列の最大幅(4000バイト)を超える場合は、バインド型がLONGに自動的に変換され、エラー・メッセージが発行されます。これは、SQLファンクションにはLONG値を渡すことができないためです。

表3-10 実行可能なPL/SQLの暗黙的なデータ型変換

変換前 変換後









BLOB

CHAR

CLOB

DATE

LONG

NUMBER

PLS_INTEGER

RAW

UROWID

VARCHAR2

BLOB








実行可能



CHAR



実行可能

実行可能

実行可能

実行可能

実行可能

実行可能

実行可能

実行可能

CLOB


実行可能








実行可能

DATE


実行可能



実行可能





実行可能

LONG


実行可能






実行可能


実行可能

NUMBER


実行可能



実行可能


実行可能



実行可能

PLS_INTEGER


実行可能



実行可能

実行可能




実行可能

RAW

実行可能

実行可能



実行可能





実行可能

UROWID


実行可能








実行可能

VARCHAR2


実行可能

実行可能

実行可能

実行可能

実行可能

実行可能

実行可能

実行可能