ヘッダーをスキップ
Oracle TimesTen In-Memory Database PL/SQL開発者ガイド
リリース11.2.1
B56057-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 TimesTenでのPL/SQLのデータ型

この章では、PL/SQL、TimesTen SQLおよびアプリケーション・プログラムでのデータの操作に使用可能なデータ型の範囲について説明します。

Oracle TimesTen In-Memory Databaseでは、PL/SQLデータ型と、PL/SQL、TimesTenおよびクライアント・アプリケーション・プログラムの各データ型間の相互作用がサポートされています。 また、データ型の変換およびデータ型のマッピングがサポートされています。

TimesTen固有の考慮事項の詳細は、章の最後を参照してください。

この章の内容は次のとおりです。

データ型環境の理解

データ型について説明する場合、次のような3つの異なる環境を考慮する必要があります。

表3-1に、環境の概要および各環境のデータ型の例を示します。

表3-1 データ型環境の概要

環境 データ型の例

PL/SQLプログラム

NUMBER、PLS_INTEGER、VARCHAR2、STRING、DATE、TIMESTAMP

TimesTen SQL文

TT_BIGINT、TT_INTEGER、BINARY_FLOAT、VARCHAR2、DATE、TIMESTAMP

アプリケーション・プログラム

int、float、String


PL/SQLのデータ型の理解および使用

ここでは、PL/SQLプログラムでサポートされているPL/SQLデータ型について説明します。 TimesTen SQL文でサポートされているデータ型の説明ではありません。 TimesTen SQL文でサポートされているデータ型の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のデータ型に関する説明を参照してください。

この項の内容は次のとおりです。

詳細は、『Oracle Database PL/SQL言語リファレンス』のPL/SQLデータ型に関する説明を参照してください。

PL/SQLのデータ型のカテゴリ

PL/SQLブロック、各定数、変数およびパラメータには、データ型があります。 PL/SQLには、事前定義されたデータ型およびサブタイプがあります。また、ユーザー独自のPL/SQLサブタイプを定義することもできます。

表3-2に、事前定義されたPL/SQLデータ型のカテゴリを示します。

表3-2 事前定義されたPL/SQLデータ型のカテゴリ

データ型のカテゴリ 説明

スカラー

内部コンポーネントを持たない単一値。

複合

スカラーまたは複合のいずれかである内部コンポーネント。

参照

REF CURSORなどの他のデータ項目へのポインタ。



注意:

「サポートされていないデータ型」を参照してください。

事前定義されたPL/SQLのスカラー・データ型

スカラー・データ型には、内部コンポーネントを持たない単一値が格納されます。 表3-3に、事前定義されたPL/SQLの重要なスカラー・データ型をデータ型ファミリごとに分類して示します。

表3-3 事前定義されたPL/SQLのスカラー・データ型

データ型ファミリ データ型名

NUMERIC

NUMBER

PLS_INTEGER

BINARY_FLOAT

BINARY_DOUBLE

CHARACTER

CHAR[ACTER]

VARCHAR2

NCHAR

NVARCHAR2

BINARY

RAW

BOOLEAN

BOOLEAN

注意: SQL文でBOOLEAN型をバインドすることはできません。

DATETIME

DATE

TIMESTAMP

INTERVAL

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECONDS

ROWID

ROWID



注意:

「サポートされていないデータ型」を参照してください。

例3-1 PL/SQL変数の宣言

Command> DECLARE
       >    v_emp_job     VARCHAR2 (9);
       >    v_count_loop  BINARY_INTEGER := 0;
       >    v_dept_total_sal NUMBER (9,2) := 0;
       >    v_orderdate   DATE := SYSDATE + 7;
       >    v_valid       BOOLEAN NOT NULL := TRUE;
       > ...

PLS_INTEGERデータ型およびBINARY_INTEGERデータ型

PLS_INTEGERデータ型およびBINARY_INTEGERデータ型は同一のものであり、このマニュアルでは同じ意味で使用されています。

PLS_INTEGERデータ型には、32ビットで表される-2,147,483,648から2,147,483,647の範囲の符号付き整数が格納されます。 このデータ型には、NUMBERデータ型およびそのサブタイプと比較して次のようなメリットがあります。

  • PLS_INTEGER値の方が必要な記憶域が少なくて済みます。

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

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

詳細は、『Oracle Database PL/SQL言語リファレンス』のPLS_INTEGERデータ型およびBINARY_INTEGERデータ型に関する説明を参照してください。


注意:

2つのPLS_INTEGERデータ型による計算がPLS_INTEGERの範囲をオーバーフローすると、結果がNUMBERデータ型に割り当てられている場合でも、オーバーフロー例外が発生します。

SIMPLE_INTEGERデータ型

SIMPLE_INTEGERは、PLS_INTEGERデータ型の事前定義されたサブタイプであり、PLS_INTEGERと同じ範囲(-2,147,483,648から2,147,483,647)とNOT NULL制約を持ちます。 PLS_INTEGERと異なるのは、オーバーフローが発生しないという点です。

値がNULLになることはなく、オーバーフロー・チェックが不要な場合に、SIMPLE_INTEGERを使用できます。 NULL値およびオーバーフローをチェックするオーバーヘッドがないため、SIMPLE_INTEGERはPLS_INTEGERよりも高いパフォーマンスを実現します。

詳細は、『Oracle Database PL/SQL言語リファレンス』のPLS_INTEGERのSIMPLE_INTEGERサブタイプに関する説明を参照してください。

ROWIDデータ型

TimesTenデータベース表の各行は、ROWIDと呼ばれる一意の識別子を持っています。

たとえばWHERE句にある一重引用符で囲んだCHAR定数のように、SQL文にリテラルROWID値を指定できます。

使用方法および存続期間など、ROWIDおよびROWIDデータ型について、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のROWIDデータ型およびROWID仕様に関する説明も参照してください。


注意:

「サポートされていないデータ型」を参照してください。

PL/SQLの複合データ型

複合型には、配列、レコードまたは表の要素などの、個別に操作できる内部コンポーネントがあります。

Oracle TimesTen In-Memoryでは、複合データ型がサポートされています。

  • 連想配列(索引付き表)

  • ネストした表

  • VARRAY

  • レコード

連想配列、ネストした表およびVARRAYは、コレクションとも呼ばれます。


注意:

TimesTen PL/SQLではこれらの型がサポートされていますが、PL/SQLと他の言語で作成されたアプリケーションの間でこれらの型を渡すことはできません。

コレクションの使用

コレクション・データ型は、他の言語で使用される配列、セットおよびハッシュ表と同じように宣言できます。 コレクションとは、要素(すべて同じ型)の順序付きグループのことです。 各要素には、コレクション内での位置を決定する一意の添字があります。

PL/SQLでは、配列型はVARRAY(可変サイズ配列)と呼ばれ、セット型はネストした表と呼ばれ、ハッシュ表型は連想配列または索引付き表と呼ばれます。 これらはすべてコレクション型です。

例3-2 PL/SQLのコレクション型の使用

この例では、コレクション型staff_listemployee_idの表として宣言し、コレクション型をループおよびSELECT文のWHERE句で使用します。

Command> DECLARE
       >   TYPE staff_list IS TABLE OF employees.employee_id%TYPE;
       >   staff staff_list;
       >   lname employees.last_name%TYPE;
       >   fname employees.first_name%TYPE;
       > BEGIN
       >   staff := staff_list(100, 114, 115, 120, 122);
       >   FOR i IN staff.FIRST..staff.LAST LOOP
       >     SELECT last_name, first_name INTO lname, fname FROM employees
       >       WHERE employees.employee_id = staff(i);
       >     DBMS_OUTPUT.PUT_LINE (TO_CHAR(staff(i)) ||
       >       ': ' || lname || ', ' || fname );
       >     END LOOP;
       > END;
       > /
100: King, Steven
114: Raphaely, Den
115: Khoo, Alexander
120: Weiss, Matthew
122: Kaufling, Payam

PL/SQL procedure successfully completed.

コレクションは、PL/SQLサブプログラム間でパラメータとして渡すことはできますが、他の言語で作成されたアプリケーションに返すことはできません。

バルクSQLを使用すると、コレクションによってTimesTen表からデータを出し入れできます。

レコードの使用

レコードとは、様々なデータ型のフィールドを持つ複合データ構造のことです。 レコードは、単一のパラメータでサブプログラムに渡すことができます (例2-2に示すように、%ROWTYPE属性を使用すると、フィールドの名前および型を指定することなく、表内の行または問合せ結果セットの行を表すレコードを宣言することもできます)。

例3-3 レコード型の宣言

様々なレコード型を宣言します。

Command> DECLARE
       >   TYPE timerec IS RECORD (hours SMALLINT, minutes SMALLINT);
       >   TYPE meetin_typ IS RECORD (
       >   date_held DATE,
       >   duration timerec, -- nested record
       >   location VARCHAR2(20),
       >   purpose VARCHAR2(50));
       > BEGIN
       > -- NULL does nothing but allows unit to be compiled and tested
       >   NULL;
       > END;
       > /

PL/SQL procedure successfully completed.

PL/SQL REF CURSOR

REF CURSORは、PL/SQLからアプリケーションにパラメータとして渡すことのできる、SQL結果セットに対するカーソルへのハンドルです。 Oracle TimesTen In-Memory Databaseでは、OUT REF CURSORがサポートされています。 REF CURSORをPL/SQLからPL/SQLに渡すこともできます。

したがって、REF CURSORを次のように渡すことができます。

  • PL/SQLからPL/SQLへ: REF CURSORを1つのプロシージャまたはファンクションから別のプロシージャまたはファンクションに任意のモード(IN、OUTまたはIN OUT)で渡します。

  • PL/SQLからクライアントAPI(ODBCなど)へ: OUTパラメータを使用して、REF CURSORをPL/SQLからアプリケーションに渡します。

アプリケーションでは、PL/SQL内でREF CURSORをオープンし、アプリケーションが結果セットをフェッチできるように、アプリケーションにREF CURSORを返します。

Oracle TimesTen In-Memory Databaseでは、ダイレクト・モードまたはクライアント/サーバー環境での、ODBC、JDBC、OCI、Pro*CおよびTTClassesのREF CURSORがサポートされています。 REF CURSORについては、これらのプログラミング・インタフェースのマニュアルでも説明されています。


注意:

Oracle TimesTen In-Memory Databaseでは、文ごとに1つのOUT REF CURSORがサポートされています。

REF CURSORを定義するには、Oracleの場合と同様の手順を実行します。 最初にREF CURSOR型を定義し、次にその型のカーソル変数を宣言します。次に例を示します。

Command> DECLARE
       >   TYPE DeptCurTyp IS REF CURSOR RETURN departments%ROWTYPE;
       >   dept_cv  DeptCurTyp; -- declare cursor variable
       > ...

カーソル変数をファンクションおよびプロシージャの仮パラメータとして宣言するには、次のようにします。

Command> DECLARE
       >   TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
       >   PROCEDURE open_emp_cv (emp_cv OUT EmpCurTyp) IS ...

例3-4 動的な複数行問合せの結果セットからの行のフェッチ

この例では、REF CURSORとしてEmpCurTypeを定義し、型EmpCurTypeのカーソル変数emp_cvを宣言します。 PL/SQLブロックの実行可能セクションで、OPEN...FOR文により、カーソル変数emp_cvを複数行問合せsql_stmtに関連付けます。 FETCH文により、複数行問合せの結果セットから行が返され、選択リスト項目の値がINTO句のemp_recに割り当てられます。 最後の行が処理されると、カーソル変数がクローズされます。

Command> DECLARE
       >   TYPE EmpCurTyp IS REF CURSOR;
       >   emp_cv   EmpCurTyp;
       >   emp_rec  employees%ROWTYPE;
       >   sql_stmt  VARCHAR2 (200);
       >   my_job VARCHAR2 (10) := 'ST_CLERK';
       > BEGIN
       >   sql_stmt := 'SELECT * FROM employees WHERE job_id = :j';
       >   OPEN  emp_cv FOR sql_stmt USING my_job;
       >   LOOP
       >     FETCH emp_cv INTO emp_rec;
       >     EXIT WHEN emp_cv%NOTFOUND;
       >     DBMS_OUTPUT.PUT_LINE (emp_rec.employee_id);
       >   END LOOP;
       >   CLOSE emp_cv;
       > END;
       > /
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

PL/SQL procedure successfully completed.

データ型の変換

ここでは、次のデータ型の変換について説明します。

「TimesTenにおける相違点: データ型に関する考慮事項」のデータ型の変換に関する情報も参照してください。

PL/SQLのデータ型間の変換

Oracle TimesTen In-Memory Databaseでは、PL/SQLのデータ型間での暗黙的および明示的な変換がサポートされています。

型がVARCHAR2の変数v_sal_hikeの例について検討します。 給与の合計を計算する場合、PL/SQLでは最初にv_sal_hikeがNUMBERに変換されてから、操作が実行されます。 結果の型はNUMBERになります。 正しい結果を取得するために、PL/SQLでは暗黙的変換が使用されます。

Command> DECLARE
       >   v_salary NUMBER (6) := 6000;
       >   v_sal_hike VARCHAR2(5) := '1000';
       >   v_total_salary v_salary%TYPE;
       > BEGIN
       > v_total_salary := v_salary + v_sal_hike;
       > DBMS_OUTPUT.PUT_LINE (v_total_salary);
       > end;
       > /
7000

PL/SQL procedure successfully completed.

アプリケーションのデータ型とPL/SQLまたはSQLのデータ型との間の変換

Oracle TimesTen In-Memory Databaseでは、アプリケーション・プログラムのデータ型とPL/SQLのデータ型の変換、およびアプリケーション・プログラムのデータ型とTimesTen SQLのデータ型の変換がサポートされています。 SQLでは、SQLがPL/SQLプログラムによって起動されたか、アプリケーションによって直接起動されたかに関係なく、同じ変換が行われます。

表3-4に、ODBC APIを使用するアプリケーションからPL/SQLプログラムのデータ型へのデータ型マッピングを例として示します。 ODBCからPL/SQLへの型マッピングの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のODBCからSQLまたはPL/SQLへの型マッピングに関する説明を参照してください。

表3-4 ODBC SQLからPL/SQLへの型マッピングの例

ODBC型 PL/SQL型

SQL_BINARY

RAW(バインド済精度を使用)

SQL_CHAR

CHAR(バインド済精度を使用)

SQL_DATE

DATE

SQL_DECIMAL

NUMBER

SQL_DOUBLE

NUMBER

SQL_FLOAT

BINARY_DOUBLE

SQL_INTEGER

PLS_INTEGER

SQL_NUMERIC

NUMBER

SQL_REAL

BINARY_FLOAT

SQL_REFCURSOR

REF CURSOR

SQL_TIMESTAMP

TIMESTAMP(バインド済スケールを使用)

SQL_VARCHAR

VARCHAR2(バインド済精度を使用)


例3-5 ODBCからPL/SQLへのデータ型の変換

CプログラムでODBC APIを使用しており、型VARCHAR2のC変数を型NUMBERのPL/SQL変数にバインドする場合を検討します。 Oracle TimesTen In-Memory Databaseでは、暗黙的な変換が自動的に実行されます。

Command> VARIABLE c_var VARCHAR2 (30) := '961';
Command> DECLARE v_var NUMBER;
       > BEGIN
       >   v_var := :c_var;
       > DBMS_OUTPUT.PUT_LINE (v_var);
       > END;
       > /
961

PL/SQL procedure successfully completed.

例3-6 ODBCからTimesTen SQLへのデータ型の変換

この例では、型TT_BIGINTの列を持つ表を作成し、PL/SQLを使用してTimesTen SQL INSERT文を起動します。 型SQL_VARCHARのバインド変数がINSERT文で使用されます。 アプリケーションでINSERT文を直接起動する場合と同様の変換が行われます。

Command> CREATE TABLE conversion_test2 (Col1 TT_BIGINT);
Command>  VARIABLE v_var VARCHAR2 (100) := '1000';
Command>  BEGIN
       >   INSERT INTO conversion_test2 VALUES (:v_var);
       >  END;
       >  /

PL/SQL procedure successfully completed.


Command> SELECT * FROM conversion_test2;
< 1000 >
1 row found.

TimesTenにおける相違点: データ型に関する考慮事項

ここでは、データ型のサポートおよび型変換に関する、次のようなTimesTenに固有の考慮事項について説明します。

PL/SQLのデータ型とTimesTen SQLのデータ型との間の変換

Oracle TimesTen In-Memory Databaseでは、PL/SQLのデータ型とTimesTen SQLのデータ型との間の変換がサポートされています。

表3-5に、サポートされているデータ型の変換を示します(上の1行がPL/SQLの型を表し、左の1列がSQLの型を表します)。 データ型はデータ型ファミリごとに分類されており、列がPL/SQLの型ファミリを表し、行がTimesTenの型ファミリを表します。 Yは該当の2つのファミリ間で変換が可能であることを示します。 サポートされている変換は双方向です。

表3-5 PL/SQLのデータ型とTimesTen SQLのデータ型との間でサポートされている変換

型ファミリ NUMERIC CHARACTER BINARY DATETIME INTERVAL ROWID

NUMERIC

          Y

             Y





CHARACTER

          Y

             Y

      Y

          Y

          Y

       Y

DATETIME


             Y


           Y



TIME


             Y





ROWID


             Y




         Y

BINARY


             Y

      Y



         Y


表3-6に、TimesTenのデータ型の概要、およびPL/SQLの型マッピングに関する推奨事項を示します。

表3-6 データ型の使用方法およびサイズ

TimesTenデータ型 説明

TT_TINYINT

0から255までの範囲の符号なし整数。

型PL/SQL NUMBERまたはPL/SQL PLS_INTEGER(またはBINARY_INTEGER)の値をTT_TINYINT列に挿入する場合、数値オーバーフローが発生する可能性があります。

TT_SMALLINT

-32,768から32,767の範囲の16ビットの符号付き整数。

型PL/SQL NUMBERまたはPL/SQL PLS_INTEGER(またはBINARY_INTEGER)の値をTT_SMALLINT列に挿入する場合、数値オーバーフローが発生する可能性があります。

TT_INTEGER

-2,147,483,648から2,147,483,647の範囲の符号付き整数。

PLS_INTEGERと同じです。

TT_BIGINT

-9,223,372,036,854,775,808から9,223,372,036,854,775,807の範囲の8バイトの符号付き整数。

PL/SQL NUMBERを使用します。 PL/SQL PLS_INTEGER(またはBINARY_INTEGER)変数はオーバーフローする可能性があります。

NUMBER、BINARY_FLOAT、BINARY_DOUBLE

浮動小数点の精度が必要な場合に使用します。

キャラクタ・タイプ

すべてのPL/SQLキャラクタ・タイプに、32,767バイトまでのデータを格納できます。

TimesTenのCHARには、8300バイトまでのデータを格納できます。

TimesTenのNCHARには、4150文字(8300バイト)までのデータを格納できます。

TimesTenのVARCHAR2には、4,194,304バイトまでのデータを格納できます。

TimesTenのNVARCHAR2には、2,097,152文字(4,194,304バイト)までのデータを格納できます。

日時、時間隔および時間の型

これらの型をキャラクタ・タイプ間で変換するときに使用されるデフォルトの書式とは異なる書式が必要な場合は、組込みファンクションTO_CHARおよびTO_DATEを使用します。

バイナリ型

TimesTenのBINARYには、8300バイトまでのデータを格納できます。

TimesTenのVARBINARYには、4,194,304バイトまでのデータを格納できます。

RAWおよびLONG RAWには、32,767バイトまでのデータを格納できます。



注意:

「サポートされていないデータ型」を参照してください。

例3-7 TimesTen SQLのデータ型とPL/SQLのデータ型との間の変換

2つの列を持つ表がある場合を検討します。 Col1のデータ型はTT_INTEGERであり、Col2のデータ型はNUMBERです。 PL/SQLプログラムで、型PLS_INTEGERのv_var1および型VARCHAR2のv_var2という2つの変数を宣言します。 SELECTによって表のデータ行を2つのPL/SQL変数に格納します。

SELECT文を実行すると、データ型の変換が行われます。 Col1は、TimesTenのSQL TT_INTEGER型からPLS_INTEGER型に変換されます。 Col2は、TimesTenのSQL NUMBER型からPL/SQL VARCHAR2型に変換されます。 問合せが正しく実行されます。

Command> CREATE TABLE test_conversion (Col1 TT_INTEGER, Col2 NUMBER);
Command> INSERT INTO test_conversion VALUES (100, 20);
1 row inserted.

Command>  DECLARE
       >   v_var1 PLS_INTEGER;
       >   v_var2 VARCHAR2 (100);
       >  BEGIN
       >   SELECT Col1, Col2 INTO v_var1, v_var2 FROM test_conversion;
       >  DBMS_OUTPUT.PUT_LINE (v_var1);
       >  DBMS_OUTPUT.PUT_LINE (v_var2);
       > END;
       > /
100
20

PL/SQL procedure successfully completed.

日付書式およびタイムスタンプ書式: NLS_DATE_FORMATおよびNLS_TIMESTAMP_FORMAT

TimesTenでは、ユーザー指定のNLS_DATE_FORMAT設定およびNLS_TIMESTAMP_FORMAT設定はサポートされていません。 TimesTenでは、次のように指定されています。

  • NLS_DATE_FORMATは常にyyyy-mm-ddです。

  • NLS_TIMESTAMP_FORMATは常にyyyy-mm-dd hh:mi:ss.ff6(秒を示す小数点以下桁数が6桁まで)です。

SQLおよびPL/SQLのTO_DATEファンクションおよびTO_CHARファンクションを使用すると、希望する他の書式を指定できます。 これらのファンクションの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』の式に関する説明を参照してください。

サポートされていないデータ型

次のデータ型は、サポートされていません。

  • PL/SQLデータ型カテゴリ: TimesTenのPL/SQLでは、ラージ・オブジェクト(LOB)、インターネット・データ型(XMLTypeURITypeHttpURIType)またはAnyデータ型(AnyTypeAnyDataAnyDataSet)はサポートされていません。

  • PL/SQLスカラー・データ型: TimesTenでは、PL/SQLデータ型TIMESTAMP WITH [LOCAL] TIME ZONEおよびUROWIDはサポートされていません。

  • TimesTenのPL/SQLでは、TimesTen型TT_DECIMALはサポートされていません。