Oracle® TimesTen In-Memory Database

PL/SQL開発者ガイド

11gリリース2(11.2.2)

B66723-04(原本部品番号:E21639-07)

2014年10月

Oracle TimesTen In-Memory Database PL/SQL開発者ガイド, 11g リリース2(11.2.2)

B66723-04

Copyright © 1996, 2014, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- 関連ドキュメント

- 表記規則

- ドキュメントのアクセシビリティについて

新機能

- リリース11.2.2.0.0の新機能

1 TimesTenデータベースにおけるPL/SQLの概要

- TimesTenにおけるPL/SQLの機能

- TimesTenのPL/SQLのコンポーネントと操作

- アプリケーションとTimesTenおよびPL/SQLの対話

- TimesTenでのPL/SQLとOracle DatabaseでのPL/SQL

- PL/SQLブロック内のSQL文

- SQLからのPL/SQLの実行

- このドキュメントの対象読者

- Oracle DatabaseおよびOracle Database PL/SQLでの経験がある開発者

- TimesTenでの経験がある開発者

- TimesTen PL/SQLデモについて

2 TimesTenにおけるPL/SQLのプログラミング機能

- PL/SQLブロック

- PL/SQLの変数および定数

- PL/SQLからのSQLファンクション・コール

- PL/SQL制御構造

- 条件制御

- 反復制御

- CONTINUE文

- PL/SQLのプロシージャおよびファンクションを実行する方法

- アプリケーションとPL/SQLとの間でデータを受け渡す方法

- アプリケーションのバインド変数の使用

- IN、OUTおよびIN OUTパラメータ・モード

- PL/SQLプログラムでのSQLの使用

- 問合せおよびDML文に使用するPL/SQLの静的SQL

- PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)

- FORALL操作およびBULK COLLECT操作

- RETURNING INTO句

- TimesTen Cacheを使用したTimesTen PL/SQL

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

- LOBについて

- LOBロケータ

- 一時LOB

- TimesTenにおけるLOBとOracle DatabaseにおけるLOBの相違点

- LOBの使用

- LOBのPL/SQLパッケージ・サポート

- パススルーLOB

- PL/SQLプログラムでのカーソルの使用

- PL/SQLのプロシージャおよびファンクション

- プロシージャおよびファンクションの作成と使用

- プロシージャおよびファンクションのシノニムの使用

- PL/SQLパッケージ

- パッケージの概念

- パッケージの作成および使用

- パッケージのシノニムの使用

- PL/SQLのソース・コードのラップ

- TimesTenにおける相違点: トランザクション動作

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

- データ型環境の理解

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

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

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

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

- SIMPLE_INTEGERデータ型

- ROWIDデータ型

- LOBデータ型

- PL/SQLの複合データ型

- PL/SQLでのコレクションの使用

- PL/SQLでのレコードの使用

- アプリケーションからの連想配列の使用

- PL/SQL REF CURSOR

- データ型の変換

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

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

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

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

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

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

- TimesTen型モードでの長さゼロの文字列

4 エラーと例外の処理

- 例外の理解

- 例外について

- 例外のタイプ

- 例外のトラップ

- 事前定義のTimesTenエラーのトラップ

- ユーザー定義例外のトラップ

- RAISE文の使用

- RAISE_APPLICATION_ERRORプロシージャの使用

- ttIsqlでのエラーの表示

- TimesTenにおける相違点: 例外処理およびエラー動作

- 未処理例外に対するTimesTen PL/SQLのトランザクションおよびロールバック動作

- TimesTenエラー・メッセージおよびSQLコード

- PL/SQLで表示されない警告

- サポートされていない事前定義エラー

- クリーン・コンパイル後の実行時エラーの可能性(Oracle Database SQLパーサーを使用)

- 実行時のTimesTen式の使用

5 PL/SQLでのTimesTen SQLの使用例

- PL/SQLでSELECT...INTO文を使用する例

- SELECT... INTOを使用した給与合計の取得

- SELECT...INTOを使用した他のユーザーの表への問合せ

- INSERT文を使用する例

- 入力パラメータ、出力パラメータおよびバインド変数を使用する例

- INおよびOUTパラメータ

- IN OUTパラメータの使用

- 連想配列の使用

- カーソルを使用する例

- 値のフェッチ

- %ROWCOUNT属性および%NOTFOUND属性の使用

- カーソルFORループの使用

- FORALLおよびBULK COLLECTを使用する例

- SQL%BULK_ROWCOUNTでのFORALLの使用

- 問合せでのBULK COLLECT INTOの使用

- カーソルでのBULK COLLECT INTOの使用

- BULK COLLECTでのSAVE EXCEPTIONSの使用

- EXECUTE IMMEDIATEを使用する例

- EXECUTE IMMEDIATEを使用した表の作成

- 単一行問合せでのEXECUTE IMMEDIATEの使用

- EXECUTE IMMEDIATEを使用した接続属性の変更

- EXECUTE IMMEDIATEを使用したTimesTen組込みプロシージャのコール

- TimesTen固有の構文を持つEXECUTE IMMEDIATEの使用

- RETURNING INTOを使用する例

- レコードでのRETURNING INTO句の使用

- RETURNING INTO句でのBULK COLLECT INTOの使用

- AUTHID句を使用する例

- AUTHIDのスクリプトの例

- AUTHID CURRENT_USERの使用

- AUTHID DEFINERの使用

- システム・ビューを問い合せる例

6 PL/SQLのインストールおよび環境

- PL/SQLがインストール済であること、およびTimesTenで有効になっているかどうかの確認

- PL/SQLインストールおよびttmodinstallユーティリティ

- PL/SQLがTimesTenデータベースで有効になっているかどうかの確認

- PL/SQL接続属性

- ttSrcScanユーティリティ

7 PL/SQLプログラムのためのアクセス制御

- PL/SQL操作のためのアクセス制御

- PL/SQL文およびPL/SQL操作に必要な権限

- 権限の付与および取消し

- 無効化されたオブジェクト

- SQL操作のためのアクセス制御

- 定義者権限および実行者権限

- アクセス制御に関するその他の考慮事項

- 接続および接続属性のためのアクセス制御

- システム・ビューおよび提供パッケージのためのアクセス制御

- PL/SQLに関連する組込みプロシージャのためのアクセス制御

8 TimesTenが提供するPL/SQLパッケージ

- DBMS_LOB

- DBMS_LOCK

- DBMS_OUTPUT

- DBMS_PREPROCESSOR

- DBMS_RANDOM

- DBMS_SQL

- DBMS_UTILITY

- TT_DB_VERSION

- TT_STATS

- UTL_FILE

- UTL_IDENT

- UTL_RAW

- UTL_RECOMP

9 TimesTen PL/SQLサポート: リファレンスの概要

索引

はじめに

Oracle TimesTen In-Memory Database (TimesTen)は、迅速な応答およびスループット用にメモリーが最適化されたリレーショナル・データベースです。実行時にはデータベース全体がメモリーに常駐し、リカバリおよび再起動できるようにディスク記憶域に保存されます。レプリケーション機能によって、高可用性が実現します。TimesTenでは、OracleインタフェースであるPL/SQL、OCIおよびPro*C/C++に加えて、標準的なアプリケーション・インタフェースであるJDBC、ODBCおよびODP.NETがサポートされます。TimesTenは、単独で使用することもOracle Databaseのキャッシュとして使用することもできます。

このドキュメントでは、PL/SQLに対するTimesTenサポートについて説明します。

内容は次のとおりです。

- 対象読者

- 関連ドキュメント

- 表記規則

- ドキュメントのアクセシビリティについて

対象読者

このドキュメントは、TimesTenでPL/SQLを使用するアプリケーションを開発またはサポートするすべてのユーザーを対象にしています。このドキュメントは、一部概要についても説明していますが、PL/SQLに習熟しているか、またはさらに詳細なドキュメントも利用する必要があります。このマニュアルでは、TimesTenに固有の機能を中心に説明しています。

ユーザーは、TimesTen、SQL(Structured Query Language)、およびデータベースの操作に習熟している必要があります。

通常、前述のようなプログラミング・インタフェースでPL/SQLを使用するため、該当するTimesTen開発者向けドキュメントも参照してください。

詳細は、「このドキュメントの対象読者」も参照してください。

関連ドキュメント

TimesTenのドキュメントは、次のURLのOracle Technology Networkで入手できます。

http://www.oracle.com/technetwork/database/database-technologies/timesten/documentation/index.html

Oracle DatabaseのドキュメントもOracle Technology Networkで入手できます。これは、TimesTenでサポートされているが、詳しく説明されていないOracle Databaseの機能の場合に役立ちます。

http://www.oracle.com/pls/db112/homepage

特に、次のOracle Databaseドキュメントが役立ちます。

- 『Oracle Database PL/SQL言語リファレンス』

- 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

- 『Oracle Database SQL言語リファレンス』

- 『Oracle Databaseリファレンス』

また、PL/SQLについて詳しく説明しているサードパーティのドキュメントも多数利用できます。

表記規則

TimesTenは複数のプラットフォームをサポートしています。このマニュアルに記述されている内容は、特に表記しないかぎり、サポートされるすべてのプラットフォームに適用されます。Windowsという言葉は、サポートされるすべてのWindowsプラットフォームに適用されます。UNIXという用語は、サポートされるすべてのUNIXおよびLinuxプラットフォームを表します。TimesTenでサポートされる特定のプラットフォームのバージョンについては、『Oracle TimesTen In-Memory Databaseリリース・ノート』のプラットフォームに関する説明を参照してください。

注意:
TimesTenドキュメントでは、用語としての「データ・ストア」と「データベース」は同じです。両方の用語は、TimesTenデータベースを指します。

このマニュアルでは次の表記規則を使用します。

規則

意味

イタリック体

イタリックは、テキストで定義される用語、ドキュメントのタイトルまたは強調を示します。

固定幅フォント

固定幅フォントは、コマンド、URL、プロシージャ名、ファンクション名、パッケージ名、属性名、ディレクトリ名、ファイル名、画面に表示されるテキスト、または入力するテキストを示します。

固定幅フォントのイタリック

固定幅フォントのイタリックは、コード例で特定の値を指定または使用する、次の例のようなプレースホルダまたは変数を示します。
Driver=install_dir/lib/libtten.sl

install_dirをご使用のTimesTenインストール・ディレクトリに置き換えます。

[ ]

大カッコは、カッコ内の項目を任意に選択することを表します(大カッコは、入力しないでください)。

{ }

中カッコは、カッコ内の項目のうち、1つが必須であることを表します(中カッコは、入力しないでください)。

|

選択項目の引数を区切る縦線(パイプ)。

. . .

引数の後の水平の省略記号は、1行のコマンドラインで複数の引数を使用できることを表します。コード例の中の水平の省略記号は、例の一部だけが表示されていることを示します。

%

%は、UNIXのシェル・プロンプトを表します。

TimesTenのマニュアルでは、次の変数を使用して、パス、ファイルおよびユーザー名を表します。

規則

意味

install_dir

TimesTenがインストールされているディレクトリのパスです。

TTinstance

TimesTenのインストールで指定するインスタンス名です。インストール時に、一意のインスタンス名でTimesTenの各インストールを識別する必要があります。この名前はインストール・パスに表示されます。

bitsまたはbb

32または64の2桁の数字は、32-bitまたは64-bitのオペレーティング・システムを表します。

releaseまたはrr

リリース番号の最初の3つの部分(ドットが付く場合と付かない場合があります)。リリース番号の最初の3つの部分は、TimesTenのメジャー・リリースを表します。たとえば、1122または11.2.2は、TimesTen 11g リリース2 (11.2.2)を表します。

DSN

TimesTenデータソースの名前(TimesTenデータベース用)です。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

Oracleサポート・サービスでは、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

新機能

この項では、このマニュアルで説明するOracle TimesTen In-Memory Database 11g リリース2(11.2.2)の新機能を説明し、詳細情報へのリンクを示します。

リリース11.2.2.0.0の新機能

- LOBサポート
TimesTen supportsは、LOB(ラージ・オブジェクト)をサポートしています。これには、CLOB(文字LOB)、NCLOB(各国語LOB)、およびBLOB(バイナリLOB)などがあります。

PL/SQLのサポートの詳細は、「ラージ・オブジェクト(LOB)」を参照してください。

- 連想配列バインド
TimesTen PL/SQLでは、以前は索引付き表またはPL/SQL表と呼ばれていた連想配列が、OCI、Pro*C/C++、またはJDBCアプリケーションなどからのIN、OUTまたはIN OUTバインド・パラメータとしてサポートされます。これにより、データの配列をアプリケーションとデータベースの間で効率的に渡すことができます。

「アプリケーションからの連想配列の使用」を参照してください。

- 動的SQLでのPL/SQL文の使用
TimesTenでは、EXECUTE IMMEDIATE文またはDBMS_SQLプロシージャまたはファンクション・コールにおいて、SQL文の他に、PL/SQL無名ブロックおよびプロシージャまたはファンクション・コールを使用できます。

「PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)」を参照してください。

1 TimesTenデータベースにおけるPL/SQLの概要

TimesTenでは、データベースでSQLにプロシージャ構造を統合できるプログラミング言語、PL/SQL(Procedural Language Extension to SQL)がサポートされています。TimesTen 11g リリース2(11.2.2)は、Oracle Databaseリリース11.2.0.2のPL/SQL言語を実装しています。そのため、このリリースのOracle DatabaseにあるほとんどのPL/SQL機能はTimesTenにも含まれており、基本的に同様に操作できます。(相違点については、第9章「TimesTen PL/SQLサポート: リファレンスの概要」を参照してください。)

この章では、TimesTen PL/SQLについて簡単に説明します。内容は次のとおりです。

- TimesTenにおけるPL/SQLの機能

- TimesTenのPL/SQLのコンポーネントと操作

- このドキュメントの対象読者

- TimesTen PL/SQLデモについて

TimesTenにおけるPL/SQLの機能

TimesTenのPL/SQLサポートにより、次のことができます。

- PL/SQLプログラミング言語を最大限に活用します。

- 次のAPIを使用するクライアント・アプリケーションからPL/SQLを実行します。

- ODBC

- JDBC

- Oracle Call Interface (OCI)

- Oracle Pro*C/C++

- Oracle Data Provider for .NET (ODP.NET)

- TTClasses (TimesTen C++ライブラリ)

- PL/SQLからTimesTen SQLを実行します。

- スタンドアロンのプロシージャ、ファンクション、パッケージまたはパッケージ本体を作成、変更または削除します。

- PL/SQLパッケージを使用して、データベース機能を拡張したり、PL/SQLからSQL機能にアクセスできるようにします。

- PL/SQLアプリケーションで例外とエラーを処理します。

- データベースで接続属性を設定して、PL/SQL環境をカスタマイズします。

- セッション・パラメータを変更して、PL/SQL環境を管理できるようにします。

- PL/SQLシステム・ビューを使用して、データベース内のPL/SQLメタデータを表示します。

TimesTenのPL/SQLコンポーネントと操作

この項では、アプリケーションとPL/SQLの対話や、PL/SQLコンポーネントとTimesTenの他のコンポーネントの対話の説明など、TimesTenにおけるPL/SQL操作の概要について説明します。この章の内容は次のとおりです。

- アプリケーションとTimesTenおよびPL/SQLの対話

- TimesTenでのPL/SQLとOracle DatabaseでのPL/SQL

アプリケーションとTimesTenおよびPL/SQLの対話

図1-1は、PL/SQLコンポーネントと、PL/SQL操作中のPL/SQLコンポーネント同士の対話およびPL/SQLコンポーネントと他のTimesTenコンポーネントとの対話を示しています。

図1-1 TimesTenのPL/SQLコンポーネント

アプリケーションは、ODBC、JDBC、OCI、Pro*C、ODP.NETまたはTTClassesのいずれかのAPIを使用して、データベースにリクエストを送信します。ODBCはTimesTenにネイティブのAPIであるため、他の各APIは、最終的にODBC層をコールします。

ODBCドライバはTimesTen SQLパーサーをコールして、各受信リクエストを調査し、SQLとPL/SQLのどちらであるかを確認します。次に、リクエストはTimesTen内の適切なサブシステムに渡されます。PL/SQLソースおよびSQL文は、それぞれPL/SQLサブシステムおよびSQLサブシステムによってコンパイル、最適化および実行されます。

PL/SQLコンパイラはPL/SQLソースから実行可能なコードを生成し、SQLコンパイラはSQL文に対して同様の処理をします。各コンパイラによって中間コードが生成されると、これらのコードは、適切なPL/SQLまたはSQL実行エンジンで実行可能になります。この実行可能コード(PL/SQLブロックに関するメタデータを含む)は、データベース内の表に格納されます。

PL/SQLブロックが実行されると、PL/SQL実行エンジンが起動されます。PL/SQLブロックでSQLが起動されると、PL/SQL実行エンジンはTimesTen SQLコンパイラおよびTimesTen SQL実行エンジンをコールしてSQL実行を処理します。

注意:
TimesTenにPL/SQLを導入した場合でも、PL/SQLを使用しないアプリケーションにはほとんど影響がありません。アプリケーションでSQLが直接実行される場合、リクエストは、以前のリリースと同じ方法でTimesTen ODBCドライバからTimesTen SQLコンパイラおよび実行エンジンに渡されます。

TimesTenでのPL/SQLとOracle DatabaseでのPL/SQL

TimesTenでのPL/SQLの処理は、Oracle Databaseでの処理と大部分において同じです。TimesTenに含まれているPL/SQLコンパイラと実行エンジンは、元々Oracle Databaseで使用されていたものであるため、PL/SQLコンポーネントとSQLコンパイラおよび実行エンジンの関係は同等です。PL/SQLユニットの格納に使用する表はTimesTenでもOracle Databaseでも同じであり、これは、格納されたPL/SQLユニットの情報検索に使用できるビューについても同様です。

このように基本的には類似しているものの、潜在的な大きな相違点がいくつかあります。その詳細は、以降のサブセクションで説明します。

- PL/SQLブロック内のSQL文

- SQLからのPL/SQLの実行

PL/SQLブロック内のSQL文

Oracle Databaseと同様に、TimesTenのPL/SQLブロックにSQL文を含めることができます。次の例の無名ブロックについて考えてみます。

Command> create table tab2 (x number, last_name VARCHAR2 (25) INLINE NOT NULL);
Command> declare
>    x number;
> begin
>    select salary into x from employees where last_name = 'Whalen';
>    insert into tab2 values(x, 'Whalen');
> end;
> /

PL/SQL procedure successfully completed.

TimesTenのPL/SQLコンパイラは、Oracle Database SQLパーサーのコピーをコールして、そのSQL文の構文を分析および検証します。Oracle Databaseパーサーは、この処理のためにTimesTenに実装されています。この処理の実行中、PL/SQLはSQL文の一部をリライトする場合があります(たとえば、INTO句を削除したり、PL/SQL変数をバインドに置き換えるなど)。この処理は、TimesTenでもOracle Databaseでも同じです。リライトされたSQL文は、PL/SQLブロックの実行可能コードに含められます。このPL/SQLブロックが実行されると、これらのSQL文はコンパイルされ、TimesTen SQLサブシステムによって実行されます。

Oracle Databaseでは、PL/SQLコンパイラとSQLコンパイラで同じSQLパーサーが使用されます。これに対して、TimesTenでは異なるSQLパーサーが使用されます。TimesTen PL/SQLはOracle Database SQLパーサーを使用しますが、TimesTen SQLはネイティブのTimesTen SQLパーサーを使用します。通常、エンド・ユーザーはこの違いを意識する必要はありませんが、場合によっては意識する必要があります。特に次の点に注意してください。

- TimesTen PL/SQLプログラムのSQL文は、Oracle Database SQL構文に従う必要があります。TimesTen SQLは基本的にOracle Database SQLのサブセットですが、TimesTen SQLで使用できてOracle Database SQLでは使用できない式がいくつかあります。このようなTimesTenに固有のSQL操作は、EXECUTE IMMEDIATE文またはDBMS_SQLパッケージを介して動的SQLを使用する方法を除いて、PL/SQLでは使用できません。「PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)」を参照してください。

- Oracle Databaseで許可されるSQL文は、それがTimesTenでは実行できないSQL文であっても有効とみなされ、PL/SQLコンパイラで受け入れられます。TimesTenではサポートされないSQL機能を使用した場合、PL/SQLブロックのコンパイルは正常に行われることがありますが、そのPL/SQLブロックを実行した際に実行時エラーが発生する可能性があります。

SQLからのPL/SQLの実行

Oracle Databaseでは、PL/SQLブロックがSQL文を起動することも、SQL文がPL/SQLファンクションを起動することもできます。たとえば、ストアド・プロシージャは、WHERE句内にユーザーが記述したPL/SQLファンクションを含むUPDATE文を起動することができます。

TimesTenの場合、SQL文からPL/SQLファンクションを起動することはできません。

また、TimesTenはトリガーをサポートしていません。(トリガーに対するXLA、高可用性、非同期のTimesTen代替手段については、『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAおよびTimesTenのイベント管理に関する説明を参照してください。)

このドキュメントの対象読者

このドキュメントは、主に次の開発者を対象としています。

- Oracle DatabaseおよびOracle Database PL/SQLの経験があり、TimesTenでPL/SQLを使用する方法について学習する必要がある開発者。このような読者は、Oracle DatabaseでのPL/SQLと、TimesTenでのPL/SQLの相違点を学習する必要があります。

- TimesTenの経験はあるがPL/SQLに関する詳しい知識がない開発者。このような読者は、PL/SQLについての一般的な情報が必要です。

それぞれの対象読者にとって特に重要なこのドキュメントの参照先は、次のとおりです。

Oracle DatabaseおよびOracle Database PL/SQLでの経験がある開発者

Oracle Database PL/SQLでの経験がある開発者は、このドキュメントの大部分(PL/SQLに関する多くの一般概念の説明)は読む必要がありません。重要な部分、特にOracle DatabaseとTimesTenにおけるPL/SQL機能の相違点は、次に含まれています。TimesTen固有の考慮事項については、第2章、第3章および第4章の最後、第9章全体で説明します。

- 「PL/SQLのプロシージャおよびファンクションの実行方法」: TimesTenおよびOracle Databaseで実行方法の比較を示します。

- 「TimesTenにおける相違点: トランザクション動作」: TimesTenでのトランザクション終了時のカーソル動作について説明します。

- 「TimesTenにおける相違点: データ型に関する考慮事項」: TimesTenに固有の変換、およびTimesTenがサポートしない型について説明します。

- 「TimesTenにおける相違点: 例外処理およびエラー動作」: エラーのサポート、処理およびレポートの相違点について説明します。

- 第6章「PL/SQLのインストールおよび環境」: TimesTenの接続属性について説明します。

- 第8章「TimesTenが提供するPL/SQLパッケージ」: TimesTenがサポートするOracle Database PL/SQLパッケージのサブセットについて説明します。

- 第9章「TimesTen PL/SQLサポート: リファレンスの概要」: TimesTen PL/SQLとOracle Database PL/SQLの間の相違点への対処を詳細に説明します。

TimesTenでの経験がある開発者

このマニュアルの大部分は、以前にPL/SQLを経験したことがない読者、特にPL/SQLに関する知識のないTimesTenユーザーを対象として作成されており、このマニュアルのほぼ全体が役に立ちます。特に、第2章「TimesTenにおけるPL/SQLのプログラミング機能」はこのような読者が始める際に役立つほか、第5章「PL/SQLでのTimesTen SQLの使用」では追加の例がいくつか紹介されています。

第9章「TimesTen PL/SQLサポート: リファレンスの概要」は、TimesTen PL/SQLとOracle Database PL/SQLの相違点について説明しているため、関係がない可能性があります。

TimesTen PL/SQLデモについて

環境を構成した後、TimesTenクイック・スタート・デモ・アプリケーションをコンパイルして実行することで、すべて正しく設定されていることを確認できます。クイック・スタートのようこそページ(install_dir/quickstart.html)の「SAMPLE PROGRAMS」の下にあるリンクで、次の事項の説明を参照してください。

- デモ・スキーマおよび設定: build_sampledbスクリプト(UNIXの場合.sh、またはWindowsの場合.bat)によって、サンプル・データベースおよびデモ・スキーマを作成します。デモの使用を開始する前に、これを使用する必要があります。

- デモ環境および設定: 通常、TimesTenの設定に使用するttenvスクリプトのスーパーセットであるttquickstartenvスクリプト(UNIXの場合.shまたは.csh、Windowsの場合.bat)によって、デモ環境を設定します。いずれかのデモをコンパイルおよび実行するセッションに入るたびに、これを使用する必要があります。

- デモおよび設定: quickstart/sample_codeディレクトリの下にあるサブディレクトリには、PL/SQL用のデモが提供されています。デモの実行方法については、サブディレクトリにあるREADMEファイルを参照してください。

- デモの内容: 各デモの概要は、SAMPLE PROGRAMSの下にある「PL/SQL」をクリックすると表示されます。

2 TimesTenにおけるPL/SQLのプログラミング機能

TimesTenでPL/SQLを使用することのメリットの1つとして、PL/SQLの手続き型構成要素を柔軟かつ強力なTimesTen SQL言語と統合できるという点をあげることができます。

この章では、『Oracle Database PL/SQL言語リファレンス』のPL/SQLの概要に関する説明に示されている主要なPL/SQLプログラミング機能について概説します。簡単な例から始めることにより、TimesTenにおけるPL/SQLの使用方法を学習できます。特に注意書きがないかぎり、これらの例はTimesTenとOracle Databaseの場合と同じ結果になります。

TimesTen固有の考慮事項の詳細は、章の最後を参照してください。アプリケーションがTimesTenと一般的に対話する方法、また特にPL/SQLと対話する方法の概要については、「TimesTenのPL/SQLコンポーネントと操作」を参照してください。

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

- PL/SQLブロック

- PL/SQLの変数および定数

- PL/SQLからのSQLファンクション・コール

- PL/SQL制御構造

- PL/SQLのプロシージャおよびファンクションを実行する方法

- アプリケーションとPL/SQLとの間でデータを受け渡す方法

- PL/SQLプログラムでのSQLの使用

- PL/SQLプログラムでのカーソルの使用

- PL/SQLのプロシージャおよびファンクション

- PL/SQLパッケージ

- PL/SQLのソース・コードのラップ

- TimesTenにおける相違点: トランザクション動作

注意:
他に説明がないかぎり、このマニュアルの例では、TimesTen ttIsqlユーティリティを使用します。例の出力を表示するには、設定SET SERVEROUTPUT ONを使用します。ttIsqlの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する説明を参照してください。

PL/SQLブロック

PL/SQLソース・プログラムの基本単位はブロック、つまり無名ブロックであり、関連する宣言および文をグループ化します。TimesTenではPL/SQLブロックをサポートしています。

PL/SQLブロックは、キーワードDECLARE、BEGIN、EXCEPTIONおよびENDで定義します。例2-1に、PL/SQLブロックの基本構成を示します。

注意:
TimesTen Application-Tier Database Cache (TimesTen Cache)を使用する場合、PL/SQLブロックはOracle Databaseにパススルーできません。(「TimesTen Cacheを使用したTimesTen PL/SQL」も参照してください。)

例2-1 PL/SQLブロックの構成

DECLARE   -- (optional)
-- Variables, cursors, user-defined exceptions
BEGIN     -- (mandatory)
-- PL/SQL statements
EXCEPTION -- (optional)
-- Actions to perform when errors occur
END       -- (mandatory)

PL/SQLプログラムでは、無名ブロックまたは名前付きブロックのいずれも定義できます。次の例では、employees表に問合せを発行して、PL/SQL変数にデータを戻す無名ブロックを作成します。

Command> SET SERVEROUTPUT ON;
Command>  DECLARE
>    v_fname VARCHAR2 (20);
>  BEGIN
>    SELECT first_name
>    INTO v_fname
>    FROM employees
>    WHERE employee_id = 100;
>  DBMS_OUTPUT.PUT_LINE (v_fname);
>  END;
>  /
Steven

PL/SQL procedure successfully completed.

PL/SQLの変数および定数

PL/SQLで変数および定数を定義した後、SQLとプロシージャ文の式を使用できる任意の場所でこれらを使用できます。

次に例を示します。

Command> DECLARE
>   v_hiredate DATE;
>   v_deptno   NUMBER (2) NOT NULL := 10;
>   v_location VARCHAR2 (13) := 'San Francisco';
>   c_comm     CONSTANT NUMBER := 1400;

%TYPE属性を使用すると、TimesTenの列定義または宣言済の別の変数に応じた変数を宣言できます。たとえば、%TYPEを使用して、変数emp_lnameおよびmin_balanceを作成します。

Command> DECLARE
>   emp_lname  employees.last_name%TYPE;
>   balance    NUMBER (7,2);
>   min_balance  balance%TYPE:= 1000;
> BEGIN
>   SELECT last_name INTO emp_lname FROM employees WHERE employee_id = 100;
>   DBMS_OUTPUT.PUT_LINE (emp_lname);
>   DBMS_OUTPUT.PUT_LINE (min_balance);
> END;
> /
King
1000

PL/SQL procedure successfully completed.

次の方法で、値を変数に代入できます。

- 例2-2のように、代入演算子(:=)を使用して入力します。

- 例2-3のように、値を選択またはフェッチして変数に入れます。

- 変数をOUTまたはIN OUTパラメータとしてサブプログラム(プロシージャまたはファンクション)に渡し、例2-4に示すように、次にその値をサブプログラム内で割り当てます。

注意:
これらの例で使用されているDBMS_OUTPUTパッケージは、TimesTenに付属しています。このパッケージおよびその他の付属パッケージの詳細は、第8章「TimesTenが提供するPL/SQLパッケージ」を参照してください。

例2-2 代入演算子を使用した変数への値の代入

Command> DECLARE -- Assign values in the declarative section
>   wages NUMBER;
>   hours_worked NUMBER := 40;
>   hourly_salary NUMBER := 22.50;
>   bonus NUMBER := 150;
>   country VARCHAR2(128);
>   counter NUMBER := 0;
>   done BOOLEAN;
>   valid_id BOOLEAN;
>   emp_rec1 employees%ROWTYPE;
>   emp_rec2 employees%ROWTYPE;
>   TYPE commissions IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
>   comm_tab commissions;
> BEGIN -- Assign values in the executable section
>   wages := (hours_worked * hourly_salary) + bonus;
>   country := 'France';
>   country := UPPER('Canada');
>   done := (counter > 100);
>   valid_id := TRUE;
>   emp_rec1.first_name := 'Amy';
>   emp_rec1.last_name := 'Feiner';
>   emp_rec1 := emp_rec2;
>   comm_tab(5) := 20000 * 0.15;
> END;
> /

PL/SQL procedure successfully completed.

注意:
この例では、異なるデータ型を持つフィールドで構成された複合データ構造のレコードを使用します。ここに示されているように、%ROWTYPE属性を使用して、表内の行または問合せの結果セットの行を表すレコードを宣言できます。レコードについては、「PL/SQLの複合データ型」でさらに説明します。

例2-3 SELECT INTOを使用した変数への値の代入

従業員の給与の10%を選択して、bonus変数に入れます。

Command>  DECLARE
>    bonus NUMBER(8,2);
>    emp_id NUMBER(6) := 100;
>  BEGIN
>    SELECT salary * 0.10 INTO bonus FROM employees
>      WHERE employee_id = emp_id;
>    DBMS_OUTPUT.PUT_LINE (bonus);
>  END;
>  /
2400

PL/SQL procedure successfully completed.

例2-4 サブプログラムのパラメータとしての変数への値の代入

変数new_salを宣言した後、変数をパラメータ(sal)としてプロシージャadjust_salaryに渡します。プロシージャadjust_salaryでは、job_id='ST_CLERK'の従業員の平均給与を計算した後、salを更新します。プロシージャの実行後、変数の値が表示され、変数が正しく更新されたことが示されます。

Command> DECLARE
>   new_sal NUMBER(8,2);
>   emp_id NUMBER(6) := 126;
> PROCEDURE adjust_salary (emp_id NUMBER, sal IN OUT NUMBER) IS
>   emp_job VARCHAR2(10);
>   avg_sal NUMBER(8,2);
> BEGIN
>   SELECT job_id INTO emp_job FROM employees
>     WHERE employee_id = emp_id;
>   SELECT AVG(salary) INTO avg_sal FROM employees
>     WHERE job_id = emp_job;
>   DBMS_OUTPUT.PUT_LINE ('The average salary for ' || emp_job
>     || ' employees: ' || TO_CHAR(avg_sal));
>   sal := (sal + avg_sal)/2;
>   DBMS_OUTPUT.PUT_LINE ('New salary is ' || sal);
> END;
> BEGIN
>   SELECT AVG(salary) INTO new_sal FROM employees;
>   DBMS_OUTPUT.PUT_LINE ('The average salary for all employees: '
>     || TO_CHAR(new_sal));
>   adjust_salary(emp_id, new_sal);
>   DBMS_OUTPUT.PUT_LINE ('Salary should be same as new salary ' ||
>     new_sal);
> END;
> /
The average salary for all employees: 6461.68
The average salary for ST_CLERK employees: 2785
New salary is 4623.34
Salary should be same as new salary 4623.34

PL/SQL procedure successfully completed.

注意:
この例では、ブロック内にPL/SQLブロックをネストする機能を示しています。外側の無名ブロック内に、内側のプロシージャが含まれています。このPROCEDURE文は、CREATE PROCEDURE文とは異なります(後者は、ユーザーのスキーマ内に格納されたままとなるサブプログラムを作成する文で、詳細は「PL/SQLプロシージャおよびファンクション」を参照)。

PL/SQLからのSQLファンクション・コール

ほとんどのSQLファンクションは、PL/SQLから直接コールすることができます。次に示す最初の例では、ファンクションRTRIMを、PL/SQL代入文内でPL/SQLファンクションとして使用しています。2番目の例では、このファンクションは、静的SQL文内のSQLファンクションとして使用しています。

例2-5 PL/SQLからのRTRIMファンクションの使用

TimesTen PL/SQL RTRIM組込みファンクションを使用して、文字列から最右端のxおよびyの文字を削除します。RTRIMはPL/SQL代入文内で使用されている点に注意してください。

Command> DECLARE p_var VARCHAR2(30);
> BEGIN
>   p_var := RTRIM ('RTRIM Examplexxxyyyxyxy', 'xy');
>   DBMS_OUTPUT.PUT_LINE (p_var);
> END;
> /
RTRIM Example

PL/SQL procedure successfully completed.

例2-6 SQLからのRTRIMファンクションの使用

TimesTen SQLファンクションRTRIMを使用して、文字列から最右端のxおよびyの文字を削除します。RTRIMは静的なSQL文で使用することに注意してください。

Command>  DECLARE tt_var VARCHAR2 (30);
>  BEGIN
>    SELECT RTRIM ('RTRIM Examplexxxyyyxyxy', 'xy')
>      INTO tt_var FROM DUAL;
>    DBMS_OUTPUT.PUT_LINE (tt_var);
> END;
> /
RTRIM Example

PL/SQL procedure successfully completed.

TimesTenでのSQLファンクションの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の式に関する説明を参照してください。PL/SQLでのSQLファンクションのサポートの詳細は、『Oracle Database PL/SQL言語リファレンス』のPL/SQL式でのSQLファンクションに関する説明を参照してください。

PL/SQL制御構造

制御構造は、SQLに対するPL/SQLの拡張機能です。TimesTenでは、Oracle Databaseと同じ制御構造がサポートされています。

この項では、次の制御構造について説明します。

- 条件制御

- 反復制御

- CONTINUE文

条件制御

条件制御の例としては、IF-THEN-ELSEおよびCASE構造があげられます。例2-7では、IF-THEN-ELSE構造を使用して、現在の給与を基に従業員の昇給を決定します。また、従業員のjob_idに基づいて実行する処理のコースを選択するために、CASE構造も使用します。

例2-7 IF-THEN-ELSEおよびCASE構造の使用

Command> DECLARE
>   jobid employees.job_id%TYPE;
>   empid employees.employee_id%TYPE := 115;
>   sal employees.salary%TYPE;
>   sal_raise NUMBER(3,2);
> BEGIN
>   SELECT job_id, salary INTO jobid, sal from employees
>     WHERE employee_id = empid;
>   CASE
>     WHEN jobid = 'PU_CLERK' THEN
>       IF sal < 3000 THEN sal_raise := .12;
>       ELSE sal_raise := .09;
>       END IF;
>     WHEN jobid = 'SH_CLERK' THEN
>       IF sal < 4000 THEN sal_raise := .11;
>       ELSE sal_raise := .08;
>       END IF;
>     WHEN jobid = 'ST_CLERK' THEN
>       IF sal < 3500 THEN sal_raise := .10;
>       ELSE sal_raise := .07;
>       END IF;
>     ELSE
>       BEGIN
>         DBMS_OUTPUT.PUT_LINE('No raise for this job: ' || jobid);
>       END;
>   END CASE;
> DBMS_OUTPUT.PUT_LINE ('Original salary ' || sal);
> -- Update
> UPDATE employees SET salary = salary + salary * sal_raise
> WHERE employee_id = empid;
> END;
> /
Original salary 3100

PL/SQL procedure successfully completed.

反復制御

反復制御構造では、指定した条件がTRUEであるかぎり、文のシーケンスが繰り返し実行されます。反復操作の実行にはループ構造が使用されます。

次の3つのタイプのループがあります。

- 基本ループ

- FORループ

- WHILEループ

基本ループは、全体にわたる条件を使用しないで反復処理を実行します。FORループは、カウントに基づいて反復処理を実行します。WHILEループは、条件に基づいて反復処理を実行します。

例2-8 WHILEループの使用

Command> CREATE TABLE temp (tempid NUMBER(6),
> tempsal NUMBER(8,2),
> tempname VARCHAR2(25));
Command> DECLARE
>   sal employees.salary%TYPE := 0;
>   mgr_id employees.manager_id%TYPE;
>   lname employees.last_name%TYPE;
>   starting_empid employees.employee_id%TYPE := 120;
> BEGIN
>   SELECT manager_id INTO mgr_id
>     FROM employees
>     WHERE employee_id = starting_empid;
>   WHILE sal <= 15000 LOOP -- loop until sal > 15000
>     SELECT salary, manager_id, last_name INTO sal, mgr_id, lname
>       FROM employees WHERE employee_id = mgr_id;
>   END LOOP;
>   INSERT INTO temp VALUES (NULL, sal, lname);  -- insert NULL for tempid
>   COMMIT;
> EXCEPTION
>   WHEN NO_DATA_FOUND THEN
>     INSERT INTO temp VALUES (NULL, NULL, 'Not found');  -- insert NULLs
>     COMMIT;
> END;
> /

PL/SQL procedure successfully completed.

Command> SELECT * FROM temp;
< <NULL>, 24000, King >
1 row found.

CONTINUE文

CONTINUE文を使用すると、ループ内の制御を新しい反復に移すことができます。

例2-9 CONTINUE文の使用

この例では、ループの10回の反復のそれぞれで、最初のv_totalの代入が実行されます。2つ目のv_totalの代入は、ループの最初の5回の反復で実行されます。CONTINUE文はループ内の制御を新しい反復に移すため、ループの最後の5回の反復では2つ目のv_totalの代入は実行されません。最終的なv_totalの値は、70になります。

Command> DECLARE
>   v_total  SIMPLE_INTEGER := 0;
> BEGIN
>   FOR i IN 1..10 LOOP
>     v_total := v_total + i;
>     DBMS_OUTPUT.PUT_LINE ('Total is : ' || v_total);
>     CONTINUE WHEN i > 5;
>     v_total := v_total + i;
>     DBMS_OUTPUT.PUT_LINE ('Out of loop  Total is: ' || v_total);
>   END LOOP;
> END;
> /
Total is : 1
Out of loop  Total is: 2
Total is : 4
Out of loop  Total is: 6
Total is : 9
Out of loop  Total is: 12
Total is : 16
Out of loop  Total is: 20
Total is : 25
Out of loop  Total is: 30
Total is : 36
Total is : 43
Total is : 51
Total is : 60
Total is : 70

PL/SQL procedure successfully completed.

PL/SQLのプロシージャおよびファンクションを実行する方法

TimesTenでは、ODBC、OCI、Pro*C/C++、JDBC、ODP.NETまたはTimesTen TTClasses(C++)を使用したクライアント・アプリケーションからのPL/SQLの実行がサポートされています。

前述のとおり、ブロックとは、PL/SQLソース・プログラムの基本単位です。無名ブロックも前述のとおりです。一方、プロシージャおよびファンクションとは、指定した名前で定義されているPL/SQLブロックのことです。これらの定義および作成方法の詳細は、「PL/SQLのプロシージャおよびファンクション」を参照してください。

TimesTenでは、スタンドアロンのPL/SQLプロシージャまたはファンクション(CREATE PROCEDUREまたはCREATE FUNCTIONで作成)、またはパッケージの一部を、無名ブロックまたはCALL文を使用して実行できます。(CALL構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCALLに関する説明を参照してください。)

次のファンクションについて考えてみます。

create or replace function mytest return number is
begin
return 1;
end;

TimesTenでは、次のいずれかの方法でmytestを実行できます。

- 無名ブロック:

Command> variable n number;
Command> begin
> :n := mytest();
> end;
> /

PL/SQL procedure successfully completed.

Command> print n;
N                    : 1

- CALL文:

Command> variable n number;
Command> call mytest() into :n;
Command> print n;
N                    : 1

Oracle Database では、次のようにSQL文からmytestを実行することもできます。この実行メカニズムは、TimesTenではサポートされていません。

- SELECT文:

SQL> select mytest from dual;

MYTEST
----------
1

注意:
ユーザー独自のプロシージャは、同じ名前を持つTimesTenの組込みプロシージャよりも優先されますが、そのような名前の競合は避けることをお薦めします。

アプリケーションとPL/SQLとの間でデータを受け渡す方法

この項では、アプリケーションとPL/SQL間でのデータの受渡しに関し、次の内容について説明します。

- アプリケーションのバインド変数の使用

- IN、OUTおよびIN OUTパラメータ・モード

『Oracle Database PL/SQL言語リファレンス』のバインド変数に関する説明を参照してください。

アプリケーションのバインド変数の使用

バインド変数に:var表記を使用すると、アプリケーション(CまたはJavaアプリケーションなど)とPL/SQL間でバインド変数を受け渡すことができます。バインド変数(ホスト変数と呼ばれる場合もあります)という用語は、これまでTimesTenで使用されてきたパラメータという用語と同様に使用し、アプリケーションのバインド変数とは、PL/SQLプロシージャまたはファンクションの仕様部で宣言されたパラメータに相当します。

次に、指定した従業員IDと一致する従業員の名前、および給与を取得するPL/SQLプロシージャをコールするときに、ttIsqlを使用する例を簡単に示します。この例では、ttIsqlは基本的にコール元のアプリケーションのように動作し、名前および給与はPL/SQLからの出力になります。

Command> VARIABLE b_name VARCHAR2 (25)
Command> VARIABLE b_sal  NUMBER

Command> BEGIN
>  query_emp (171, :b_name, :b_sal);
> END;
> /

PL/SQL procedure successfully completed.

Command> PRINT b_name
B_NAME               : Smith
Command> PRINT b_sal
B_SAL                : 7400

詳細な例については、「入力パラメータ、出力パラメータおよびバインド変数を使用する例」を参照してください。

プロシージャおよびファンクションの作成および定義方法の詳細は、「PL/SQLのプロシージャおよびファンクション」を参照してください。

これらの言語の詳細および例は、『Oracle TimesTen In-Memory Database C開発者ガイド』のパラメータのバインディングおよび文の実行に関する説明および『Oracle TimesTen In-Memory Database Java開発者ガイド』のSQL文の作成および入力パラメータの設定に関する説明を参照してください。

注意:

- TimesTenのバインド・メカニズム(アーリー・バインディング)はOracle Databaseのバインド・メカニズム(レイト・バインディング)とは異なります。TimesTenは、問合せの準備の前にデータ型を必要とします。そのため、各バインド・パラメータのデータ型が指定されていないかSQL文から推測できないと、エラーが発生します。たとえば次のような文が、これに該当します。

SELECT 'x' FROM DUAL WHERE :a = :b;

この問題には、たとえば次のように対処できます。

SELECT 'x' from DUAL WHERE CAST(:a as VARCHAR2(10)) =
CAST(:b as VARCHAR2(10));

- 重複パラメータについて、TimesTenのPL/SQLでの実装はOracle DatabaseのPL/SQLでの実装と同じです。

- TimesTen開発者ガイドで使用される「バインド・パラメータ」という用語(ODBC用語に準拠)は、TimesTenのPL/SQLのマニュアルで使用される「バインド変数」という用語(Oracle Database PL/SQL用語に準拠)と同じです。

IN、OUTおよびIN OUTパラメータ・モード

パラメータ・モードは、PL/SQLサブプログラム(プロシージャまたはファンクション)の仕様部で宣言されたパラメータを入力、出力またはその両方のどちらに使用するかを定義します。IN(デフォルト)、OUTおよびIN OUTの3つのパラメータ・モードがあります。

INパラメータでは、起動されるサブプログラムに値を渡すことができます。サブプログラム内では、INパラメータは定数のように動作するため、値を代入することはできません。INパラメータとして、定数、リテラル、初期化された変数または式を渡すことができます。

OUTパラメータは、サブプログラムのコール元に値を戻します。サブプログラム内では、OUTパラメータは変数のように動作します。その値を変更して、代入後に値を参照できます。

IN OUTパラメータは初期値をサブプログラムに渡し、更新された値をコール元に戻します。パラメータに値を代入したり、その値を読み取ることができます。一般的に、IN OUTパラメータは、文字列バッファ、または数値アキュムレータであり、サブプログラム内で読み取られた後に更新されます。IN OUT仮パラメータに対応する実パラメータは、定数や式ではなく、変数である必要があります。

注意:
TimesTenは、連想配列のバインディングを(ただしVARRAYおよびネストした表を除く)、IN、OUTまたはIN OUTパラメータとしてサポートします。「アプリケーションからの連想配列の使用」を参照してください。

「入力パラメータ、出力パラメータおよびバインド変数を使用する例」を参照してください。

PL/SQLプログラムでのSQLの使用

PL/SQLは、SQL言語を通じてTimesTenデータベースと密接に統合されています。この項では、PL/SQLにおける次のSQL機能の使用について説明します。

- 問合せおよびDML文に使用するPL/SQLの静的SQL

- PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)

- FORALL操作およびBULK COLLECT操作

- RETURNING INTO句

- TimesTen Cacheを使用したTimesTen PL/SQL

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

問合せおよびDML文に使用するPL/SQLの静的SQL

PL/SQL内から、次の文を静的SQLとして実行できます。

- DML文: INSERT、UPDATE、DELETEおよびMERGE

- 問合せ: SELECT

- トランザクション制御: COMMITおよびROLLBACK

注意:

- PL/SQLでDDL文を実行するには、動的SQLを使用する必要があります。次の項の「PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)」を参照してください。

- TimesTenトランザクションとOracle Databaseの動作の違いについては、「TimesTenにおける相違点: トランザクション動作」を参照してください。

これらのSQL文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。

例2-10に、問合せの実行方法を示します。PL/SQLでTimesTen SQLを使用した例の詳細は、第5章「PL/SQLでのTimesTen SQLの使用例」を参照してください。

例2-10 SELECT...INTOを使用したデータの取得

単一行のデータを取得するには、SELECT... INTO文を使用します。1行も返さないか、または複数の行を返す問合せに対して、TimesTenはエラーを返します。

この例では、HRスキーマのemployees表から、employee_id=100の従業員のhire_dateおよびsalaryを取得します。

Command> run selectinto.sql

DECLARE
v_emp_hiredate employees.hire_date%TYPE;
v_emp_salary   employees.salary%TYPE;

BEGIN
SELECT hire_date, salary
INTO   v_emp_hiredate, v_emp_salary
FROM   employees
WHERE  employee_id = 100;
DBMS_OUTPUT.PUT_LINE(v_emp_hiredate || ' ' || v_emp_salary);
END;
/

1987-06-17 24000

PL/SQL procedure successfully completed.

PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)

EXECUTE IMMEDIATE文を使用すると、ネイティブの動的SQLを使用して次のことを実行できます。

- INSERT、UPDATEまたはDELETEなどのDML文を実行します。

- CREATEまたはALTERなどのDDL文を実行します。たとえば、ALTER SESSIONを使用して、PL/SQL初期接続属性を変更できます。

- PL/SQL無名ブロックを実行します。

- PL/SQLストアド・プロシージャまたはファンクションをコールします。

- TimesTen組込みプロシージャをコールする場合。(詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する説明を参照してください。)

1つの使用例として、実行時までSQL文の完全なテキストがわからない場合をあげることができます。たとえば、コンパイル時に、SELECT文のWHERE句で使用する列の名前がわからないことがあります。このような場合は、EXECUTE IMMEDIATE文を使用できます。

別の使用例として、DDLの使用が挙げられますが、DDLはPL/SQL内からは静的SQLで実行できません。

結果セットを戻すTimesTen組込みプロシージャをコールするには、レコード型を作成し、BULK COLLECTを使用したEXECUTE IMMEDIATEを使用して、結果を配列にフェッチします。

例2-11で、EXECUTE IMMEDIATEの一連の簡単な例を示します。その他の例の詳細は、「EXECUTE IMMEDIATEを使用する例」を参照してください。

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

注意:

- 詳細は、「TimesTenにおける相違点: トランザクション動作」を参照してください。

- DDL文を解析してプロシージャまたはパッケージを削除するため、そのプロシージャまたはそのパッケージ内のプロシージャが使用中の場合、タイムアウトが発生します。プロシージャをコールすると、実行がユーザー側に戻るまで、そのプロシージャは使用中であるとみなされます。このようなデッドロックは、すぐにタイムアウトになります。

- また、動的SQLにDBMS_SQLパッケージを使用することもできます。「DBMS_SQL」を参照してください。

例 2-11 EXECUTE IMMEDIATEを使用したPL/SQLの実行

この例では、EXECUTE IMMEDIATE文でPL/SQLを使用する一連の例を示します。(これらの例は、互いに無関係です。)

表を作成し、PL/SQLブロック内でその表に対してDML文を実行します(USING句で入力パラメータを指定します)。次に、表を選択して結果を表示します。

Command> create table t(i int);
Command> declare
>    i number := 1;
> begin
>    execute immediate 'begin insert into t values(:j);end;' using i;
> end;
> /

PL/SQL procedure successfully completed.

Command> select * from t;
< 1 >
1 row found.

PL/SQLプロシージャfooを作成したら、PL/SQLブロックでそのプロシージャを実行します(USING句で入力パラメータを指定します)。

Command> create or replace procedure foo(message varchar2) is
> begin
>    dbms_output.put_line(message);
> end;
> /

Procedure created.

Command> begin
>    execute immediate 'begin foo(:b);end;' using 'hello';
> end;
> /
hello

PL/SQL procedure successfully completed.

PL/SQLプロシージャmyprintを作成したら、CALL文でそのプロシージャを実行します(USING句で入力パラメータを指定します)。

Command> declare
>    a number := 1;
> begin
>    execute immediate 'call myprint(:b)' using a;
> end;
> /
myprint procedure got number 1

PL/SQL procedure successfully completed.

動的SQLの使用上の注意

通常、EXECUTE IMMEDIATEを使用して実行するコードは、Oracle Databaseの場合と同様、外部のPL/SQLブロックと同じ環境を共有します。特に次の点に注意してください。(これらは、EXECUTE IMMEDIATEだけでなく、DBMS_SQLを使用する場合にも該当します。)

- EXECUTE IMMEDIATEで実行されるSQLおよびPL/SQLは、外部のブロックと同じトランザクションで実行されます。

- EXECUTE IMMEDIATE文の実行中に発生した例外は、外部のブロックに伝播されます。そのため、EXECUTE IMMEDIATE文の実行時に発生するエラー・スタックに関するエラーは、外部のブロック内に表示されます。これは、DBMS_UTILITY.FORMAT_ERROR_STACKなどのプロシージャで便利です。

- EXECUTE IMMEDIATE文でPL/SQLブロックを実行する前に発生したエラー・スタックに関するエラーは、たとえばDBMS_UTILITY.FORMAT_ERROR_STACKを使用してそのブロック内に表示されます。

- EXECUTE IMMEDIATE文を実行する実行環境は、外部のブロックの場合と同じです。PL/SQLおよびTimesTenパラメータ、REF CURSOR状態、およびEXECUTE IMMEDIATE文からのパッケージ状態は、外部のブロック内に表示されます。

FORALL操作およびBULK COLLECT操作

バルク・バインドは、PL/SQLからSQL文を実行する場合に使用される強力な機能であり、SQLとPL/SQL間での大量データの移動に使用されます。(アプリケーション・プログラムからPL/SQLへのパラメータのバインドとは異なります。)バルク・バインドでは、ループを使用してFETCH、INSERT、UPDATE、およびDELETE操作を複数回実行するのではなく、単一の操作で値の配列をバインドします。TimesTenではバルク・バインドがサポートされており、これにより、パフォーマンスを大幅に向上できます。

FORALL文を使用して入力コレクションをバルク・バインドしてから、SQLエンジンに送信します。BULK COLLECTを使用して、SQLから結果のバッチを取得します。VARRAY、ネストした表、連想配列(索引付き表)などの任意のPL/SQLコレクション型に、バルク・コレクトできます。コレクションの詳細は、「PL/SQLでのコレクションの使用」を参照してください。

FORALL文では%BULK_EXCEPTIONSカーソル属性およびSAVE EXCEPTIONS句を使用できます。SAVE EXCEPTIONSを使用すると、UPDATE、INSERTまたはDELETE文で例外(制約エラーなど)が発生した後でも実行を続行できます。例外は配列に収集され、文の実行後に%BULK_EXCEPTIONSを使用して確認できます。SAVE EXCEPTIONSを使用すると、FORALL文の実行中に例外が発生した場合でも、コレクション内のすべての行が処理されます。文が終了するとエラーが発行され、1つ以上の例外が発生したことが示されます。SAVE EXCEPTIONSを使用しなかった場合、FORALL文の実行中に例外が発行されると、文は即時に例外を戻し、その他の行は処理されません。

これらの機能の詳細は、『Oracle Database PL/SQL言語リファレンス』のFORALL文およびBULK COLLECT句の併用に関する説明を参照してください。

例2-12に、バルク・バインドおよびFORALL文の基本的な使用方法を示します。バルク・バインドの例および詳細は、「FORALLおよびBULK COLLECTを使用する例」を参照してください。

例2-12 FORALL文の使用

次の例のPL/SQLプログラムでは、IDが100、102、104または110の従業員の給与を増やします。FORALL文でコレクションをバルク・バインドします。

Command> CREATE OR REPLACE PROCEDURE raise_salary (p_percent NUMBER) IS
>   TYPE numlist_type IS TABLE OF NUMBER
>    INDEX BY BINARY_INTEGER;
>   v_id  numlist_type;  -- collection
> BEGIN
>   v_id(1) := 100; v_id(2) := 102; v_id (3) := 104; v_id (4) := 110;
>   -- bulk-bind the associative array
>   FORALL i IN v_id.FIRST .. v_id.LAST
>    UPDATE employees
>     SET salary = (1 + p_percent/100) * salary
>     WHERE employee_id = v_id (i);
> END;
> /

Procedure created.

raise_salaryプロシージャを実行する前に給与を検索します。

Command> SELECT salary FROM employees WHERE employee_id = 100 OR employee_id =
102 OR employee_id = 104 OR employee_id = 100;
< 24000 >
< 17000 >
< 6000 >
3 rows found.

次のとおりにプロシージャを実行して、結果を確認します。

Command> EXECUTE raise_salary (10);

PL/SQL procedure successfully completed.

Command> SELECT salary FROM employees WHERE employee_id = 100 or employee_id =
102 OR employee_id = 104 OR employee_id = 100;
< 26400 >
< 18700 >
< 6600 >
3 rows found.

RETURNING INTO句

RETURNING INTO句(DML RETURNINGと呼ばれる場合もあります)をINSERT、UPDATEまたはDELETE文で使用すると、処理の影響を受けた行の(オプションでROWIDを含む)特定の列または式を返すことができます。これにより、影響を確認したり、挿入または更新後のROWIDが必要な場合などに、後続のSELECT文および個々のラウンドトリップが不要になります。

RETURNING INTO句は、動的SQL(EXECUTE IMMEDIATEを使用)または静的SQLのいずれかで使用できます。

PL/SQL BULK COLLECT機能を使用すると、この句は、単一の行から一連のパラメータまたはレコードのいずれかにアイテムを返すことも、複数の行からVARRAY、ネストした表、または連想配列(索引付き表)などのPL/SQLコレクションに列を返すこともできます。句のINTO部分のパラメータには、入力/出力ではなく、出力のみを指定する必要があります。コレクションの詳細は、「PL/SQLでのコレクションの使用」を参照してください。BULK COLLECTについては、「FORALL操作およびBULK COLLECT操作」および「FORALLおよびBULK COLLECTを使用する例」を参照してください。

TimesTenでのSQL構文およびRETURNING INTO句の制限事項については、『Oracle TimesTen In-Memory Database SQLリファレンス』のINSERT、UPDATE、およびDELETEに関する説明を参照してください。

「RETURNING INTOを使用する例」も参照してください。

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

TimesTen Cacheを使用したTimesTen PL/SQL

PL/SQLプログラムでSQL文を実行すると、そのSQL文は、他のプログラミング言語で記述したアプリケーションから実行された場合と同じ方法で、TimesTenで処理されます。TimesTen SQLのすべての標準動作が適用されます。これには、TimesTen Cache環境で、PL/SQLからすべてのキャッシュ機能を使用できることも含まれます。PL/SQLからキャッシュ・グループ内の表にアクセスする際は、これらの表に対する通常のルールが適用されます。たとえば、動的キャッシュ・グループ内のキャッシュ・インスタンスに対してSELECT文を発行すると、インスタンスがOracle DatabaseからTimesTenに自動的にロードされる場合があります。

この機能に関する次の点には、特に注意してください。

- PL/SQLで静的SQLを使用する場合、アクセス対象の表がTimesTenに存在しないとPL/SQLが正常にコンパイルされません。次の例では、TimesTenにABCが存在する必要があります。

begin
insert into abc values(1, 'Y');
end;

- TimesTen Cache環境には、TimesTenパススルー機能を使用して、TimesTenからOracle Databaseに自動的にSQL文をルーティングする機能があります。(パススルー機能の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のパススルー・レベルの設定に関する説明を参照してください。)
passthrough=1を指定しておくと、アクセス対象の表がTimesTenに存在しない場合に、文をOracle Databaseにパススルーできます。ただし、PL/SQLでは、その文を動的SQLを使用して実行する必要があります。

前述の例を次のように書き換えて、passthrough=1を指定すると、このTimesTen PL/SQLブロックを使用してOracle DatabaseのABCにアクセスできます。

begin
execute immediate 'insert into abc values(1, 'Y')';
end;

この場合、SQL文はコンパイル時には検査されないため、TimesTen PL/SQLでブロックをコンパイルできます。

- TimesTenではPL/SQLを実行できますが、現在のリリースではTimesTenパススルー機能を使用してTimesTenからOracle DatabaseにPL/SQLブロックをルーティングすることはできません。たとえば、TimesTen Cacheをpassthrough=3とともに使用した場合、TimesTen接続で実行される文は、ほとんどの環境のOracle Databaseにルーティングされます。このシナリオでは、TimesTenはPL/SQLブロックをOracle Databaseに転送しようとしますが、これはサポートされていないため、アプリケーション・プログラムからPL/SQLブロックを実行できない場合があります。(passthrough=1の例では、ブロック全体ではなく、SQL文のみがOracle Databaseにルーティングされています。)

重要:
PL/SQLプロシージャおよびファンクションは、定義者権限または実行者権限で次のどのキャッシュ操作も実行できます。

- n行ごとにコミットしてキャッシュ・グループをロードまたはリフレッシュします。

- AWTキャッシュ・グループ上のDML

- 非伝播キャッシュ・グループ上のDML (PROPAGATEが有効になっていないユーザー管理キャッシュ・グループ)

- パススルーまたは動的ロードを呼び出さないキャッシュ・グループ表のSELECT

- UNLOAD CACHE GROUP

PL/SQLプロシージャまたはファンクションが、実行者権限(AUTHID CURRENT_USER)を使用する必要があるキャッシュ操作は、パススルー、キャッシュ・グループの動的ロード、WITH IDを使用したキャッシュ・グループのロードまたはリフレッシュ、キャッシュ・グループに対するDDL、SWTキャッシュ・グループに対するDML、またはFLUSH CACHE GROUPです。

「定義者権限および実行者権限」を参照してください。

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

TimesTen supportsは、LOB(ラージ・オブジェクト)をサポートしています。これには、CLOB(文字LOB)、NCLOB(各国語LOB)、およびBLOB(バイナリLOB)などがあります。

PL/SQL言語機能は、特に記述がないかぎり、Oracle Databaseと同様にTimesTenでもLOBをサポートされています。

この項では、LOBの簡単な概要とPL/SQLでの使用方法に関して、次の内容について説明します。

- LOBについて

- LOBロケータ

- 一時LOB

- TimesTenにおけるLOBとOracle DatabaseにおけるLOBの相違点

- LOBの使用

- LOBのPL/SQLパッケージ・サポート

注意:
データベースの文字セットがTIMESTEN8に設定されている場合、TimesTenはCLOBをサポートしていません。

次の情報も参照できます。

- TimesTenでのLOBに関する詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のLOBのデータ型に関する説明を参照してください。

- LOBを使用したプログラミングに関する、TimesTen機能に特化されない一般的な情報については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

LOBについて

LOBには、ラージ・バイナリ・オブジェクト(BLOB)または文字オブジェクト(CLOBまたはNCLOB)があります。TimesTenでは、BLOBのサイズは最大16MB、CLOBまたはNCLOBのサイズは最大4MBです。TimesTenのLOBには、特に記述がないかぎり、基本的にOracle Databaseと同じ機能があります。(「TimesTenにおけるLOBとOracle DatabaseにおけるLOBの相違点」を参照してください。)

LOBは、永続的または一時的のいずれかに設定できます。永続LOBは、データベースのLOB列に存在します。一時LOBはアプリケーション内のみに存在します。

LOBロケータ

PL/SQLでは、LOBは、LOBロケータおよびLOB値で構成されています。ロケータは、値へのハンドルとして機能する不透明構造です。LOBをパラメータとして渡すなどの操作で、アプリケーションがLOBを使用する場合、それは実際の値を渡すのではなく、ロケータを渡すことになります。

重要:
LOBロケータを使用するAPIを介ししてLOBを操作すると、TimesTen一時領域を使用することになります。このような操作を非常に多くの回数実行すると、TimesTen一時データ領域サイズの拡大が必要になる場合があります。『Oracle TimesTen In-Memory Databaseリファレンス』のTempSizeに関する説明を参照してください。

LOBを更新するには、トランザクションで、LOBを含む行が排他的にロックされている必要があります。これを行うには、SELECT ... FOR UPDATE文でLOBを選択します。その結果、ロケータは書込み可能になります。簡単なSELECT文の場合、ロケータは読取り専用です。読取り専用および書込み可能ロケータは次のように動作します。

- 読取り専用ロケータには読取り一貫性があり、そのロケータが存続する間は、LOBが選択された時点のコンテンツのみが表示されることを意味します。これには、LOBが選択される前に同じトランザクション内でLOBに対して行われた、コミットされていない更新も含まれることに注意してください。

- 書込み可能なロケータは、そのロケータを介して書込みが行われるたびに、データベースの最新のデータで更新されます。そのため、各書込みはLOBの最新データに対して行われ、これには他のロケータを介して行われた更新内容も含まれます。

次の例で、同一のLOBに対する2つの書込み可能なロケータの動作を説明します。

1. LOB列に、"XY"が含まれています。

2. 更新用にロケータL1を選択します。

3. 更新用にロケータL2を選択します。

4. L1を使用してオフセット1で"Z"を書き込みます。

5. ロケータL1を使用して読み取ります。これにより、"ZY"が戻されます。

6. ロケータL2を使用して読み取ります。L2は、書込みに使用されるまで読取り一貫性を保持しているため、これにより"XY"が戻されます。

7. L2を使用してオフセット2で"W"を書き込みます。

8. ロケータL2を使用して読み取ります。これにより、"ZW"が戻されます。このロケータは、前の手順の書込みが行われる前に、最新データ("ZY")で更新されていたことになります。

一時LOB

PL/SQLブロックは、それ自身で使用する一時LOBを明示的に作成することができます。TimesTenでは、このようなLOBの存続期間は、(TimesTenにおけるLOBロケータの存続期間と同様)そのLOBが作成されたトランザクションの終了時を超えて延長されることはありません。

一時LOBは、TimesTenで暗黙的に作成されることもあります。たとえば、SELECT文によって追加の文字列と連結されたLOBが選択される場合、連結データを含むようTimesTenでは一時LOBを暗黙的に作成します。一時LOBはサーバー側のオブジェクトであることに注意してください。TimesTenには、クライアント側のLOBという概念はありません。

一時LOBは、TimesTen一時データ領域に格納されます。

一時LOBの作成方法については、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』のCREATETEMPORARYプロシージャに関する説明を参照してください。

TimesTenにおけるLOBとOracle DatabaseにおけるLOBの相違点

次の点に注意してください。

- TimesTenのLOB実装とOracle Databaseでの実装との主な違いは、TimesTenの場合、LOBロケータはトランザクションが終了すると無効になる点です。すべてのLOBロケータは、明示的か暗黙的かにかかわらず、コミットまたはロールバック後に無効化されます。これには、TimesTen DDLCommitBehaviorがOracle Database動作を示す0 (デフォルト)に設定されている場合のすべてのDDL文の終了後が含まれ、PL/SQLユーザーは常に該当します。

- TimesTenは、BFILE、SecureFiles、LOBの配列の読取りおよび書込み、またはLOBのコールバック・ファンクションをサポートしていません。

- TimesTenでは、DBMS_LOB FRAGMENTプロシージャはサポートされていないため、データをLOBの中間に書き込むには、以前のデータを上書きするしかありません。LOBの中間にデータを挿入し、それに応じて以前のデータをLOB内のその時点よりも上位に移動する機能はありません。同様に、TimesTenでは、LOBの中間からデータを削除するには、以前のデータをゼロまたはNullデータで上書きする方法しかありません。LOBの中間からデータを削除し、それに応じて以前のデータをLOB内のその時点よりも下位に移動する機能はありません。どちらの場合にも、TimesTenではLOBのサイズは変化しませんが、指定のオフセットから、LOBで利用できる容量が書き込むデータよりも少ない場合は例外です。(Oracle Databaseでは、上書きしてLOBのサイズを変更しないモード、または挿入するか削除してLOBのサイズを変更するモードの機能があります。)

- TimesTenは、LOBの配列のバインドをサポートしていません。

- TimesTenは、LOBのバッチ処理をサポートしていません。

- BLOBに関して、TimesTenの16進リテラルの使用法に違いがあります。『Oracle TimesTen In-Memory Database SQLリファレンス』の定数に関する項でHexadecimalLiteralの説明を参照してください。

LOBの使用

次では、CLOBの基本的な使用方法について説明します。次のように、BLOB列(ここでは使用しません)およびCLOB列を含むように定義され、移入された表を想定します。

Command> create table t1 (a int, b blob, c clob);
Command> insert into t1(a,b,c) values(1, 0x123451234554321, 'abcde');
1 row inserted.
Command> commit;

次のように、表からCLOBを選択して表示します。

Command> declare
>    myclob clob;
> begin
>    select c into myclob from t1 where a=1;
>    dbms_output.put_line('CLOB selected from table t1 is: ' || myclob);
> end;
> /
CLOB selected from table t1 is: abcde

PL/SQL procedure successfully completed.

次では、commit文でトランザクションを終了した後に一時CLOBを再度表示してみると、その時点でLOBロケータが無効になっていることが示されています。

Command> declare
>    myclob clob;
> begin
>    select c into myclob from t1 where a=1;
>    dbms_output.put_line('CLOB selected from table t1 is: ' || myclob);
>    commit;
>    dbms_output.put_line('CLOB after end of transaction is: ' || myclob);
> end;
> /
1806: invalid LOB locator specified
8507: ORA-06512: at line 8
CLOB selected from table t1 is: abcde
The command failed.

LOBのPL/SQLパッケージ・サポート

TimesTenは、LOBデータを操作するためのDBMS_LOBパッケージのサブプログラムをサポートしています。

これらのサブプログラムのリストと説明については、このドキュメントの「DBMS_LOB」を参照してください。詳細は、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』のDBMS_LOBに関する説明を参照してください。

パススルーLOB

パススルーLOBは、TimesTenを介してアクセスされるOracle DatabaseのLOBであり、TimesTen LOBとして公開され、TimesTen LOBとほぼ同様にTimesTenでサポートされますが、次の点に注意してください。

- TimesTen LOBのサイズ制限は、パススルーLOBの記憶域には適用されませんが、バインディングには適用されます。また、DBMS_LOB.COPYなどで、パススルーLOBがTimesTen LOBにコピーされる場合、そのコピーにもサイズ制限が適用されます。
パススルーLOBのサイズがTimesTen LOBのサイズ制限より大きい場合、パススルーLOBをTimesTen LOBにコピーしようとするとエラーが発生します。

- TimesTenローカルLOBと同様、パススルーLOBのロケータは、トランザクションが終了すると無効になります。

パススルーLOBのDBMS_LOBサポートについては、このドキュメントの「DBMS_LOB」を参照してください。

PL/SQLプログラムでのカーソルの使用

明示または暗黙のいずれのカーソルも、SELECT文の結果セットの処理に使用されます。プログラマは明示カーソルを宣言して、複数のデータ行を戻す問合せを管理できます。PL/SQLは、明示カーソルと関連付けられていないSELECT文に対して、暗黙カーソルを宣言し、オープンします。

重要:
TimesTenでは、トランザクションを終了する操作は、接続と関連付けられているすべてのカーソルをクローズすることに注意してください。これには、COMMIT文またはROLLBACK文が該当します。また、PL/SQLが有効な場合に実行されたDDL文もこれに該当します(PL/SQLが有効な場合はDDLCommitBehavior接続を0(Oracle Databaseの動作)に設定する必要があるため)。このため、DDL文は自動コミットされます。詳細は、「TimesTenにおける相違点: トランザクション動作」を参照してください。

例2-13に、基本的なカーソルの使用方法を示します。その他の例および詳細は、「カーソルを使用する例」を参照してください。また、「PL/SQL REF CURSOR」も参照してください。

例2-13 カーソルを使用した従業員情報の取得

カーソルc1を宣言して、従業員IDが120の従業員の姓、給与、入社日およびジョブ・クラスを取得します。

Command> DECLARE
>   CURSOR c1 IS
>     SELECT last_name, salary, hire_date, job_id FROM employees
>     WHERE employee_id = 120;
> --declare record variable that represents a row
> --fetched from the employees table
>   employee_rec c1%ROWTYPE;
> BEGIN
> -- open the explicit cursor
> -- and use it to fetch data into employee_rec
>   OPEN c1;
>   FETCH c1 INTO employee_rec;
>   DBMS_OUTPUT.PUT_LINE('Employee name: ' || employee_rec.last_name);
>   CLOSE c1;
> END;
> /
Employee name: Weiss

PL/SQL procedure successfully completed.

PL/SQLのプロシージャおよびファンクション

プロシージャおよびファンクションとは、指定した名前で定義されているPL/SQLブロックのことです。

プロシージャおよびファンクションの作成と使用

スタンドアロン・サブプログラム(ストアド・プロシージャまたはファンクション)は、CREATE PROCEDUREまたはCREATE FUNCTION文を使用してデータベース・レベルで作成されます。

すでにサブプログラムが存在している場合にそのサブプログラムを置換するには、必要に応じてCREATE OR REPLACE PROCEDUREまたはCREATE OR REPLACE FUNCTIONを使用します。

プロシージャまたはファンクションを明示的にコンパイルするか、またはコンパイル・オプションを変更する場合は、ALTER PROCEDUREまたはALTER FUNCTIONを使用します。(パッケージに含まれるプロシージャまたはファンクションをコンパイルし直すには、ALTER PACKAGE文を使用してパッケージを再コンパイルします。)

TimesTenでは、CREATE PROCEDUREおよびCREATE FUNCTIONの構文は、Oracle Databaseでサポートされている内容の一部です。これらの文およびTimesTenのALTER PROCEDURE文およびALTER FUNCTION文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

また、「PL/SQLのプロシージャおよびファンクションを実行する方法」も参照してください。

注意:

- レプリケーションを使用する場合、PL/SQLファンクション、プロシージャ、およびパッケージのCREATE文などのPL/SQL DDL文はレプリケートされません。これを解決する手順については、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』のアクティブ・スタンバイ・ペアでの新しいPL/SQLの作成および既存のレプリケーション・スキームへのPL/SQLへの追加に関する説明を参照してください。

- TimesTen Cacheを使用する場合: Oracle Database常駐のPL/SQLプロシージャまたはファンクションをTimesTenのパススルーでコールすることはできません。TimesTenで実行できるようにするには、プロシージャおよびファンクションをTimesTenで定義する必要があります。(「TimesTen Cacheを使用したTimesTen PL/SQL」も参照してください。)

- PL/SQLおよびデータベース・オブジェクトの名前: TimesTenでは、PL/SQLオブジェクト(プロシージャ、ファンクションおよびパッケージ)に、非ASCIIまたは引用符で囲まれた大文字以外の名前を使用できません。また、PL/SQLオブジェクトの名前を引用符で囲んだ場合、後続の空白はサポートされていません。さらに、PL/SQLに渡される表およびビューなどオブジェクトの名前が引用符で囲まれている場合、後続の空白はそのまま削除されます。

- 定義者権限および実行者権限によって、PL/SQLプロシージャまたはファンクションで使用されるSQLオブジェクトへのアクセスが決定されます。詳細は、「定義者権限および実行者権限」を参照してください。

- プロシージャまたはファンクションのコンパイル中にエラーが発生した場合の情報の入手方法については、「ttIsqlでのエラーの表示」を参照してください。

例2-14 OUTパラメータを使用したプロシージャの作成と実行

この例では、OUTパラメータを使用するプロシージャを作成し、無名ブロックでプロシージャを実行して、OUT値を表示します。プロシージャは、従業員IDを入力として受け取り、従業員の給与とジョブIDを出力します。

Command>  CREATE OR REPLACE PROCEDURE get_employee
>    (p_empid in employees.employee_id%TYPE,
>     p_sal OUT employees.salary%TYPE,
>     p_job OUT employees.job_id%TYPE) IS
> BEGIN
>   SELECT salary,job_id
>   INTO p_sal, p_job
>   FROM employees
>   WHERE employee_id = p_empid;
> END;
> /

Procedure created.

Command> VARIABLE v_salary NUMBER;
Command> VARIABLE v_job VARCHAR2(15);
Command> BEGIN
>   GET_EMPLOYEE (120, :v_salary, :v_job);
> END;
> /

PL/SQL procedure successfully completed.

Command> PRINT
V_SALARY             : 8000
V_JOB                : ST_MAN

Command> SELECT salary, job_id FROM employees WHERE employee_id = 120;
< 8000, ST_MAN >
1 row found.

注意:
前の例で示されている無名ブロックを使用するかわりに、CALL文を使用することもできます。

Command> CALL GET_EMPLOYEE(120, :v_salary, :v_job);

例2-15 ファンクションの作成とコール

この例では、入力として従業員IDを指定して従業員の給与を戻すファンクションを作成し、このファンクションをコールして戻された結果を表示します。

Command> CREATE OR REPLACE FUNCTION get_sal
>   (p_id employees.employee_id%TYPE) RETURN NUMBER IS
>    v_sal employees.salary%TYPE := 0;
> BEGIN
>   SELECT salary INTO v_sal FROM employees
>     WHERE employee_id = p_id;
>   RETURN v_sal;
> END get_sal;
> /

Function created.

Command> variable n number;
Command> call get_sal(100) into :n;
Command> print n;
N                    : 24000

注意:
前の例で示されているCALL文を使用するかわりに、無名ブロックを使用することもできます。

Command> begin
>   :n := get_sal(100);
> end;
> /

プロシージャおよびファンクションのシノニムの使用

TimesTenは、PL/SQLプロシージャ、ファンクション、パッケージなどのデータベース・オブジェクトのプライベートおよびパブリック・シノニム(エイリアス)をサポートしています。シノニムは、オブジェクト名およびオブジェクト所有者をマスクしたり、SQL文を単純化する際によく使用されます。

次のように、スキーマ内にプロシージャfooのプライベート・シノニムを作成します。

CREATE SYNONYM synfoo FOR foo;

次のように、パブリック・シノニムを作成します。

CREATE PUBLIC SYNONYM pubfoo FOR foo;

プライベート・シノニムは特定のユーザーのスキーマ内に存在し、表、ビューおよび順序などのデータベース・オブジェクトと同じネームスペースを共有します。プライベート・シノニムの名前は、同じスキーマ内の表などのオブジェクト名と同じにすることはできません。

パブリック・シノニムは、特定のスキーマに属しておらず、すべてのユーザーからアクセス可能で、プライベート・オブジェクトと同じ名前を使用できます。

シノニムを使用するには、その基になるオブジェクトへの適切なアクセス権限を持っている必要があります。シノニムの作成や削除に必要な権限については、「PL/SQL文およびPL/SQL操作に必要な権限」を参照してください。

シノニムに関する一般的な情報については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のシノニムの理解に関する説明を参照してください。CREATE SYNONYMおよびDROP SYNONYM文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

例2-16 プロシージャでのシノニムの使用

次の例では、USER1は、スキーマにプロシージャを作成し、そのパブリック・シノニムを作成します。次に、USER2は、パブリック・シノニムを使用してプロシージャを実行します。次の状況を想定しています。

- USER1には、CREATE SESSION権限、CREATE PROCEDURE権限、およびCREATE PUBLIC SYNONYM権限が付与されています。

- USER2には、CREATE SESSION権限、EXECUTE ANY PROCEDURE権限が付与されています。

- どちらのユーザーもデータベースに接続しています。

- USER2は、SET SERVEROUTPUT ON設定を使用しています。

USER1:

Command> create or replace procedure test is
> begin
> dbms_output.put_line('Running the test');
> end;
> /

Procedure created.

Command> create public synonym pubtest for test;

Synonym created.

USER2:

Command> begin
> pubtest;
> end;
> /
Running the test

PL/SQL procedure successfully completed.

PL/SQLパッケージ

この項では、PL/SQLパッケージの作成および使用方法について説明します。

TimesTenに付属のPL/SQLパッケージの詳細は、第8章「TimesTenが提供するPL/SQLパッケージ」を参照してください。

パッケージの概念

パッケージは、論理的に関連するPL/SQLデータ型、変数およびサブプログラムをグループ化したデータベース・オブジェクトです。パッケージを指定した後、その本体を個別の手順で定義します。

パッケージ仕様部はパッケージに対するインタフェースで、パッケージの有効範囲外で参照できるパブリックなデータ型、変数、定数、例外、カーソルおよびサブプログラムを宣言します。本体では、仕様部で宣言したオブジェクト以外に、カーソルの問合せ、サブプログラムのコードおよびパッケージ外のアプリケーションからは参照できないプライベートなオブジェクトを定義します。

TimesTenでは、パッケージ仕様部をパッケージ本体とは別にデータベースに格納します。パブリックなプログラム・オブジェクトをコールまたは参照する他のスキーマ・オブジェクトは、パッケージ本体ではなく、パッケージ仕様部にのみ依存します。

注意:
パッケージおよびパッケージ本体を作成する構文は、Oracle Databaseと同様ですが、Oracle Databaseのマニュアルに記載されているDBMSSTDX.SQLというスクリプトの実行については、TimesTenには該当しません。

パッケージの作成および使用

パッケージを作成してデータベースに永続的に格納するには、CREATE PACKAGE文およびCREATE PACKAGE BODY文を使用します。

新しいパッケージを作成するには、次の手順を実行します。

1. CREATE PACKAGE文でパッケージ仕様部を作成します。
パッケージ仕様部ではプログラム・オブジェクトを宣言できます。このようなオブジェクトはパブリック・オブジェクトと呼ばれ、パッケージ内の他のオブジェクト、およびパッケージの外部からも参照できます。

すでにパッケージが存在している場合にそのパッケージ仕様部を置換するには、オプションでCREATE OR REPLACE PACKAGEを使用します。

2. CREATE PACKAGE BODY(またはCREATE OR REPLACE PACKAGE BODY)文を使用して、パッケージ本体を作成します。
パッケージ本体ではプログラム・オブジェクトを宣言および定義できます。

- パッケージ仕様部で宣言したパブリック・オブジェクトを定義する必要があります。

- プライベート・オブジェクトと呼ばれる追加のパッケージ・オブジェクトを宣言および定義できます。プライベート・オブジェクトは、パッケージ内の他のオブジェクトからのみ参照できるよう、パッケージ仕様部ではなくパッケージ本体で宣言します。パッケージの外部からは参照できません。

パッケージのメンバーであるプロシージャおよびファンクションを明示的にコンパイルするか、またはコンパイル・オプションを変更する場合は、ALTER PACKAGEを使用します。

CREATE PACKAGE、CREATE PACKAGE BODYおよびALTER PACKAGE文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

注意:

- レプリケーションを使用する場合、PL/SQLファンクション、プロシージャおよびパッケージのCREATE文などのPL/SQL DDL文はレプリケートされません。これを解決する手順については、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』のアクティブ・スタンバイ・ペアでの新しいPL/SQLの作成および既存のレプリケーション・スキームへのPL/SQLへの追加に関する説明を参照してください。

- パッケージのコンパイル中にエラーが発生した場合の情報の入手方法については、「ttIsqlでのエラーの表示」を参照してください。

例2-17 パッケージの作成および使用

新しい従業員を雇用したときに従業員表に1行追加するケース、および従業員が退社したときに従業員表から1行削除するケースについて考えてみます。次の例では、これらのタスクを実行する2つのプロシージャを作成して、1つのパッケージにまとめます。パッケージには、特定の従業員よりも給与が高い従業員の数を返すファンクションも含まれています。例では、この後ファンクションおよびプロシージャを実行して、結果を確認しています。

Command> CREATE OR REPLACE PACKAGE emp_actions AS
>   PROCEDURE hire_employee (employee_id NUMBER,
>     last_name VARCHAR2,
>     first_name VARCHAR2,
>     email VARCHAR2,
>     phone_number VARCHAR2,
>     hire_date DATE,
>     job_id VARCHAR2,
>     salary NUMBER,
>     commission_pct NUMBER,
>     manager_id NUMBER,
>     department_id NUMBER);
>   PROCEDURE remove_employee (emp_id NUMBER);
>   FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER;
> END emp_actions;
> /

Package created.

Command> -- Package body:
> CREATE OR REPLACE PACKAGE BODY emp_actions AS
> -- Code for procedure hire_employee:
>   PROCEDURE hire_employee (employee_id NUMBER,
>     last_name VARCHAR2,
>     first_name VARCHAR2,
>     email VARCHAR2,
>     phone_number VARCHAR2,
>     hire_date DATE,
>     job_id VARCHAR2,
>     salary NUMBER,
>     commission_pct NUMBER,
>     manager_id NUMBER,
>     department_id NUMBER) IS
>   BEGIN
>     INSERT INTO employees VALUES (employee_id,
>       last_name,
>       first_name,
>       email,
>       phone_number,
>       hire_date,
>       job_id,
>       salary,
>       commission_pct,
>       manager_id,
>       department_id);
>   END hire_employee;
> -- Code for procedure remove_employee:
>   PROCEDURE remove_employee (emp_id NUMBER) IS
>   BEGIN
>     DELETE FROM employees WHERE employee_id = emp_id;
>   END remove_employee;
> -- Code for function num_above_salary:
>   FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER IS
>     emp_sal NUMBER(8,2);
>     num_count NUMBER;
>   BEGIN
>     SELECT salary INTO emp_sal FROM employees
>     WHERE employee_id = emp_id;
>     SELECT COUNT(*) INTO num_count FROM employees
>     WHERE salary > emp_sal;
>     RETURN num_count;
>   END num_above_salary;
> END emp_actions;
> /

Package body created.

Command> BEGIN
> /* call function to return count of employees with salary
>    greater than salary of employee with employee_id = 120
> */
>   DBMS_OUTPUT.PUT_LINE
>     ('Number of employees with higher salary: ' ||
>       TO_CHAR(emp_actions.num_above_salary(120)));
> END;
> /
Number of employees with higher salary: 33

PL/SQL procedure successfully completed.

33という数を確認します。

Command> SELECT salary FROM employees WHERE employee_id = 120;
< 8000 >
1 row found.

Command> SELECT COUNT (*) FROM employees WHERE salary > 8000;
< 33 >
1 row found.

ここで従業員を追加して、結果を確認します。次に、従業員を削除して、その従業員がemployees表から削除されたことを確認します。

Command> BEGIN
>   emp_actions.hire_employee(300,
>     'Belden',
>     'Enrique',
>     'EBELDEN',
>     '555.111.2222',
>     '31-AUG-04',
>     'AC_MGR',
>     9000,
>     .1,
>     101,
>     110);
> END;
> /

PL/SQL procedure successfully completed.

Command> SELECT * FROM employees WHERE employee_id = 300;
< 300, Belden, Enrique, EBELDEN, 555.111.2222, 2004-08-31 00:00:00, AC_MGR, 9000,
.1, 101, 110 >
1 row found.
Command> BEGIN
>   emp_actions.remove_employee (300);
> END;
> /

PL/SQL procedure successfully completed.

Command> SELECT * FROM employees WHERE employee_id = 300;
0 rows found.

パッケージのシノニムの使用

TimesTenは、PL/SQLプロシージャ、ファンクション、パッケージなどのデータベース・オブジェクトのプライベートおよびパブリック・シノニム(エイリアス)をサポートしています。シノニムは、オブジェクト名およびオブジェクト所有者をマスクしたり、SQL文を単純化する際によく使用されます。

スキーマ内でパッケージfoopkgのプライベート・シノニムを作成する場合:

CREATE SYNONYM synfoopkg FOR foopkg;

foopkgのパブリック・シノニムを作成する場合:

CREATE PUBLIC SYNONYM pubfoopkg FOR foopkg;

また、「プロシージャおよびファンクションのシノニムの使用」および「PL/SQL文およびPL/SQL操作に必要な権限」も参照してください。

注意:
パッケージの各メンバー・サブプログラムに対するシノニムを作成することはできません。
次は有効です。

create or replace public synonym pubtestpkg for testpkg;

次は無効です。

create or replace public synonym pubtestproc for testpkg.testproc;

PL/SQLのソース・コードのラップ

ラップとは、PL/SQLソース・コードを隠す処理のことです。入力用SQLファイルを処理して、パッケージ仕様部、パッケージ本体、ファンクション、プロシージャなど、ファイル内のPL/SQLユニットのみをラップするwrapユーティリティで、PL/SQLのソース・コードをラップすることができます。

次の例では、ファイルwrap_test.sqlを使用してwraptestという名前のプロシージャを定義して検討します。その後wrapユーティリティを使用してwrap_test.sqlを処理します。このプロシージャは、ソース・コード非表示として作成され、正常に実行されます。最終的に、ALL_OBJECTSビューが問い合せられ、ラップされたソース・コードが表示されます。

wrap_test.sqlの内容は次のとおりです。

CREATE OR REPLACE PROCEDURE wraptest IS
TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
all_emps emp_tab;
BEGIN
SELECT * BULK COLLECT INTO all_emps FROM employees;
FOR i IN 1..10
LOOP
DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).employee_id);
END LOOP;
END;
/

次の例で、"$"はUNIXのプロンプト、"Command>"はttIsqlのプロンプトを表し、ユーザー入力は太字で表示されます。

$ wrap iname=wrap_test.sql

PL/SQL Wrapper: Release 11.2.0.2.0- Production on Wed Sep 14 12:59:27 2011

Copyright (c) 1993, 2009, Oracle.  All rights reserved.

Processing wrap_test.sql to wrap_test.plb

$ cat wrap_test.plb
CREATE OR REPLACE PROCEDURE wraptest wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
124 12c
YZ6L0v2ntFaqttW8hSJD5IHIYccwg+nwNfZqfHQCv/9kMJyznwdLh8FepNXpWS1fzVBDkTke
LWlhFdFzCMfmmJ5GGrCwrqgngEhfRpq7ck5Dzsf7sDlnQeE3QGmb/yu9Dec1+JO2kOMlx3dq
BuC7fR2f5sjDtBeDXiGCC0kJ5QBVregtoBckZNO9MoiWS4w0jF6T1CPY0Aoi/KUwxC8S8I8n
amF5xGQDCYTDajs77orIGEqtX747k0YAO+r1e9adGUsVgZK1ONcTM/+Wit+LYKi7b03eJxdB
+aaKn/Lh

/

$ ttisql sampledb_1122

Copyright (c) 1996-2011, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=sampledb_1122";
Connection successful:
DSN=sampledb_1122;UID=myuserid;DataStore=.../install/info/DemoDataStore/
sampledb_1122;DatabaseCharacterSet=US7ASCII;ConnectionCharacterSet=US7ASCII;DRIVER
=.../install/lib/libtten.so;PermSize=40;TempSize=32;TypeMode=0;
(Default setting AutoCommit=1)

Command> @wrap_test.plb

CREATE OR REPLACE PROCEDURE wraptest wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
124 12c
YZ6L0v2ntFaqttW8hSJD5IHIYccwg+nwNfZqfHQCv/9kMJyznwdLh8FepNXpWS1fzVBDkTke
LWlhFdFzCMfmmJ5GGrCwrqgngEhfRpq7ck5Dzsf7sDlnQeE3QGmb/yu9Dec1+JO2kOMlx3dq
BuC7fR2f5sjDtBeDXiGCC0kJ5QBVregtoBckZNO9MoiWS4w0jF6T1CPY0Aoi/KUwxC8S8I8n
amF5xGQDCYTDajs77orIGEqtX747k0YAO+r1e9adGUsVgZK1ONcTM/+Wit+LYKi7b03eJxdB
+aaKn/Lh

Procedure created.

Command> SET SERVEROUTPUT ON
Command> BEGIN
>    wraptest();
> END;
> /
Emp Id: 100
Emp Id: 101
Emp Id: 102
Emp Id: 103
Emp Id: 104
Emp Id: 105
Emp Id: 106
Emp Id: 107
Emp Id: 108
Emp Id: 109

PL/SQL procedure successfully completed.

Command> SELECT text FROM all_source WHERE name = 'WRAPTEST';

< PROCEDURE wraptest wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
124 12c
YZ6L0v2ntFaqttW8hSJD5IHIYccwg+nwNfZqfHQCv/9kMJyznwdLh8FepNXpWS1fzVBDkTke
LWlhFdFzCMfmmJ5GGrCwrqgngEhfRpq7ck5Dzsf7sDlnQeE3QGmb/yu9Dec1+JO2kOMlx3dq
BuC7fR2f5sjDtBeDXiGCC0kJ5QBVregtoBckZNO9MoiWS4w0jF6T1CPY0Aoi/KUwxC8S8I8n
amF5xGQDCYTDajs77orIGEqtX747k0YAO+r1e9adGUsVgZK1ONcTM/+Wit+LYKi7b03eJxdB
+aaKn/Lh

>
1 row found.

TimesTenにおける相違点: トランザクション動作

TimesTenでは、トランザクションを終了する操作は、接続と関連付けられているすべてのカーソルをクローズします。これには次のものがあります。

- COMMIT文またはROLLBACK文

- PL/SQLユーザーの場合は、DDL文
これは、PL/SQLが有効になっている場合(PLSQL初期接続属性が1に設定されている場合)、TimesTen DDLCommitBehavior一般接続属性はOracle Databaseの動作(自動コミットDDL)を示す0に設定されている必要があるためです。

たとえば、一連のプロシージャを再コンパイルする次のシナリオを検討します。初回のALTER PROCEDUREの実行に、カーソル(pnamecurs)がクローズされるため、これは機能しません。

declare
cursor pnamecurs is select * from all_objects where object_name like 'MYPROC%';
begin
for rec in pnamecurs loop
execute immediate 'alter procedure ' || rec.object_name || ' compile';
end loop;
end;

そのかわりに、次のようにすると、すべてのプロシージャ名を内部表にフェッチしてから、アクティブなカーソルがないものに対してALTER PROCEDUREを実行することができます。

declare
cursor pnamecurs is select * from all_objects where object_name like 'MYPROC%';
type tbl is table of c%rowtype index by binary_integer;
myprocs tbl;

begin
open pnamecurs;
fetch pnamecurs bulk collect into myprocs;
close pnamecurs;
for i in 1..myprocs.count loop
execute immediate 'alter procedure ' || myprocs(i).object_name || ' compile';
end loop;
end;

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

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

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

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

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

- データ型環境の理解

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

- データ型の変換

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

データ型環境の理解

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

- PL/SQLデータ型を使用する変数および定数を含むPL/SQLプログラム

- データベースの行、列および定数を使用するTimesTen SQL文
これらの要素は、TimesTen SQLデータ型を使用して表されます。

- データベースおよびPL/SQLプログラミング言語と相互作用するアプリケーション・プログラム
アプリケーション・プログラムは、CやJavaなどのプログラミング言語で作成され、これらのプログラミング言語のデータ型を使用する変数および定数を含みます。

表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、double、String

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

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

この項では、次のトピックについて説明します。

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

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

- PL/SQLの複合データ型

- PL/SQL REF CURSOR

詳細は、『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(各国語キャラクタCHAR)

NVARCHAR2(各国語キャラクタVARCHAR2)

BINARY

RAW

BOOLEAN

BOOLEAN

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

DATETIME

DATE

TIMESTAMP

INTERVAL

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECONDS

ROWID

ROWID

LOB

BLOB(バイナリLOB)

CLOB(キャラクタLOB)

NCLOB(各国語キャラクタLOB)

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

例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と異なるのは、オーバーフローが発生しないという点です。

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

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

ROWIDデータ型

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

アプリケーションでは、SQL文のWHERE句などで、一重引用符で囲んだCHAR定数としてリテラルのROWID値を指定できます。

また、ROWIDおよびROWIDデータ型の使用方法や存続期間の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のROWIDデータ型およびROWIDに関する説明も参照してください。

LOBデータ型

LOB(ラージ・オブジェクト)型ファミリには、CLOB(キャラクタLOB)、NCLOB(各国語キャラクタLOB)、およびBLOB(バイナリLOB)が含まれています。

LOBは、LOBロケータおよびLOB値で構成されています。ロケータは、値へのハンドルとして機能します。たとえば、アプリケーションがLOBを選択する場合、またはパラメータとしてLOBを渡す場合、それは実際の値ではなくロケータを使用しています。

LOBは、永続的または一時的のいずれかに設定できます。永続LOBは、データベース内の特にLOB列の行に存在します。一時LOBはプログラム内で内部的に使用されますが、その後、そのLOBをデータベース内のLOB列に挿入して永続LOBにすることもできます。

TimesTenでのLOBの追加情報は、『Oracle TimesTen In-Memory Database SQLリファレンス』のLOBのデータ型に関する説明を参照してください。

また、使用方法については、「ラージ・オブジェクト(LOB)」も参照してください。

PL/SQLの複合データ型

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

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

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

- ネストした表

- VARRAY

- レコード

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

次の項で、複合データ型の使用について説明します。

- PL/SQLでのコレクションの使用

- PL/SQLでのレコードの使用

- アプリケーションからの連想配列の使用

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

PL/SQLでのコレクションの使用

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

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

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

この例では、コレクション型staff_listをemployee_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サブプログラム間ではどのコレクションもパラメータとして渡すことができますが、TimesTenでは、PL/SQLと他の言語で記述されたアプリケーションの間で渡すことができるのは連想配列だけです。(以降の「アプリケーションからの連想配列の使用」を参照してください。)

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

PL/SQLでのレコードの使用

レコードは、異なるデータ型を持つフィールドで構成された複合データ構造です。レコードは、単一のパラメータでサブプログラムに渡すことができます。例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
>   ...
> END;
> /

アプリケーションからの連想配列の使用

TimesTen PL/SQLでは、以前は索引付き表またはPL/SQL表と呼ばれていた連想配列が、OCI、Pro*C/C++、またはJDBCアプリケーションなどからのIN、OUTまたはIN OUTバインド・パラメータとしてサポートされます。これにより、データの配列をアプリケーションとデータベースの間で効率的に渡すことができます。

連想配列は、キー/値ペアのセットです。TimesTenでは、連想配列バインドの場合(PL/SQL内のみで連想配列を使用する場合を除く)、キー(索引)は整数(BINARY_INTEGERまたはPLS_INTEGER)である必要があります。値は、同じデータ型の単純なスカラー値である必要があります。たとえば、部門番号で索引付けされた部門マネージャの配列を使用できます。索引は、作成された順序ではなく、ソートされた順序で格納されます。

連想配列型を宣言した後、次の例のようにPL/SQLの連想配列を宣言できます(INDEX BYに注目)。

declare
TYPE VARCHARARRTYP IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
x VARCHARARRTYP;
...

以降の例3-4および「連想配列の使用」の例を参照してください。

『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTen OCIにおけるの連想配列バインドおよびTimesTen Pro*C/C++における連想配列バインドに関する説明、および『Oracle TimesTen In-Memory Database Java開発者ガイド』の連想配列のバインドに関する説明も参照してください。

連想配列に関する一般的な情報については、『Oracle Database PL/SQL言語リファレンス』の連想配列に関する説明を参照してください。

注意:
TimesTenでは、次の制限に注意してください。

- 次のLOB、REF CURSOR、TIMESTAMP、ROWIDの型は、連想配列のバインドではサポートされていません。

- 連想配列バインドは、パススルー文では許可されません。

- TimesTenのプログラミングAPIでは、配列の一般的なバルク・バインドはサポートされていません。VARRAYおよびネストした表は、バインド・パラメータとしてサポートされていません。

次の例では、連想配列の簡単な操作を行い、ttIsqlから効率的に連想配列をバインドし、配列を出力します。

例3-4 ttIsqlからの連想配列の使用

Command> var lngvc[1000] varchar2(30);
Command> declare
> TYPE VARCHARARRTYP IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
> x VARCHARARRTYP;
> begin
>   x := :lngvc;
>   x ( 1 ) := 'One';
>   x ( 10 ) := 'Ten';
>   :lngvc := x;
> end;
> /

PL/SQL procedure successfully completed.

Command> print lngvc;
LNGVC                : ARRAY [ 1000 ] (Current Size 10)
LNGVC[1] : One
LNGVC[2] : <NULL>
LNGVC[3] : <NULL>
LNGVC[4] : <NULL>
LNGVC[5] : <NULL>
LNGVC[6] : <NULL>
LNGVC[7] : <NULL>
LNGVC[8] : <NULL>
LNGVC[9] : <NULL>
LNGVC[10] : Ten

PL/SQL REF CURSOR

REF CURSORは、PL/SQLとアプリケーション間でパラメータとして渡すことのできる、SQL結果セットに対するカーソルへのハンドルです。TimesTenでは、PL/SQLからアプリケーションへのOUT REF CURSORをサポートしています。アプリケーションは、PL/SQL内でREF CURSORをオープンし、適用可能なAPIでそれを渡し、結果セットをフェッチします。

TimesTenでは、ダイレクト接続またはクライアント/サーバー接続のいずれかのために、ODBC、JDBC、ODP.NET、OCI、Pro*C/C++およびTTClassesでREF CURSORがサポートされています。REF CURSORについては、次のTimesTenドキュメントでも説明しています。

- 『Oracle TimesTen In-Memory Database C開発者ガイド』のREF CURSORの使用に関する説明

- 『Oracle TimesTen In-Memory Database Java開発者ガイド』のREF CURSORの使用に関する説明

- 『Oracle TimesTen In-Memory Database TTClassesガイド』のREF CURSORの使用に関する説明

注意:
TimesTenでは、文1つにつき1つのOUT REF CURSORがサポートされています。

Oracle Databaseで行うときと同じ方法で、TimesTenでもPL/SQLでREF CURSORを定義できます。(『Oracle Database PL/SQL言語リファレンス』のカーソル変数に関する説明を参照。)REF CURSORは通常はメタタイプとして使用され、ご使用のデータに合せて強力な(固有の) REF CURSOR型を定義し、その型のカーソル変数を宣言します。次に例を示します。

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

例3-5 出力パラメータとしてのREF CURSORの使用

この例では、FOO_PACKパッケージのGET_EMPプロシージャを作成して、employees表から従業員情報を取得します。プロシージャではREF CURSOR型のcursor_outを宣言し、その型を出力パラメータとして使用します。

まず、パッケージ定義、REF CURSOR型およびプロシージャ定義を指定します。

create or replace package foo_pack is
type cursor_out is ref cursor;
procedure get_emp (results out cursor_out);
end foo_pack;

その後、パッケージ本体とプロシージャ実装を指定します。

create or replace package body foo_pack as
procedure get_emp (results out cursor_out) is
begin
open results for select employee_id, last_name from employees
where employee_id < 110 order by last_name;
end get_emp;
end foo_pack;

出力用にREF CURSOR変数を宣言し、プロシージャを実行して、結果を表示します。PL/SQLの外部で宣言できるのは弱い(汎用的な) REF CURSORのみであることに注意してください。

Command> var proc_result refcursor;
Command> exec foo_pack.get_emp(:proc_result);

PL/SQL procedure successfully completed.

Command> print proc_result;
PROC_RESULT          :
< 105, Austin >
< 102, De Haan >
< 104, Ernst >
< 109, Faviet >
< 108, Greenberg >
< 103, Hunold >
< 100, King >
< 101, Kochhar >
< 107, Lorentz >
< 106, Pataballa >
10 rows found.

または、弱い型指定のREF CURSOR変数はFOO_PACKで宣言できます。

create or replace package foo_pack is
procedure get_emp (results out sys_refcursor);
end foo_pack;

create or replace package body foo_pack as
procedure get_emp (results out sys_refcursor) is
begin
open results for select employee_id, last_name from employees
where employee_id < 110 order by last_name;
end get_emp;
end foo_pack;

データ型の変換

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

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

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

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

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

TimesTenでは、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.

注意:
「日付書式およびタイムスタンプ書式: NLS_DATE_FORMATおよびNLS_TIMESTAMP_FORMAT」も参照してください。

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

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

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

表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_REFCURSOR

REF CURSOR

SQL_TIMESTAMP

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

SQL_VARCHAR

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

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

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

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-7 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のデータ型との間の変換

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

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

- TimesTen型モードでの長さゼロの文字列

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

TimesTenでは、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-8 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設定はサポートされていません。

- 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では、インターネット・データ型(XMLType、URIType、HttpURIType)またはAnyデータ型(AnyType、AnyData、AnyDataSet)はサポートされていません。

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

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

TimesTen型モードでの長さゼロの文字列

TimesTen型モードでは、下位互換性をサポートしているため、TimesTenは文字列の値""を、Null値ではなく空、つまり長さゼロの文字列とみなします。ただし、PL/SQLでは、長さゼロの文字列は、常にnullとみなされます。値が空の文字列であるパラメータが、PL/SQLで実行されるSQL文に渡された場合、SQL文は、パラメータがPL/SQLによってNULLに変換された後で、TimesTenに渡されます。

このモードの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のTimesTen型モード(下位互換性)に関する説明を参照してください。

4 エラーと例外の処理

この章では、PL/SQLプログラムで使用できる、柔軟なエラー・トラップとエラー処理について説明します。

PL/SQLにおけるエラー処理と例外の詳細は、『Oracle Database PL/SQL言語リファレンス』のPL/SQLエラーの処理に関する説明を参照してください。

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

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

- 例外の理解

- 例外のトラップ

- ttIsqlでのエラーの表示

- TimesTenにおける相違点: 例外処理およびエラー動作

例外の理解

この項では、PL/SQLプログラミングにおける例外の概要を説明します。内容は次のとおりです。

- 例外について

- 例外のタイプ

例外について

例外とは、プログラムの実行中に(TimesTenによって暗黙的に、またはプログラムによって明示的に)呼び出されるPL/SQLエラーのことです。例外を処理するには、ハンドラでトラップするか、またはコール元の環境に伝播します。

たとえば、SELECT文が複数の行を戻す場合、TimesTenは実行時にエラー(例外)を戻します。次の例に示すとおり、TimesTenエラー8507が表示され、次に関連するORAエラー・メッセージが表示されます。(Oracle Databaseで元々定義されているORAメッセージが、TimesTenでも同様に実装されています。)

Command> DECLARE
>  v_lname VARCHAR2 (15);
> BEGIN
>  SELECT last_name INTO v_lname
>  FROM employees
>  WHERE first_name = 'John';
>   DBMS_OUTPUT.PUT_LINE ('Last name is :' || v_lname);
>  END;
>  /

8507: ORA-01422: exact fetch returns more than requested number of rows
8507: ORA-06512: at line 4
The command failed.

プログラムが正常に完了するように、このような例外をPL/SQLブロックで処理できます。次に例を示します。

Command> DECLARE
>  v_lname VARCHAR2 (15);
> BEGIN
>  SELECT last_name INTO v_lname
>  FROM employees
>  WHERE first_name = 'John';
>   DBMS_OUTPUT.PUT_LINE ('Last name is :' || v_lname);
> EXCEPTION
>   WHEN TOO_MANY_ROWS THEN
>   DBMS_OUTPUT.PUT_LINE (' Your SELECT statement retrieved multiple
>   rows. Consider using a cursor.');
> END;
> /
Your SELECT statement retrieved multiple rows. Consider using a cursor.

PL/SQL procedure successfully completed.

例外のタイプ

例外には、次の3つのタイプがあります。

- 事前定義例外: PL/SQLで定義されているエラー条件です。

- 未定義例外: 標準のTimesTenエラーなどがあります。

- ユーザー定義例外: アプリケーション固有の例外です。

TimesTenでは、次の3つのタイプの例外がOracle Databaseと同様に使用されます。

例外

説明

処理方法

事前定義のTimesTenエラー

PL/SQLコードで最もよく発生する約20個のエラーの1つ

これらの例外は、宣言する必要がありません。TimesTenで事前に定義されています。エラーはTimesTenによって暗黙的に呼び出されます。

未定義のTimesTenエラー

その他の標準のTimesTenエラー

これらは、アプリケーションの宣言部で宣言する必要があります。エラーはTimesTenによって暗黙的に呼び出され、例外ハンドラを使用して捕捉できます。

ユーザー定義のエラー

アプリケーションによって定義され、呼び出されるエラー

これらは、宣言部で宣言する必要があります。開発者が明示的に例外を呼び出します。

例外のトラップ

この項では、事前定義のTimesTenエラーまたはユーザー定義のエラーをトラップする方法について説明します。

事前定義のTimesTenエラーのトラップ

事前定義のTimesTenエラーをトラップするには、例外処理ルーチンで事前定義の名前を参照します。PL/SQLでは、STANDARDパッケージで事前定義例外が宣言されています。

表4-1に、TimesTenでサポートされている事前定義例外、関連付けられているORAエラー番号とSQLCODE値、および例外の説明を示します。

「サポートされていない事前定義エラー」も参照してください。

表4-1 事前定義例外

例外名

Oracle Databaseエラー番号

SQLCODE

説明

ACCESS_INTO_NULL

ORA-06530

-6530

初期化されていないオブジェクトの属性に値を割り当てようとしました。

CASE_NOT_FOUND

ORA-06592

-6592

CASE文のWHEN句で何も選択されておらず、ELSE句もありません。

COLLECTION_IS_NULL

ORA-06531

-6531

EXISTS以外のコレクション・メソッドを初期化されていないネストした表やVARRAYに適用しようとしたか、または初期化されていないネストした表やVARRAYの要素に値を割り当てようとしました。

CURSOR_ALREADY_OPENED

ORA-06511

-6511

すでにオープンされているカーソルをオープンしようとしました。

DUP_VAL_ON_INDEX

ORA-00001

-1

プログラムは一意索引によって制約されている列に重複値を挿入しようとしました。

INVALID_CURSOR

ORA-01001

-1001

不正なカーソル操作があります。

INVALID_NUMBER

ORA-01722

-1722

文字列から数値への変換に失敗しました。

NO_DATA_FOUND

ORA-01403

+100

単一行のSELECTによって行が戻されなかったか、またはプログラムによって、ネストした表内の削除された要素や連想配列(索引付き表)内の初期化されていない要素が参照されました。

PROGRAM_ERROR

ORA-06501

-6501

PL/SQLに内部的な問題が発生しました。

ROWTYPE_MISMATCH

ORA-06504

-6504

代入文のホスト・カーソル変数とPL/SQLカーソル変数の戻り型に互換性がありません。

STORAGE_ERROR

ORA-06500

-6500

PL/SQLのメモリーが不足しているか、メモリーが破損しています。

SUBSCRIPT_BEYOND_COUNT

ORA-06533

-6533

コレクション内の要素の数より大きい索引番号を使用して、ネストした表またはVARRAYを参照しました。

SUBSCRIPT_OUTSIDE_LIMIT

ORA-06532

-6532

有効範囲外の索引番号(たとえば-1)を使用して、ネストした表またはVARRAYを参照しました。

SYS_INVALID_ROWID

ORA-01410

-1410

文字列がROWID値を表していないため、ユニバーサルROWIDへの文字列の変換に失敗しました。

TOO_MANY_ROWS

ORA-01422

-1422

単一行SELECTが複数の行を戻しました。

VALUE_ERROR

ORA-06502

-6502

算術、変換、切捨てまたはサイズ制限のエラーが発生しました。

ZERO_DIVIDE

ORA-01476

-1476

数値を0(ゼロ)で割ろうとしました。

例4-1 事前定義例外ZERO_DIVIDEの使用

この例のPL/SQLプログラムでは、数値を0で割ろうとします。事前定義例外ZERO_DIVIDEを使用して、例外処理ルーチン内でエラーをトラップします。

Command> DECLARE v_invalid PLS_INTEGER;
> BEGIN
>   v_invalid := 100/0;
> EXCEPTION
> WHEN ZERO_DIVIDE THEN
>   DBMS_OUTPUT.PUT_LINE ('Attempt to divide by 0');
> END;
> /
Attempt to divide by 0

PL/SQL procedure successfully completed.

ユーザー定義例外のトラップ

TimesTenのPL/SQLでは、ユーザー独自の例外を定義することができ、またPL/SQL RAISE文またはRAISE_APPLICATION_ERRORプロシージャで明示的にユーザー定義の例外を発生させることができます。

RAISE文の使用

RAISE文を使用すると、PL/SQLブロックまたはサブプログラムの通常の実行を停止し、制御を例外ハンドラに渡すことができます。RAISE文では、事前定義例外または自分で名前を付けたユーザー定義例外を呼び出すことができます。

例4-2 RAISE文を使用したユーザー定義例外のトラップ

この例では、部門番号500は存在しないため、departments表内の行は更新されません。RAISE文を使用して例外を明示的に呼び出し、SQLERRM組込みファンクションによって戻されるエラー・メッセージとSQLCODE組込みファンクションによって戻されるエラー・コードを表示します。例外ハンドラ内で、RAISE文を単独で使用して同じ例外を再度呼び出し、コール元の環境に伝播します。

Command> DECLARE
>   v_deptno NUMBER := 500;
>   v_name VARCHAR2 (20) := 'Testing';
>   e_invalid_dept EXCEPTION;
>  BEGIN
>   UPDATE departments
>   SET department_name = v_name
>   WHERE department_id = v_deptno;
>  IF SQL%NOTFOUND THEN
>     RAISE e_invalid_dept;
>  END IF;
>  ROLLBACK;
>  EXCEPTION
>    WHEN e_invalid_dept THEN
>    DBMS_OUTPUT.PUT_LINE ('No such department');
>    DBMS_OUTPUT.PUT_LINE (SQLERRM);
>    DBMS_OUTPUT.PUT_LINE (SQLCODE);
> END;
> /
No such department
User-Defined Exception
1

PL/SQL procedure successfully completed.

The command succeeded.

注意:
TimesTenとOracle Databaseでエラー条件が同じ場合、SQLCODEによって戻されるエラー・コードは同じですが、SQLERRMによって戻されるエラー・メッセージは同じとはかぎりません。このことについては、「TimesTenエラー・メッセージおよびSQLコード」でも説明しています。

RAISE_APPLICATION_ERRORプロシージャの使用

RAISE_APPLICATION_ERRORプロシージャは、PL/SQLプログラムの実行可能セクションまたは例外セクション(あるいはその両方)で使用します。TimesTenによってアプリケーションにエラーがレポートされるため、未処理例外を戻すのを回避できます。

-20,000から-20,999の範囲のエラー番号を使用します。メッセージには最大2,048バイトの文字列を指定します。

例4-3 RAISE_APPLICATION_ERRORプロシージャの使用

この例では、employees表からlast_name=Pattersonのデータを削除しようとします。RAISE_APPLICATION_ERRORプロシージャで、エラー番号-20201を使用してエラーを呼び出します。

Command> DECLARE
>   v_last_name employees.last_name%TYPE := 'Patterson';
> BEGIN
> DELETE FROM employees WHERE last_name = v_last_name;
> IF SQL%NOTFOUND THEN
>   RAISE_APPLICATION_ERROR (-20201, v_last_name || ' does not exist');
> END IF;
> END;
> /
8507: ORA-20201: Patterson does not exist
8507: ORA-06512: at line 6
The command failed.

ttIsqlでのエラーの表示

ttIsqlでshow errorsコマンドを使用すると、無名ブロックの実行時、あるいはパッケージ、プロシージャまたはファンクションのコンパイル時に発生するエラーの詳細を表示できます。この例を例4-4に示します。

例4-4 ttIsqlのエラー表示コマンド

もう一度、例2-17を考えてみます。そこで示されていたのと同じパッケージ仕様(プロシージャおよびファンクションhire_employee、remove_employeeおよびnum_above_salaryを宣言)を想定します。ただし、そこで示されていた本体の定義のかわりに、次のようにhire_employeeおよびnum_above_salary(remove_employeeは除外)の定義を検討します。

CREATE OR REPLACE PACKAGE BODY emp_actions AS
-- Code for procedure hire_employee:
PROCEDURE hire_employee (employee_id NUMBER,
last_name VARCHAR2,
first_name VARCHAR2,
email VARCHAR2,
phone_number VARCHAR2,
hire_date DATE,
job_id VARCHAR2,
salary NUMBER,
commission_pct NUMBER,
manager_id NUMBER,
department_id NUMBER) IS
BEGIN
INSERT INTO employees VALUES (employee_id,
last_name,
first_name,
email,
phone_number,
hire_date,
job_id,
salary,
commission_pct,
manager_id,
department_id);
END hire_employee;
-- Code for function num_above_salary:
FUNCTION num_above_salary (emp_id NUMBER) RETURN NUMBER IS
emp_sal NUMBER(8,2);
num_count NUMBER;
BEGIN
SELECT salary INTO emp_sal FROM employees
WHERE employee_id = emp_id;
SELECT COUNT(*) INTO num_count FROM employees
WHERE salary > emp_sal;
RETURN num_count;
END num_above_salary;
END emp_actions;
/

元々のパッケージ仕様の後でこの本体の定義を試みると、次のようになります。

Warning: Package body created with compilation errors.

さらに情報を取得するには、ttIsqlを実行して、コマンドshow errorsを使用します。この例では、show errorsの結果は次のようになります。

Command> show errors;
Errors for PACKAGE BODY EMP_ACTIONS:

LINE/COL ERROR
-------- -----------------------------------------------------------------
13/13    PLS-00323: subprogram or cursor 'REMOVE_EMPLOYEE' is declared in a
package specification and must be defined in the package body

TimesTenにおける相違点: 例外処理およびエラー動作

TimesTen PL/SQLとOracle Database PL/SQLで異なるエラー関連の動作に注意する必要があります。

- 未処理例外に対するTimesTen PL/SQLのトランザクションおよびロールバック動作

- TimesTenエラー・メッセージおよびSQLコード

- PL/SQLで表示されない警告

- サポートされていない事前定義エラー

- クリーン・コンパイル後の実行時エラーの可能性(Oracle Database SQLパーサーを使用)

- 実行時のTimesTen式の使用

未処理例外に対するTimesTen PL/SQLのトランザクションおよびロールバック動作

トランザクションの途中でPL/SQLが実行され、PL/SQLの実行中に未処理例外が発生した場合、TimesTen PL/SQLの処理は、Oracle Database PL/SQLでの処理と異なります。Oracle Databaseは無名ブロックの先頭までロールバックします。TimesTenはロールバックしません。

次の例に示すとおり、PL/SQLブロックの実行の結果発生した例外を常にアプリケーションで処理し、自動コミットを無効にしてアプリケーションを実行する必要があります。

create table mytable (num int not null primary key);
set serveroutput on

insert into mytable values(1);
begin
insert into mytable values(2);
insert into mytable values(1);
exception
when dup_val_on_index then
dbms_output.put_line('oops:' || sqlerrm);
rollback;
end;

select * from mytable;

commit;

2番目のINSERTは、値が一意である必要があるため失敗し、これにより、例外が発生して、プログラムはロールバックを実行します。TimesTenでは、これを実行すると次のような結果になります。

oops:TT0907: Unique constraint (MYTABLE) violated at Rowid <BMUFVUAAABQAAAADjq>

select * from mytable;
0 rows found.

結果はOracle Databaseの場合と同様で、SELECTの結果に行は表示されません。

ここで、例外が処理されないTimesTenの例を考えてみます。自動コミットを無効にし、この例を再実行します。

create table mytable (num int not null primary key);
set serveroutput on

insert into mytable values(1);
begin
insert into mytable values(2);
insert into mytable values(1);
end;

select * from mytable;

commit;

TimesTenでは、SELECT問合せは最初の2つの挿入の実行を指示します。

907: Unique constraint (MYTABLE) violated at Rowid <BMUFVUAAABQAAAADjq>
8507: ORA-06512: at line 3
The command failed.

select * from mytable;
< 1 >
< 2 >
2 rows found.

これをOracle Databaseで実行すると、PL/SQLブロックの先頭にロールバックされるため、SELECTの結果は最初の挿入のみの実行を示します。

ORA-00001: unique constraint (SYSTEM.SYS_C004423) violated
ORA-06512: at line 3

NUM
----------
1

注意:

- PL/SQLブロックに未処理例外がある場合、TimesTenではトランザクションがオープンのままになるため、アプリケーションでその状態を評価して適切なアクションを判断する必要があります。

- TimesTenのアプリケーションでは、現在のトランザクションでコミットされていない変更内容がある間はPL/SQLブロックを実行しないでください(ただし、変更内容とPL/SQL操作によって単一の論理作業ユニットが構成され、そのアプリケーションが適切なアクションを決定できる場合を除きます)。このようなアクションには、たとえば、トランザクションの先頭へのロールバックなどがあります。

- 自動コミットが有効になっているときにTimesTenで未処理例外が発生した場合は、トランザクション全体がロールバックされます。

TimesTenエラー・メッセージおよびSQLコード

エラー条件が同じ場合、TimesTenでは、TimesTenが戻すエラー・メッセージとOracle Databaseが戻すメッセージが同じになることは保証されませんが、SQLコードは同じになります。そのため、SQLERRMファンクションによって戻される情報は異なる場合がありますが、SQLCODEファンクションによって戻される情報は同じになります。

詳細は、次の項または例を参照してください。

- 例4-2では、SQLERRMおよびSQLCODEを使用します。

- 特定のTimesTenエラー・メッセージの詳細は、『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』の警告とエラーに関する説明を参照してください。

- 一般的な情報は、『Oracle Database PL/SQL言語リファレンス』のSQLERRMファンクションおよびSQLCODEファンクションに関する説明を参照してください。

PL/SQLで表示されない警告

Oracle Databaseには実行時警告の概念がないため、Oracle Database PL/SQLでは警告はサポートされていません。

TimesTenには警告の概念がありますが、TimesTen PL/SQLの実装はOracle Database PL/SQLの実装に基づいているため、TimesTen PL/SQLでは警告はサポートされていません。

その結果、TimesTenではSQL文を実行してその結果発生する警告を表示できますが、同じ文をPL/SQLから実行した場合には、警告は表示されません。

サポートされていない事前定義エラー

「事前定義のTimesTenエラーのトラップ」には、TimesTenでサポートされている事前定義例外、関連付けられているORAエラー番号とSQLCODE値、および例外の説明が示されています。

表4-2に、TimesTenでサポートされていない事前定義例外を示します。

表4-2 TimesTenでサポートされていない事前定義例外

例外名

Oracle Databaseエラー番号

SQLCODE

説明

LOGIN_DENIED

ORA-01017

-1017

ユーザー名およびパスワードが無効です。

NOT_LOGGED_ON

ORA-01012

-1012

プログラムがデータベースに接続せずにデータベース・コールを発行しました。

SELF_IS_NULL

ORA-30625

-30625

プログラムがMEMBERメソッドを起動しようとしましたが、オブジェクトが初期化されていませんでした。

TIMEOUT_ON_RESOURCE

ORA-00051

-51

データベースでリソースを待機している間に、タイムアウトが発生しました。

クリーン・コンパイル後の実行時エラーの可能性(Oracle Database SQLパーサーを使用)

TimesTen PL/SQLの実装では、PL/SQLプログラムのコンパイル時に、Oracle Database SQLパーサーが使用されます。(これは、「TimesTenにおけるPL/SQLとOracle DatabaseにおけるPL/SQL」で説明されています。)そのため、TimesTenでサポートされていないOracle Databaseの構文または組込みプロシージャをプログラムで使用しても、コンパイル中は問題が検出されません。ただし、プログラムの実行中に実行時エラーが発生します。

実行時のTimesTen式の使用

TimesTen SQLには、Oracle Database SQLにはない構造がいくつか含まれています。PL/SQL言語には、これらの構造は含まれていません。PL/SQLからTimesTen固有のSQLを実行するには、EXECUTE IMMEDIATE文を使用してSQL文を実行します。これによりコンパイル・エラーを回避します。

TimesTen固有のSQLおよび式のリストについては、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のTimesTenおよびOracle Databases間の互換性に関する説明を参照してください。

EXECUTE IMMEDIATEの詳細は、「PL/SQLにおける動的SQL(EXECUTE IMMEDIATE文)」を参照してください。

5 PL/SQLでのTimesTen SQLの使用例

この章では、PL/SQLにおけるTimesTen SQLの密接な統合について詳細に検討するため、さらに例を示します。

- PL/SQLでSELECT...INTO文を使用する例

- INSERT文を使用する例

- 入力パラメータ、出力パラメータおよびバインド変数を使用する例

- カーソルを使用する例

- FORALLおよびBULK COLLECTを使用する例

- EXECUTE IMMEDIATEを使用する例

- RETURNING INTOを使用する例

- AUTHID句を使用する例

- システム・ビューを問い合せる例

PL/SQLでSELECT...INTO文を使用する例

単一行のデータを取得するには、SELECT... INTO文を使用します。1行も返さないか、または複数の行を返す問合せに対して、TimesTenはエラーを返します。

この項では、次の例を示します。

- SELECT... INTOを使用した給与合計の取得

- SELECT...INTOを使用した他のユーザーの表への問合せ

SELECT... INTOを使用した給与合計の取得

この例では、SELECT...INTO文を使用して、department_idが60の部門のすべての従業員の給与合計を計算します。

例5-1 SELECT... INTOを使用した給与合計の取得

Command> DECLARE
>   v_sum_sal  NUMBER (10,2);
>   v_dept_no  NUMBER NOT NULL := 60;
> BEGIN
>   SELECT SUM(salary) -- aggregate function
>   INTO v_sum_sal FROM employees
>   WHERE department_id = v_dept_no;
>   DBMS_OUTPUT.PUT_LINE ('Sum is ' || v_sum_sal);
>  END;
>  /
Sum is 28800

PL/SQL procedure successfully completed.

SELECT...INTOを使用した他のユーザーの表への問合せ

次の例では、USER1およびUSER2の2人のユーザーで、1人のユーザーがSELECT...INTOを使用してもう1人のユーザーの表に問い合せる方法を示しています。

例5-2 SELECT...INTOを使用した他のユーザーの表への問合せ

次の権限を想定します。

grant create session to user1;
grant create session to user2;
grant create table to user1;
grant select on user1.test to user2;

USER1:

Command> create table test(name varchar2(20), id number);
Command> insert into test values('posey', 363);
1 row inserted.

USER2:

Command> declare
>    targetid number;
> begin
>    select id into targetid from user1.test where name='posey';
>    dbms_output.put_line('Target ID is ' || targetid);
> end;
> /
Target ID is 363

PL/SQL procedure successfully completed.

INSERT文を使用する例

TimesTenでは、TimesTen DML文INSERT、UPDATE、DELETEおよびMERGEがサポートされています。この項では、INSERT文の例を示します。

例5-3 PL/SQLでINSERT文を使用する例

この例では、AS SELECT問合せ句を使用して表emp_copyを作成し、AUTOCOMMITをOFFに設定してemployee_idを増分するシーケンスを作成した後、PL/SQLのINSERT文を使用してデータ行を表emp_copyに挿入します。

Command> CREATE TABLE emp_copy AS SELECT * FROM employees;
107 rows inserted.
Command> SET AUTOCOMMIT OFF;

Command> CREATE SEQUENCE emp_copy_seq
> START WITH 207
> INCREMENT BY 1;

Command>  BEGIN
>    INSERT INTO emp_copy
>      (employee_id, first_name, last_name, email, hire_date, job_id,
>       salary)
>    VALUES (emp_copy_seq.NEXTVAL, 'Parker', 'Cores', 'PCORES', SYSDATE,
>      'AD_ASST', 4000);
>  END;
>  /

PL/SQL procedure successfully completed.

続いて、行が挿入されたことを確認した後、トランザクションをロールバックします。

Command> SELECT * FROM EMP_COPY WHERE first_name = 'Parker';
< 207, Parker, Cores, PCORES, <NULL>, 2008-07-19 21:49:55, AD_ASST, 4000,
<NULL>, <NULL>, <NULL> >
1 row found.
Command> ROLLBACK;
Command>  SELECT * FROM emp_copy WHERE first_name = 'Parker';
0 rows found.

ここで、INSERT文を再実行してから、PL/SQLでトランザクションをロールバックします。最後に、TimesTenによって行が挿入されていないことを確認します。

Command> BEGIN
>   INSERT INTO emp_copy
>     (employee_id, first_name, last_name, email, hire_date, job_id,
>      salary)
>   VALUES (emp_copy_seq.NEXTVAL, 'Parker', 'Cores', 'PCORES', SYSDATE,
>           'AD_ASST',4000);
> ROLLBACK;
> END;
> /

PL/SQL procedure successfully completed.

Command> SELECT * FROM emp_copy WHERE first_name = 'Parker';
0 rows found.

入力パラメータ、出力パラメータおよびバインド変数を使用する例

この項の次の例では、PL/SQLの外部からのバインド変数(ホスト変数)を含む、IN、OUT、およびIN OUTパラメータを使用します。

- INおよびOUTパラメータ

- IN OUTパラメータの使用

- 連想配列の使用

INおよびOUTパラメータ

この例では、従業員情報を取得するプロシージャquery_empを作成して、employee_id値171をプロシージャに渡し、名前および給与を取得して2つのOUTパラメータに入れます。

例5-4 INパラメータおよびOUTパラメータの使用

Command> CREATE OR REPLACE PROCEDURE query_emp
>   (p_id IN employees.employee_id%TYPE,
>    p_name  OUT employees.last_name%TYPE,
>    p_salary OUT employees.salary%TYPE) IS
> BEGIN
>   SELECT last_name, salary INTO p_name, p_salary
>   FROM employees
>   WHERE employee_id = p_id;
> END query_emp;
> /

Procedure created.

Command> -- Execute the procedure
> DECLARE
>  v_emp_name employees.last_name%TYPE;
>  v_emp_sal  employees.salary%TYPE;
> BEGIN
>  query_emp (171, v_emp_name, v_emp_sal);
>  DBMS_OUTPUT.PUT_LINE (v_emp_name || ' earns ' ||
>   TO_CHAR (v_emp_sal, '$999,999.00'));
> END;
> /
Smith earns    $7,400.00

PL/SQL procedure successfully completed.

IN OUTパラメータの使用

電話番号を書式化する場合を考えてみます。次の例では、電話番号の桁のような10文字の文字列を受け取り、この書式が設定されていない文字列をIN OUTパラメータとしてプロシージャに渡します。プロシージャの実行が完了すると、IN OUTパラメータには書式化された電話番号の値が含まれます。

例5-5 IN OUTパラメータの使用

Command> CREATE OR REPLACE PROCEDURE format_phone
>   (p_phone_no IN OUT VARCHAR2 ) IS
> BEGIN
>  p_phone_no := '('  || SUBSTR (p_phone_no,1,3) ||
>                ') ' || SUBSTR (p_phone_no,4,3) ||
>                '-'  || SUBSTR (p_phone_no,7);
> END format_phone;
> /

Procedure created.

バインド変数を作成し、プロシージャを実行して、結果を確認します。

Command> VARIABLE b_phone_no VARCHAR2 (15);
Command> EXECUTE :b_phone_no := '8006330575';

PL/SQL procedure successfully completed.

Command> PRINT b_phone_no;
B_PHONE_NO           : 8006330575
Command> BEGIN
>   format_phone (:b_phone_no);
> END;
> /

PL/SQL procedure successfully completed.

Command> PRINT b_phone_no
B_PHONE_NO           : (800) 633-0575

連想配列の使用

次の例では、ttIsqlを使用して、NUMBER配列およびVARCHAR2配列を、PL/SQLの相当するOUT連想配列にバインドします。

関連情報については、「アプリケーションからの連想配列の使用」を参照してください。

例5-6 ttIsqlから連想配列へのバインド

次のSQL設定を想定します。

DROP TABLE FOO;

CREATE TABLE FOO (CNUM INTEGER,
CVC2 VARCHAR2(20));

INSERT INTO FOO VALUES ( null,
'VARCHAR  1');
INSERT INTO FOO VALUES (-102,
null);
INSERT INTO FOO VALUES ( 103,
'VARCHAR  3');
INSERT INTO FOO VALUES (-104,
'VARCHAR  4');
INSERT INTO FOO VALUES ( 105,
'VARCHAR  5');
INSERT INTO FOO VALUES ( 106,
'VARCHAR  6');
INSERT INTO FOO VALUES ( 107,
'VARCHAR  7');
INSERT INTO FOO VALUES ( 108,
'VARCHAR  8');

COMMIT;

次のPL/SQLパッケージ定義を想定します。これには、プロシージャP1の定義内の出力連想配列c1およびc2のそれぞれに使用される、INTEGER連想配列タイプNUMARRTYPおよびVARCHAR2連想配列タイプVCHARRTYPなどがあります。

CREATE OR REPLACE PACKAGE PKG1 AS
TYPE NUMARRTYP IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
TYPE VCHARRTYP IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;

PROCEDURE P1(c1 OUT NUMARRTYP,c2 OUT VCHARRTYP);

END PKG1;
/

CREATE OR REPLACE PACKAGE BODY PKG1 AS

CURSOR CUR1 IS SELECT CNUM, CVC2 FROM FOO;

PROCEDURE P1(c1 OUT NUMARRTYP,c2 OUT VCHARRTYP) IS
BEGIN
IF NOT CUR1%ISOPEN  THEN
OPEN CUR1;
END IF;
FOR i IN 1..8 LOOP
FETCH CUR1 INTO c1(i), c2(i);
IF CUR1%NOTFOUND THEN
CLOSE CUR1;
EXIT;
END IF;
END LOOP;
END P1;

END PKG1;

これで、ttIsqlはPKG1.P1をコールし、配列をP1出力連想配列にバインドして、これらの連想配列のコンテンツを出力します。

Command> var c1[10] number;
Command> var c2[10] varchar2(20);
Command> print;
C1                   : ARRAY [ 10 ] (Current Size 0)
C2                   : ARRAY [ 10 ] (Current Size 0)
Command> BEGIN PKG1.P1(:c1, :c2); END;
> /

PL/SQL procedure successfully completed.

Command> print
C1                   : ARRAY [ 10 ] (Current Size 8)
C1[1] : <NULL>
C1[2] : -102
C1[3] : 103
C1[4] : -104
C1[5] : 105
C1[6] : 106
C1[7] : 107
C1[8] : 108
C2                   : ARRAY [ 10 ] (Current Size 8)
C2[1] : VARCHAR  1
C2[2] : <NULL>
C2[3] : VARCHAR  3
C2[4] : VARCHAR  4
C2[5] : VARCHAR  5
C2[6] : VARCHAR  6
C2[7] : VARCHAR  7
C2[8] : VARCHAR  8

カーソルを使用する例

「PL/SQLプログラムでのカーソルの使用」で説明しているように、TimesTenではカーソルがサポートされています。カーソルを使用して、SELECT文の結果セットを処理します。

この項で取り上げる例は次のとおりです。

- 値のフェッチ

- %ROWCOUNT属性および%NOTFOUND属性の使用

- カーソルFORループの使用

これらの例のカーソル属性については、『Oracle Database PL/SQL言語リファレンス』の明示的なカーソル属性に関する説明を参照してください。

値のフェッチ

この項では、カーソルから値をフェッチする方法について、値をレコードにフェッチする方法も含めて、例を示します。

例5-7 カーソルからの値のフェッチ

次の例では、カーソルを使用して、employees表から、department_idが30であるemployee_idおよびlast_nameを選択します。2つの変数が宣言され、カーソルからフェッチされた値を保持すると、FETCH文はループ内の行を1つずつ取得してすべての行を取得します。カーソルに残りの行がなくなると%NOTFOUNDカーソル属性が表示され、実行は停止します。

%NOTFOUNDは、INSERT、UPDATE、またはDELETE文がどの行にも影響しなかったか、またはSELECT INTO文で行が戻されなかった場合にTRUEを生成します。

Command>  DECLARE
>    CURSOR c_emp_cursor IS
>      SELECT employee_id, last_name FROM employees
>      WHERE department_id = 30;
>    v_empno  employees.employee_id%TYPE;
>    v_lname  employees.last_name%TYPE;
>  BEGIN
>    OPEN c_emp_cursor;
>    LOOP
>     FETCH c_emp_cursor INTO v_empno, v_lname;
>    EXIT WHEN c_emp_cursor%NOTFOUND;
>    DBMS_OUTPUT.PUT_LINE (v_empno || ' ' || v_lname);
>    END LOOP;
>    CLOSE c_emp_cursor;
>  END;
>  /

114 Raphaely
115 Khoo
116 Baida
117 Tobias
118 Himuro
119 Colmenares

例5-8 レコードへの値のフェッチ

この例は例5-7と似ており、同じ結果を返しますが、値をPL/SQLの変数ではなくPL/SQLのレコードにフェッチします。

Command> DECLARE
>   CURSOR c_emp_cursor IS
>     SELECT employee_id, last_name FROM employees
>     WHERE department_id = 30;
>   v_emp_record  c_emp_cursor%ROWTYPE;
> BEGIN
>   OPEN c_emp_cursor;
>   LOOP
>     FETCH c_emp_cursor INTO v_emp_record;
>   EXIT WHEN c_emp_cursor%NOTFOUND;
>   DBMS_OUTPUT.PUT_LINE (v_emp_record.employee_id || ' ' |
>     v_emp_record.last_name);
>   END LOOP;
>   CLOSE c_emp_cursor;
> END;
> /

114 Raphaely
115 Khoo
116 Baida
117 Tobias
118 Himuro
119 Colmenares

PL/SQL procedure successfully completed.

%ROWCOUNT属性および%NOTFOUND属性の使用

例5-9に、%ROWCOUNTカーソル属性と%NOTFOUNDカーソル属性(例5-7および例5-8で説明済)の使用方法を示します。

例5-9 %ROWCOUNT属性および%NOTFOUND属性の使用

この例は例5-8と同じ結果になりますが、例に示すとおり、ループ内の終了条件に%ROWCOUNTカーソル属性と%NOTFOUND属性を使用します。

%ROWCOUNTは、INSERT、UPDATE、またはDELETE文で影響を受けた行の数、またはSELECT...INTO文やFETCH...INTO文で戻された行の数を生成します。

Command> DECLARE
>   CURSOR c_emp_cursor IS
>     SELECT employee_id, last_name FROM employees
>     WHERE department_id = 30;
>   v_emp_record  c_emp_cursor%ROWTYPE;
> BEGIN
> OPEN c_emp_cursor;
> LOOP
>   FETCH c_emp_cursor INTO v_emp_record;
>   EXIT WHEN c_emp_cursor%ROWCOUNT > 10 OR c_emp_cursor%NOTFOUND;
>   DBMS_OUTPUT.PUT_LINE (v_emp_record.employee_id || ' ' ||
>     v_emp_record.last_name);
>   END LOOP;
>   CLOSE c_emp_cursor;
>  END;
>  /
114 Raphaely
115 Khoo
116 Baida
117 Tobias
118 Himuro
119 Colmenares

PL/SQL procedure successfully completed.

カーソルFORループの使用

TimesTenのPL/SQLでは、次の例に示すとおり、カーソルFORループがサポートされています。

例5-10 カーソルFORループの使用

この例では、PL/SQLは暗黙的にemp_recordを宣言します。OPEN文およびCLOSE文は必要ありません。結果は上記の例5-9と同じです。

Command> DECLARE
>   CURSOR c_emp_cursor IS
>    SELECT employee_id, last_name FROM employees
>    WHERE department_id = 30;
> BEGIN
>   FOR emp_record IN c_emp_cursor
>    LOOP
>      DBMS_OUTPUT.PUT_LINE (emp_record.employee_id || ' ' ||
>         emp_record.last_name);
>    END LOOP;
> END;
> /
114 Raphaely
115 Khoo
116 Baida
117 Tobias
118 Himuro
119 Colmenares

PL/SQL procedure successfully completed.

例5-11 副問合せでのカーソルFORループの使用

この例では、副問合せを使用したFORループを示します。結果は上記の例5-9および例5-10と同じです。

Command> BEGIN
>  FOR emp_record IN (SELECT employee_id, last_name FROM
>   employees WHERE department_id = 30)
>  LOOP
>    DBMS_OUTPUT.PUT_LINE (emp_record.employee_id || ' ' ||
>      emp_record.last_name);
>   END LOOP;
> END;
> /
114 Raphaely
115 Khoo
116 Baida
117 Tobias
118 Himuro
119 Colmenares

PL/SQL procedure successfully completed.

FORALLおよびBULK COLLECTを使用する例

「FORALL操作およびBULK COLLECT操作」で説明しているように、TimesTenでは、バルク・バインドとFORALL文およびBULK COLLECT機能がサポートされています。

この項で取り上げる例は次のとおりです。

- SQL%BULK_ROWCOUNTでのFORALLの使用

- 問合せでのBULK COLLECT INTOの使用

- カーソルでのBULK COLLECT INTOの使用

- BULK COLLECTでのSAVE EXCEPTIONSの使用

SQL%BULK_ROWCOUNTでのFORALLの使用

%BULK_ROWCOUNTカーソル属性は、FORALL文とともに使用することが前提の複合構造です。

この属性は連想配列(索引付き表)のように動作します。属性のi番目の要素には、INSERT文のi回目の実行で処理された行の数が格納されます。i回目の実行がどの行にも影響しなかった場合、%BULK_ROWCOUNT(i)は0(ゼロ)を戻します。

このことを例5-12に示します。

例5-12 SQL%BULK_ROWCOUNTでのFORALL文の使用

Command> DECLARE
>   TYPE num_list_type IS TABLE OF NUMBER
>      INDEX BY BINARY_INTEGER;
> v_nums num_list_type;
> BEGIN
>   v_nums (1) := 1;
>   v_nums (2) := 3;
>   v_nums (3) := 5;
>   v_nums (4) := 7;
>   v_nums (5) := 11;
>     FORALL i IN v_nums.FIRST .. v_nums.LAST
>      INSERT INTO num_table (n) VALUES (v_nums (i));
>    FOR i IN v_nums.FIRST .. v_nums.LAST
>    LOOP
>       DBMS_OUTPUT.PUT_LINE ('Inserted '||
>         SQL%BULK_ROWCOUNT (i) || ' row (s)' ||
>         ' on iteration  ' || i );
>    END LOOP;
> END;
> /
Inserted 1 row (s) on iteration  1
Inserted 1 row (s) on iteration  2
Inserted 1 row (s) on iteration  3
Inserted 1 row (s) on iteration  4
Inserted 1 row (s) on iteration  5

PL/SQL procedure successfully completed.

問合せでのBULK COLLECT INTOの使用

PL/SQLでSELECT文とともにBULK COLLECTを使用して、カーソルを使用しないで行を取得します。

例5-13 問合せでのBULK COLLECT INTOの使用

この例では、departments表から指定した場所のすべての行を選択して、ネストした表に入れた後、FOR LOOPを使用してデータを出力します。

Command> CREATE OR REPLACE PROCEDURE get_departments (p_loc NUMBER) IS
>    TYPE dept_tab_type IS
> TABLE OF departments%ROWTYPE;
>   v_depts dept_tab_type;
>  BEGIN
>    SELECT * BULK COLLECT INTO v_depts
>   FROM departments
>  where location_id = p_loc;
>  FOR i IN 1 .. v_depts.COUNT
>  LOOP
>     DBMS_OUTPUT.PUT_LINE (v_depts(i).department_id
>       || ' ' || v_depts (i).department_name);
>  END LOOP;
>  END;
>  /

Procedure created.

次のようにプロシージャを実行して、結果を確認します。

Command> EXECUTE GET_DEPARTMENTS (1700);
10 Administration
30 Purchasing
90 Executive
100 Finance
110 Accounting
120 Treasury
130 Corporate Tax
140 Control And Credit
150 Shareholder Services
160 Benefits
170 Manufacturing
180 Construction
190 Contracting
200 Operations
210 IT Support
220 NOC
230 IT Helpdesk
240 Government Sales
250 Retail Sales
260 Recruiting
270 Payroll

PL/SQL procedure successfully completed.

Command> SELECT department_id, department_name FROM departments WHERE
location_id = 1700;
< 10, Administration >
< 30, Purchasing >
< 90, Executive >
< 100, Finance >
< 110, Accounting >
< 120, Treasury >
< 130, Corporate Tax >
< 140, Control And Credit >
< 150, Shareholder Services >
< 160, Benefits >
< 170, Manufacturing >
< 180, Construction >
< 190, Contracting >
< 200, Operations >
< 210, IT Support >
< 220, NOC >
< 230, IT Helpdesk >
< 240, Government Sales >
< 250, Retail Sales >
< 260, Recruiting >
< 270, Payroll >
21 rows found.

カーソルでのBULK COLLECT INTOの使用

例5-14では、カーソルを使用して表から行をバルク・コレクトします。

例5-14 カーソルでのBULK COLLECT INTOの使用

この例では、カーソルを使用して、指定したlocation_id値を持つ行を部門表からバルク・コレクトします。結果は上記の例5-13と同じです。

Command> CREATE OR REPLACE PROCEDURE get_departments2 (p_loc NUMBER) IS
>   CURSOR cur_dept IS
>    SELECT * FROM departments
>    WHERE location_id = p_loc;
>  TYPE dept_tab_type IS TABLE OF cur_dept%ROWTYPE;
>  v_depts dept_tab_type;
> BEGIN
>   OPEN cur_dept;
>   FETCH cur_dept BULK COLLECT INTO v_depts;
>   CLOSE cur_dept;
> FOR i IN 1 .. v_depts.COUNT
>  LOOP
>    DBMS_OUTPUT.PUT_LINE (v_depts (i).department_id
>    || ' ' || v_depts (i).department_name );
> END LOOP;
> END;
> /

Procedure created.

Command> EXECUTE GET_DEPARTMENTS2 (1700);
10 Administration
30 Purchasing
90 Executive
100 Finance
110 Accounting
120 Treasury
130 Corporate Tax
140 Control And Credit
150 Shareholder Services
160 Benefits
170 Manufacturing
180 Construction
190 Contracting
200 Operations
210 IT Support
220 NOC
230 IT Helpdesk
240 Government Sales
250 Retail Sales
260 Recruiting
270 Payroll

PL/SQL procedure successfully completed.

BULK COLLECTでのSAVE EXCEPTIONSの使用

SAVE EXCEPTIONSを使用すると、UPDATE、INSERT、またはDELETE文で例外が発生した後でも文の実行を続行できます。文が終了するとエラーが発行され、1つ以上の例外が発生したことが示されます。例外は配列に収集され、文の実行後に%BULK_EXCEPTIONSを使用して確認できます。

例5-15 BULK COLLECTでのSAVE EXCEPTIONSの使用

次の例では、job_id列で一部の新しい値が大きすぎるため、PL/SQLにより事前定義された例外が発生します。FORALL文の後、SQL%BULK_EXCEPTIONS.COUNTは2を戻し、SQL%BULK_EXCEPTIONSのコンテンツは、(7, 01401)および(13, 01401)となり、エラー番号とエラーが検出された行番号を示します。エラー・メッセージを取得するには、SQL%BULK_EXCEPTIONS(i).ERROR_CODEの負の値をエラー・レポート・ファンクションSQLERRMに渡します(負の値が必要)。

次のスクリプトはttIsqlを使用して実行されます。

-- create a temporary table for this example
CREATE TABLE emp_temp AS SELECT * FROM employees;

DECLARE
TYPE empid_tab IS TABLE OF employees.employee_id%TYPE;
emp_sr empid_tab;
-- create an exception handler for ORA-24381
errors NUMBER;
dml_errors EXCEPTION;
PRAGMA EXCEPTION_INIT(dml_errors, -24381);

BEGIN
SELECT employee_id
BULK COLLECT INTO emp_sr FROM emp_temp
WHERE hire_date < '1994-12-30';
-- add '_SR' to the job_id of the most senior employees
FORALL i IN emp_sr.FIRST..emp_sr.LAST SAVE EXCEPTIONS
UPDATE emp_temp SET job_id = job_id || '_SR'
WHERE emp_sr(i) = emp_temp.employee_id;
-- If any errors occurred during the FORALL SAVE EXCEPTIONS,
-- a single exception is raised when the statement completes.

EXCEPTION
-- Figure out what failed and why
WHEN dml_errors THEN
errors := SQL%BULK_EXCEPTIONS.COUNT;
DBMS_OUTPUT.PUT_LINE
('Number of statements that failed: ' || errors);
FOR i IN 1..errors LOOP
DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '||
'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
DBMS_OUTPUT.PUT_LINE('Error message is ' ||
SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
END LOOP;
END;
/

DROP TABLE emp_temp;

結果は次のとおりです。

Number of statements that failed: 2
Error #1 occurred during iteration #7
Error message is ORA-01401: inserted value too large for column
Error #2 occurred during iteration #13
Error message is ORA-01401: inserted value too large for column

PL/SQL procedure successfully completed.

EXECUTE IMMEDIATEを使用する例

「PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)」に記載のとおり、TimesTenでは、EXECUTE IMMEDIATE文がサポートされています。この項では、TimesTenでPL/SQLアプリケーションを開発する際の検討事項を次の例で説明します。

- EXECUTE IMMEDIATEを使用した表の作成

- 単一行問合せでのEXECUTE IMMEDIATEの使用

- EXECUTE IMMEDIATEを使用した接続属性の変更

- EXECUTE IMMEDIATEを使用したTimesTen組込みプロシージャのコール

- TimesTen固有の構文を持つEXECUTE IMMEDIATEの使用

EXECUTE IMMEDIATEを使用した表の作成

コンパイル時に表定義がわからない場合を考えてみます。EXECUTE IMMEDIATE文を使用することで、実行時に表を作成できます。この例では、EXECUTE IMMEDIATE文を使用して表を作成するプロシージャを表示します。プロシージャはパラメータとして渡された表の名前および列定義を使用して実行され、その後、表の作成が確認されます。

例5-16 EXECUTE IMMEDIATEを使用した表の作成

Command> CREATE OR REPLACE PROCEDURE create_table
>   (p_table_name VARCHAR2, p_col_specs VARCHAR2) IS
> BEGIN
>   EXECUTE IMMEDIATE 'CREATE TABLE ' || p_table_name
>
> || ' (' || p_col_specs|| ' )';
> END;
> /

Procedure created.

プロシージャを実行して、表が作成されていることを確認します。

Command> BEGIN
> create_table ('EMPLOYEES_NAMES', 'id NUMBER (4)
>  PRIMARY KEY, name VARCHAR2 (40)');
> END;
> /

PL/SQL procedure successfully completed.

Command> DESCRIBE employees_names;

Table USER.EMPLOYEES_NAMES:
Columns:
*ID                              NUMBER (4) NOT NULL
NAME                            VARCHAR2 (40) INLINE

1 table found.
(primary key columns are indicated with *)

単一行問合せでのEXECUTE IMMEDIATEの使用

この例では、ファンクションget_empは従業員レコードを取得します。ファンクションを実行して、v_emprecに結果を戻します。

例5-17 単一行問合せでのEXECUTE IMMEDIATEの使用

Command> CREATE OR REPLACE FUNCTION get_emp (p_emp_id NUMBER)
>   RETURN employees%ROWTYPE IS
>   v_stmt VARCHAR2 (200);
>   v_emprec employees%ROWTYPE;
> BEGIN
>   v_stmt:= 'SELECT * FROM EMPLOYEES '||
>   'WHERE employee_id = :p_emp_id';
>   EXECUTE IMMEDIATE v_stmt INTO v_emprec USING p_emp_id;
>   RETURN v_emprec;
> END;
> /

Function created.

Command> DECLARE
>   v_emprec employees%ROWTYPE := GET_EMP (100);
> BEGIN
>  DBMS_OUTPUT.PUT_LINE ('Employee: ' || v_emprec.last_name);
> END;
> /
Employee: King

PL/SQL procedure successfully completed.

EXECUTE IMMEDIATEを使用した接続属性の変更

この例では、EXECUTE IMMEDIATE文をALTER SESSIONとともに使用してPLSQL_OPTIMIZE_LEVEL設定を変更し、変更前および変更後にttConfiguration組込みプロシージャをコールして結果を確認します。(次の例では、EXECUTE IMMEDIATE文の内部からttConfigurationをコールします。)このプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttConfigurationに関する説明を参照してください。

例5-18 EXECUTE IMMEDIATEを使用したPLSCOPE_SETTINGSの変更

Command> call ttconfiguration;
...
< PLSCOPE_SETTINGS, IDENTIFIERS:NONE >
< PLSQL, 1 >
< PLSQL_CCFLAGS, <NULL> >
< PLSQL_CODE_TYPE, INTERPRETED >
< PLSQL_CONN_MEM_LIMIT, 100 >
< PLSQL_MEMORY_ADDRESS, 0x10000000 >
< PLSQL_MEMORY_SIZE, 32 >
< PLSQL_OPTIMIZE_LEVEL, 2 >
< PLSQL_TIMEOUT, 30 >
...
54 rows found.

Command> begin
> execute immediate 'alter session set PLSQL_OPTIMIZE_LEVEL=3';
> end;
> /
PL/SQL procedure successfully completed.

Command> call ttconfiguration;
...
< PLSCOPE_SETTINGS, IDENTIFIERS:NONE >
< PLSQL, 1 >
< PLSQL_CCFLAGS, <NULL> >
< PLSQL_CODE_TYPE, INTERPRETED >
< PLSQL_CONN_MEM_LIMIT, 100 >
< PLSQL_MEMORY_ADDRESS, 0x10000000 >
< PLSQL_MEMORY_SIZE, 32 >
< PLSQL_OPTIMIZE_LEVEL, 3 >
< PLSQL_TIMEOUT, 30 >
...
54 rows found.

EXECUTE IMMEDIATEを使用したTimesTen組込みプロシージャのコール

PL/SQLでは、CALL構文を使用したEXECUTE IMMEDIATE文を使用してTimesTen組込みプロシージャをコールできます。

たとえば、組込みプロシージャttConfigurationをコールして、その出力結果セットを戻すには、PL/SQLレコード型を作成し、BULK COLLECTを使用したEXECUTE IMMEDIATEを使用して、結果セットを配列にフェッチします。

TimesTen組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する説明を参照してください。

例5-19 EXECUTE IMMEDIATEを使用したttConfigurationのコール

Command> DECLARE
>   TYPE ttConfig_record IS RECORD
>      (name varchar2(255), value varchar2 (255));
>   TYPE ttConfig_table IS TABLE OF ttConfig_record;
> v_ttConfigs ttConfig_table;
> BEGIN
>  EXECUTE IMMEDIATE  'CALL ttConfiguration'
>   BULK COLLECT into v_ttConfigs;
>  DBMS_OUTPUT.PUT_LINE ('Name: ' || v_ttConfigs(1).name
>    || ' Value: ' || v_ttConfigs(1).value);
> end;
> /
Name: CacheGridEnable Value: 0

PL/SQL procedure successfully completed.

TimesTen固有の構文を持つEXECUTE IMMEDIATEの使用

この例では、EXECUTE IMMEDIATE文を使用して、TimesTen SELECT FIRST n文を実行します。この構文はTimesTenに固有です。

例5-20 TimesTen固有の構文を持つEXECUTE IMMEDIATEの使用

Command> DECLARE v_empid NUMBER;
> BEGIN
>   EXECUTE IMMEDIATE 'SELECT FIRST 1 employee_id FROM employees'
>    INTO v_empid;
>  DBMS_OUTPUT.PUT_LINE ('Employee id: ' || v_empid);
> END;
> /
Employee id: 100

PL/SQL procedure successfully completed.

RETURNING INTOを使用する例

この項では、RETURNING INTO句を使用する次の2つの例を示します。

- レコードでのRETURNING INTO句の使用

- RETURNING INTO句でのBULK COLLECT INTOの使用

概要は、「RETURNING INTO句」を参照してください。

レコードでのRETURNING INTO句の使用

次の例では、ttIsqlを使用して、RETURNING INTO句でレコードにデータを戻すSQLスクリプトを実行します。この例では、指定した従業員を昇給させ、その従業員の名前および新しい給与をレコードに入れた後、そのレコードからデータを出力します。参照用に元の給与を表示してから、スクリプトを実行します。

例5-21 レコードでのRETURNING INTO句の使用

Command> SELECT SALARY,LAST_NAME FROM EMPLOYEES WHERE EMPLOYEE_ID = 100;
< 24000, King >
1 row found.

Command> run ReturnIntoWithRecord.sql;

CREATE TABLE emp_temp AS SELECT * FROM employees;
107 rows inserted.

DECLARE
TYPE EmpRec IS RECORD (last_name employees.last_name%TYPE,
salary employees.salary%TYPE);
emp_info EmpRec;
emp_id NUMBER := 100;
BEGIN
UPDATE emp_temp SET salary = salary * 1.1
WHERE employee_id = emp_id
RETURNING last_name, salary INTO emp_info;
DBMS_OUTPUT.PUT_LINE
('Just gave a raise to ' || emp_info.last_name ||
', who now makes ' || emp_info.salary);
ROLLBACK;
END;
/

Just gave a raise to King, who now makes 26400

PL/SQL procedure successfully completed.

RETURNING INTO句でのBULK COLLECT INTOの使用

次の例では、ttIsqlを使用して、BULK COLLECTを指定したRETURNING INTO句でネストした表(PL/SQLコレクション型)にデータを戻すSQLスクリプトを実行します。例では、指定した部門のすべての従業員を削除した後、従業員ID用のネストした表および姓用のネストした表を使用して、削除した各従業員の従業員IDおよび姓を出力します。参照用に、その部門の従業員のIDおよび姓をスクリプトの実行前にも表示します。

例5-22 RETURNING INTO句でのBULK COLLECT INTOの使用

Command> select employee_id, last_name from employees where department_id=30;
< 114, Raphaely >
< 115, Khoo >
< 116, Baida >
< 117, Tobias >
< 118, Himuro >
< 119, Colmenares >
6 rows found.
Command> run ReturnIntoWithBulkCollect.sql;

CREATE TABLE emp_temp AS SELECT * FROM employees;
107 rows inserted.

DECLARE
TYPE NumList IS TABLE OF employees.employee_id%TYPE;
enums NumList;
TYPE NameList IS TABLE OF employees.last_name%TYPE;
names NameList;
BEGIN
DELETE FROM emp_temp WHERE department_id = 30
RETURNING employee_id, last_name
BULK COLLECT INTO enums, names;
DBMS_OUTPUT.PUT_LINE
('Deleted ' || SQL%ROWCOUNT || ' rows:');
FOR i IN enums.FIRST .. enums.LAST
LOOP
DBMS_OUTPUT.PUT_LINE
('Employee #' || enums(i) || ': ' || names(i));
END LOOP;
END;
/
Deleted 6 rows:
Employee #114: Raphaely
Employee #115: Khoo
Employee #116: Baida
Employee #117: Tobias
Employee #118: Himuro
Employee #119: Colmenares

PL/SQL procedure successfully completed.

AUTHID句を使用する例

この項では、変更を1つだけ加えてスクリプトをttIsqlで2回実行します(最初は実行者権限のAUTHID CURRENT_USERでPL/SQLプロシージャを定義し、次に定義者権限のAUTHID DEFINERで定義します)。関連情報については、「定義者権限および実行者権限」を参照してください。

AUTHIDのスクリプト例

スクリプトでは、1人のツール・ベンダーと2人のツール・ユーザー(brandXおよびbrandY)の、3人のユーザーが作成されていることを想定しています。各ユーザーには、必要に応じて、CREATE SESSION権限、CREATE PROCEDURE権限およびCREATE TABLE権限が付与されています。また、use username;構文を使用してusernameとしてデータベースに接続できるよう、次の設定が想定されています。

connect adding "uid=toolVendor;pwd=pw" as toolVendor;
connect adding "uid=brandX;pwd=pw" as brandX;
connect adding "uid=brandY;pwd=pw" as brandY;

スクリプトでは、次の操作を実行します。

- ツール・ベンダーとして、プロシージャprintInventoryStatisticsを作成します。

- 3つのユーザー・スキーマのそれぞれに同じmyInventoryという名前の表を作成し、それぞれの表に一意のデータを移入します。

- それぞれのツール・ユーザーとして、プロシージャを実行します。

2回のスクリプト実行の結果の違いは、実行者権限と定義者権限の違いを示しています。

次に、実行者権限で実行する場合のスクリプトを示します。

use toolVendor;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('butter', 1);

create or replace procedure printInventoryStatistics authid current_user is
inventoryCount pls_integer;
begin
select count(*) into inventoryCount from myInventory;
dbms_output.put_line('Total items in inventory: ' || inventoryCount);
for currentItem in (select * from myInventory) loop
dbms_output.put_line(currentItem.name || ' ' || currentItem.inventoryCount);
end loop;
end;
/
grant execute on printInventoryStatistics to brandX;
grant execute on printInventoryStatistics to brandY;

use brandX;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('toothpaste', 100);
set serveroutput on
execute toolVendor.printInventoryStatistics;

use brandY;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('shampoo', 10);
set serveroutput on
execute toolVendor.printInventoryStatistics;

定義者権限で実行する場合の違いは、プロシージャ定義のAUTHID句を変更することのみです。

...
create or replace procedure printInventoryStatistics authid definer is
inventoryCount pls_integer;
begin
select count(*) into inventoryCount from myInventory;
dbms_output.put_line('Total items in inventory: ' || inventoryCount);
for currentItem in (select * from myInventory) loop
dbms_output.put_line(currentItem.name || ' ' || currentItem.inventoryCount);
end loop;
end;
/
...

AUTHID CURRENT_USERの使用

この例では、実行者権限を使用してプロシージャを定義した場合の結果について説明しています。ツール・ユーザーbrandXおよびbrandYがprintInventoryStatisticsプロシージャを実行すると、それぞれのユーザー専用の(実行者の)myInventory表のデータが表示されることに注意してください。

例5-23 AUTHID CURRENT_USERの使用

Command> run invoker.sql

use toolVendor;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('butter', 1);
1 row inserted.

create or replace procedure printInventoryStatistics authid current_user is
inventoryCount pls_integer;
begin
select count(*) into inventoryCount from myInventory;
dbms_output.put_line('Total items in inventory: ' || inventoryCount);
for currentItem in (select * from myInventory) loop
dbms_output.put_line(currentItem.name || ' ' || currentItem.inventoryCount);
end loop;
end;
/

Procedure created.

grant execute on printInventoryStatistics to brandX;
grant execute on printInventoryStatistics to brandY;

use brandX;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('toothpaste', 100);
1 row inserted.
set serveroutput on;

execute toolVendor.printInventoryStatistics;
Total items in inventory: 1
toothpaste 100

PL/SQL procedure successfully completed.

use brandY;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('shampoo', 10);
1 row inserted.
set serveroutput on;

execute toolVendor.printInventoryStatistics;
Total items in inventory: 1
shampoo 10

PL/SQL procedure successfully completed.

次のコマンドを使用して、すべての接続を終了します。

Command> disconnect all;

AUTHID DEFINERの使用

この例では、定義者権限を使用してプロシージャを定義した場合の結果について説明しています。ツール・ユーザーbrandXおよびbrandYがprintInventoryStatisticsを実行すると、ツール・ベンダー(定義者)に属するmyInventoryのデータが表示されることに注意してください。

例5-24 AUTHID DEFINERの使用

Command> run definer.sql

use toolVendor;

create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('butter', 1);
1 row inserted.

create or replace procedure printInventoryStatistics authid definer is
inventoryCount pls_integer;
begin
select count(*) into inventoryCount from myInventory;
dbms_output.put_line('Total items in inventory: ' || inventoryCount);
for currentItem in (select * from myInventory) loop
dbms_output.put_line(currentItem.name || ' ' || currentItem.inventoryCount);
end loop;
end;
/

Procedure created.

grant execute on printInventoryStatistics to brandX;
grant execute on printInventoryStatistics to brandY;

use brandX;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('toothpaste', 100);
1 row inserted.
set serveroutput on;

execute toolVendor.printInventoryStatistics;
Total items in inventory: 1
butter 1

PL/SQL procedure successfully completed.

use brandY;
create table myInventory (name varchar2(100), inventoryCount tt_integer);
insert into myInventory values('shampoo', 10);
1 row inserted.
set serveroutput on;

execute toolVendor.printInventoryStatistics;
Total items in inventory: 1
butter 1

PL/SQL procedure successfully completed.

この場合、brandXおよびbrandYはそれぞれプロシージャを介してtoolVendor.myInventory表にアクセスできますが、直接にはアクセスできないことを理解しておくことも有用です。定義者権限を主にこのように使用することによって、プロシージャの処理を介して表または他のSQLオブジェクトに明確に制限付きでアクセスできるようになります。

Command> use brandX;
brandx: Command> select * from toolVendor.myInventory;
15100: User BRANDX lacks privilege SELECT on TOOLVENDOR.MYINVENTORY
The command failed.

brandx: Command> use brandY;
brandy: Command> select * from toolVendor.myInventory;
15100: User BRANDY lacks privilege SELECT on TOOLVENDOR.MYINVENTORY
The command failed.

次のコマンドを使用して、すべての接続を終了します。

Command> disconnect all;

システム・ビューを問い合せる例

この項では、システム・ビューを問い合せる例を示します。

例5-25 システム・ビューUSER_SOURCEの問合せ

この例では、USER_SOURCEシステム・ビューを問い合せて、例5-4のプロシージャquery_empのソース・コードを確認します。(この例を実行する前に、このプロシージャを作成する必要があります。)

Command> SELECT SUBSTR (text, 1, LENGTH(text)-1)
> FROM user_source
> WHERE name = 'QUERY_EMP' AND type = 'PROCEDURE';

このコードでは、次の出力が生成されます。

< PROCEDURE query_emp >
< (p_id IN employees.employee_id%TYPE, >
<  p_name OUT employees.last_name%TYPE, >
<  p_salary OUT employees.salary%TYPE) IS >
< BEGIN >
< SELECT last_name, salary INTO p_name, p_salary >
< FROM employees >
< WHERE employee_id = p_id; >
< END query_emp; >
9 rows found.

注意:
他のUSER_*システム・ビューと同様に、USER_SOURCEシステム・ビューのSELECT権限はすべてのユーザーにあります。

6 PL/SQLのインストールおよび環境

この章では、TimesTenデータベースでのPL/SQLの管理方法、接続属性の設定方法、およびシステム提供のパッケージの表示方法について説明します。また、TimesTenでサポートされていないPL/SQL機能の確認にん使用できるttSrcScanユーティリティについても説明します。この章の終わりには、プロシージャを設定する際に役立つ例をまとめています。

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

- PL/SQLがインストール済であること、およびTimesTenで有効になっているかどうかの確認

- PL/SQL接続属性

- ttSrcScanユーティリティ

PL/SQLがインストール済であること、およびTimesTenで有効になっているかどうかの確認

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

- PL/SQLインストールおよびttmodinstallユーティリティ

- PL/SQLがTimesTenデータベースで有効になっているかどうかの確認

PL/SQLインストールおよびttmodinstallユーティリティ

TimesTenでは、デフォルトでPL/SQLがインストールされます。PL/SQLのインストールを選択しない場合(インストールをお薦めします)は、TimesTenのttmodinstallユーティリティを使用して、後からPL/SQLをインストールできます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttmodinstallに関する説明を参照してください。

注意:
このユーティリティを実行できるのは、インスタンス管理者のみです。

PL/SQLがTimesTenデータベースで有効になっているかどうかの確認

PL/SQLはデフォルトで有効です(最初の接続属性設定はPLSQL=1)。データベース内のPL/SQLの状態を次の方法で確認できます。これらの例では、$はUNIXのプロンプト、またCommand>はttIsqlのプロンプトを表しています。

- ttStatusユーティリティを次の例で示されるように使用して、PL/SQLがユーザーのデータベースで有効になっているか識別します。このユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttStatusに関する説明を参照してください。

$ ttstatus
TimesTen status report as of Sat Sep 17 13:58:27 2011

Daemon pid 20921 port 28959 instance myserver
...
------------------------------------------------------------------------
Data store /mypath/install/info/DemoDataStore/sampledb_1122
There are xx connections to the data store
Shared Memory KEY 0x2e0183b1 ID 1343492
PL/SQL Memory KEY 0x2f0183b1 ID 1376261 Address 0x10000000
Type            PID     Context     Connection Name              ConnID
Process         16678   0x08f718c0  sampledb_1122                     1
...
Replication policy  : Manual
Cache Agent policy  : Manual
PL/SQL enabled.
------------------------------------------------------------------------
...
End of report

- ttIsqlユーティリティを使用し、ttConfiguration組込みプロシージャをコールして、データベースのPLSQL接続属性の設定を確認します。次の例に示すとおり、値1は、PL/SQLが有効になっていることを示します。この組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttConfigurationに関する説明を参照してください。

Command> call ttconfiguration;
...
< DataStore, /mypath/install/info/DemoDataStore/sampledb_1122 >
...
< PLSQL, 1 >
...
< UID, MYUSER >
61 rows found.

PL/SQL接続属性

次の表6-1に示すとおり、PL/SQLに固有のTimesTen接続属性があります。これらの接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPL/SQL初期接続属性およびPL/SQL一般接続属性に関する説明を参照してください。

この表には、必要なアクセス制御権限、および各接続属性が初期接続属性と一般接続属性のいずれであるかが示されています。初期接続属性はデータベースが最初にロードされるときに設定され、すべての接続に対して有効です。初期接続属性の設定を変更してデータベースをロードできるのは、インスタンス管理者のみです。一般接続属性の設定は1つの接続にのみ適用され、設定を行うのに特別な権限は必要ありません。

表6-1 PL/SQL接続属性

属性

概要

PLSQL

初期接続属性

必要な権限: インスタンス管理者

データベースでPL/SQLを有効にします。

PLSQL=1の場合、PL/SQLは有効になります。

PLSQL=0の場合、PL/SQLは無効になります。

データベースを最初に作成するとき、または、データベースに初めて接続するときに、PL/SQLを有効にすることができます。PL/SQLを一度有効にすると、無効にすることができなくなります。

デフォルト: 1(PL/SQLがサポートされているプラットフォームの場合)

PLSQL_MEMORY_ADDRESS

初期接続属性

必要な権限: インスタンス管理者

TimesTenダイレクト・ドライバを使用する各プロセスにPL/SQL共有メモリー・セグメントがロードされる場所を示す仮想アドレス(16進値)を指定します。このメモリー・アドレスは、あるデータベースへのすべての接続、およびそのデータベースに接続するすべてのプロセスで同じである必要があります。

1つのアプリケーションから複数のデータベースに同時にダイレクト接続する場合は、データベースごとに異なる値を設定する必要があります。

デフォルト: プラットフォーム固有の値

プラットフォーム固有の情報の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPLSQL_MEMORY_ADDRESSに関する説明を参照してください。

PLSQL_MEMORY_SIZE

初期接続属性

必要な権限: インスタンス管理者

すべての接続で共有するPL/SQL共有メモリー・セグメントに割り当てられるメモリーのサイズをMB単位で指定します。このメモリーは最近実行したPL/SQLコードおよびPL/SQLオブジェクトに関するメタデータを保持するために使用します。

デフォルト: プラットフォーム固有の値

PL/SQLメモリー・サイズの計算およびプラットフォーム固有の値とチューニングの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPLSQL_MEMORY_SIZEに関する説明を参照してください。

PLSCOPE_SETTINGS

一般接続属性

必要な権限: なし

PL/SQLコンパイラで相互参照情報を生成するかどうかを制御します。可能な値は、IDENTIFIERS:NONEまたはIDENTIFIERS:ALLです。

ALTER SESSION文を使用すると、セッション内でこの値を変更できます。

デフォルト: IDENTIFIERS:NONE

PLSQL_CCFLAGS

一般接続属性

必要な権限: なし

これを使用して、PL/SQLユニットの条件付きコンパイルを操作するための問合せディレクティブを設定すると、確認する条件に応じて、PL/SQLプログラムの機能をカスタマイズできます。これは、アプリケーションを複数のデータベース環境にデプロイできる場合に、特に便利です。たとえば、次のようにデバッグ機能をアクティブにします:

PLSQL_CCFLAGS='DEBUG:TRUE'

PL/SQLの条件付きコンパイル・フラグは、次のようなCコンパイラのコマンドラインのフラグと概念が似ています。

% cc -DEBUG=TRUE ...

ALTER SESSION文を使用すると、セッション内でPLSQL_CCFLAGSを変更できます。

この機能の詳細は、『Oracle Database PL/SQL言語リファレンス』の条件付きコンパイルに関する項を参照してください。

デフォルト: NULL

PLSQL_CONN_MEM_LIMIT

一般接続属性

必要な権限: なし

PL/SQLで現在の接続に割り当てることができるPL/SQL共有メモリー(プロセス・ヒープ・メモリー)の最大サイズを指定します。(このメモリーは、必要になるまで実際には割り当てられません。)このメモリーは、キャッシュされた実行可能コードではなく、大きなPL/SQLコレクションなどの実行時データに使用されるメモリーです。この設定により、使用可能なすべての実行時メモリーをPL/SQLで取得してしまう可能性がある場合に、CやJavaコンポーネントなどのアプリケーションの他の部分が保護されます。

PL/SQL変数によって消費されるメモリー量は、他のプログラミング言語で類似の変数によって消費される量とほぼ同じです。たとえば、次のような文字列の大きな配列を考えてみます。

type chararr is table of varchar2(32767)
index by binary_integer;
big_array chararr;

配列にそれぞれ100バイトの文字列が100,000個配置される場合、約12MBのメモリーが消費されます。

PL/SQLブロックの変数によって消費されるメモリーは、ブロックの実行中に使用され、その後解放されます。プロシージャやファンクション内ではなくPL/SQLパッケージの指定内または本体内の変数によって消費されるメモリーは、パッケージの存続期間使用されます。PL/SQLプロシージャやファンクション(パッケージ内で定義されているものなど)内の変数によって消費されるメモリーは、そのプロシージャやファンクションの存続期間使用されます。ただし、いずれの場合も、PL/SQLによって解放されたメモリーはオペレーティング・システムに戻されません。かわりに、PL/SQLによって保持され、将来PL/SQLが起動されたときに再利用されます。アプリケーションとTimesTenの接続が切断されると、メモリーは解放されます。

PLSQL_CONN_MEM_LIMITの値は、MB単位で指定します。設定0は無制限を意味します。

ALTER SESSION文を使用すると、セッション内でこの値を変更できます。

デフォルト: 100MB

注意: ttPLSQLMemoryStatsの出力で、関連する値CurrentConnectionMemoryは、PL/SQLでmalloc()によって実際に取得したプロセス・ヒープ・メモリーの量を示します。(例 6-3も参照してください。)

PLSQL_OPTIMIZE_LEVEL

一般接続属性

必要な権限: なし

PL/SQLライブラリ・ユニットのコンパイルに使用する最適化レベルを指定します。設定値が高いほど、コンパイラでPL/SQLライブラリ・ユニットを最適化するのに多くの処理が必要になります。可能な値は、0、1、2または3です。

ALTER SESSION文を使用すると、セッション内でこの値を変更できます。

デフォルト: 2

PLSQL_TIMEOUT

一般接続属性

必要な権限: なし

PL/SQLプログラム・ユニットを終了まで実行できる時間を秒単位で指定します。新しい値を設定すると、その値は現在実行中のPL/SQLプログラムに適用されます。可能な値は、0(時間制限なし)または正の整数です。

ALTER SESSION文を使用すると、セッション内でこの値を変更できます。

(また、『Oracle TimesTen In-Memory Database C開発者ガイド』のSQL文のタイムアウト期間の設定に関する項で説明されている、TimesTen SQL問合せのタイムアウト設定、および『Oracle TimesTen In-Memory Databaseリファレンス』のTTC_Timeoutに関する項で説明されている、TimesTen TTC_Timeoutの設定に注意してください。)

デフォルト: 30秒

注意:

- PL/SQLプログラムが、このタイムアウト値に対して実行時間をチェックする間隔は変更可能です。プログラムをタイムアウト値よりも大幅に長い時間実行してから終了できます。

- TimesTen Client/Serverを使用している場合、PLSQL_TIMEOUTはTTC_Timeoutより大幅に小さくする必要があり、TTC_Timeoutが0より大きい場合は0 (タイムアウトなし)にはできません。詳細は、前述のTTC_Timeoutについて説明しているドキュメントを参照してください。

注意:
PL/SQLで考慮する必要があるTimesTen接続属性は、他にもあります。それらの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の次に示す項を参照してください。

- データベースでPL/SQLが有効になっている場合、DDLCommitBehavior一般接続属性の値は0である必要があります。「DDLCommitBehavior」を参照してください。

- LockLevel一般接続属性が1(データベース・レベルのロック)に設定されている場合、一部のPL/SQL内部ファンクションは実行できません。したがって、接続のLockLevelを0に設定してください。その後、ttLockLevel組込みプロシージャを使用し、必要に応じてトランザクションのロックをデータベース・レベルのロックに切り替えることができます。「LockLevel」および「ttLockLevel」を参照してください。

- PL/SQL共有メモリーのセグメントは、MemoryLock初期接続属性の影響を受けません。「MemoryLock」を参照してください。

この項の以降の部分では、PL/SQL接続属性の設定と変更の例をいくつか示します。

例6-1 デフォルトのPL/SQL接続属性によるデータベースの作成

この例では、PL/SQL接続属性を指定しないでデータベースpldefを定義します。(データベースを作成できるのはインスタンス管理者のみであることに注意してください。)

odbc.iniエントリのサンプル

[pldef]
Driver=/mypath/install/lib/libtten.so
DataStore=/mypath/install/info/DemoDataStore/pldef
DatabaseCharacterSet=US7ASCII

データベースpldefに接続します。

$ ttisql pldef

Copyright (c) 1996-2011, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=pldef";
Connection successful: DSN=pldef;UID=myuser;DataStore=/mypath/install/info/DemoDataStore/pldef;
DatabaseCharacterSet=US7ASCII;ConnectionCharacterSet=US7ASCII;
DRIVER=/mypath/install/lib/libtten.so;TypeMode=0;
(Default setting AutoCommit=1)

ttConfiguration組込みプロシージャをコールして、設定を表示します。これにより、デフォルトのPL/SQL設定が表示されます。

Command> call ttconfiguration;
...
< DataBaseCharacterSet, US7ASCII >
< DataStore, /mypath/install/info/DemoDataStore/pldef >
...
< PLSCOPE_SETTINGS, IDENTIFIERS:NONE >
< PLSQL, 1 >
< PLSQL_CCFLAGS, <NULL> >
...
< PLSQL_CONN_MEM_LIMIT, 100 >
< PLSQL_MEMORY_ADDRESS, 0x10000000 >
< PLSQL_MEMORY_SIZE, 32 >
< PLSQL_OPTIMIZE_LEVEL, 2 >
< PLSQL_TIMEOUT, 30 >
...
< UID, MYUSER >
61 rows found.

例6-2 ALTER SESSIONを使用した属性設定の変更

次の例では、ALTER SESSION文を使用してPL/SQL接続属性を変更し、PLSCOPE_SETTINGS、PLSQL_CONN_MEM_LIMIT、およびPLSQL_OPTIMIZE_LEVELの設定を変更します。次に、ttConfiguration組込みプロシージャをコールして、新しい値を表示します。

Command> ALTER SESSION SET PLSCOPE_SETTINGS = "IDENTIFIERS:ALL";

Session altered.

Command> ALTER SESSION SET PLSQL_CONN_MEM_LIMIT=200;

Session altered.

Command> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=3;

Session altered.

Command> call ttconfiguration;
...
< DataStore, /mypath/install/info/DemoDataStore/pldef >
...
< PLSCOPE_SETTINGS, IDENTIFIERS:ALL >
...
< PLSQL_CONN_MEM_LIMIT, 200 >
...
< PLSQL_OPTIMIZE_LEVEL, 3 >
...
< UID, MYUSER >
61 rows found.

例6-3 PL/SQLパフォーマンス統計情報の表示

ttPLSQLMemoryStats組込みプロシージャを使用すると、PL/SQLライブラリ・キャッシュのパフォーマンスやアクティビティに関する統計情報が戻されます。この例では、サンプル出力をいくつか示します。このプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttPLSQLMemoryStatsに関する説明を参照してください。

Command> call ttplsqlmemorystats;
< Gets, 5.000000 >
< GetHits, 0.000000e+00 >
< GetHitRatio, 0.000000e+00 >
< Pins, 4.000000 >
< PinHits, 0.000000e+00 >
< PinHitRatio, 0.000000e+00 >
< Reloads, 0.000000e+00 >
< Invalidations, 0.000000e+00 >
< CurrentConnectionMemory, 0.000000e+00 >
< DeferredCleanups, 0.000000e+00 >
10 rows found.

注意:
CurrentConnectionMemoryは、「PL/SQL接続属性」に記載されているPLSQL_CONN_MEM_LIMIT接続属性に関連付けられ、PL/SQLによって実際に取得されたヒープ・メモリーの量を示します。

ttSrcScanユーティリティ

既存のPL/SQLプログラムがあり、TimesTenでサポートされていないPL/SQL機能がそのプログラムで使用されているかどうかを確認するには、ttSrcScanコマンドライン・ユーティリティを使用して、プログラムにサポートされていないファンクション、パッケージ、データ型、データ型コード、属性、モードおよび定数がないかスキャンします。このユーティリティは、TimesTenまたはOracle Databaseがインストールされていない場合でも実行可能なスタンドアロン・ユーティリティであり、TimesTenでサポートされているどのプラットフォームでも動作します。入力としてソース・コード・ファイルが読み取られ、出力としてHTMLおよびテキスト・ファイルが作成されます。サポートされていないアイテムが見つかった場合、それらのアイテムはログに記録され、代替アイテムが提案されます。ttSrcScan実行可能ファイルは、TimesTenインストールのquickstart/sample_utilディレクトリにあります。

スキャンするプログラムの入力ファイルまたはディレクトリ、およびttSrcScanレポートの出力ディレクトリを指定します。その他のオプションも使用できます。詳細は、sample_utilディレクトリにあるREADMEファイルを参照してください。

7 PL/SQLプログラムのためのアクセス制御

TimesTenには、データベース・オブジェクト(表、ビュー、マテリアライズド・ビュー、索引、順序、ファンクション、プロシージャ、パッケージなど)をオブジェクトレベルで分解することによる、データベース・アクセス制御の機能があります。TimesTenアクセス制御機能の基本的な情報については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。

この章では、PL/SQLユーザーに関連したアクセス制御について説明します。

注意:
アクセス制御は、TimesTenをインストールすると有効になります。アクセス制御を無効にすることはできません。

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

- PL/SQL操作のためのアクセス制御

- SQL操作のためのアクセス制御

- 定義者権限および実行者権限

- アクセス制御に関するその他の考慮事項

PL/SQL操作のためのアクセス制御

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

- PL/SQL文およびPL/SQL操作に必要な権限

- 権限の付与および取消し

- 無効化されたオブジェクト

PL/SQL文およびPL/SQL操作に必要な権限

PL/SQLユーザーの場合、アクセス制御はPL/SQLのプロシージャおよびファンクション(パッケージおよびそのメンバーのプロシージャとファンクションを含む)の作成、変更、削除または実行に影響します。

プロシージャ、ファンクション、パッケージ定義またはパッケージ本体をユーザー自身のスキーマに作成する場合は、CREATE PROCEDURE権限が必要であり、そのユーザー以外のスキーマに作成する場合はCREATE ANY PROCEDUREが必要です。プロシージャ、ファンクション、パッケージ定義、またはパッケージ本体を変更または削除するには、その所有者であるか、ALTER ANY PROCEDURE権限またはDROP ANY PROCEDURE権限をそれぞれ持っている必要があります。

プロシージャまたはファンクションを実行するには、その所有者であるか、そのプロシージャまたはファンクション(あるいは該当する場合はこれらが所属するパッケージ)に対するEXECUTE権限を持っているか、EXECUTE ANY PROCEDURE権限を持っている必要があります。これらを表7-1にまとめます。

表7-1 PL/SQLのプロシージャおよびファンクションを使用するための権限

操作

SQL文または操作

必要な権限

プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を作成します。

CREATE [OR REPLACE] PROCEDURE

CREATE [OR REPLACE] FUNCTION

CREATE [OR REPLACE] PACKAGE

CREATE [OR REPLACE] PACKAGE BODY

ユーザーのスキーマでのCREATE PROCEDURE

または

他のスキーマでのCREATE ANY PROCEDURE

プロシージャ、ファンクションまたはパッケージを変更します。

ALTER PROCEDURE

ALTER FUNCTION

ALTER PACKAGE

プロシージャ、ファンクションまたはパッケージの所有権

または

ALTER ANY PROCEDURE

プロシージャ、ファンクション、パッケージ定義またはパッケージ本体を削除します。

DROP PROCEDURE

DROP FUNCTION

DROP PACKAGE

DROP PACKAGE BODY

プロシージャ、ファンクションまたはパッケージの所有権

または

DROP ANY PROCEDURE

プロシージャまたはファンクションを実行します。

プロシージャまたはファンクションを起動します。

プロシージャまたはファンクション、あるいはこれらが所属するパッケージ(該当する場合)の所有権

または

プロシージャまたはファンクション、あるいはこれらが属するパッケージ(該当する場合)に対するEXECUTE

または

EXECUTE ANY PROCEDURE

プロシージャ、ファンクション、またはパッケージのプライベート・シノニムを作成します。

CREATE [OR REPLACE] SYNONYM

ユーザーのスキーマでのCREATE SYNONYM

または

他のスキーマでのCREATE ANY SYNONYM

プロシージャ、ファンクションまたはパッケージのパブリック・シノニムを作成します。

CREATE [OR REPLACE] PUBLIC SYNONYM

CREATE PUBLIC SYNONYM

シノニムを使用してプロシージャまたはファンクションを実行します。

そのシノニムを使用してプロシージャまたはファンクションを起動します。

基になるプロシージャまたはファンクションを実行する権限

プロシージャ、ファンクションまたはパッケージのプライベート・シノニムを削除します。

DROP SYNONYM

シノニムの所有権

または

DROP ANY SYNONYM

プロシージャ、ファンクションまたはパッケージのパブリック・シノニムを削除します。

DROP PUBLIC SYNONYM

DROP PUBLIC SYNONYM

この項で説明したSQL文の構文および必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。

注意:

- プロシージャ(またはファンクション)を実行する権限を付与されたユーザーは、プロシージャによってコールされる他のプロシージャに対する権限がない場合でも、そのプロシージャを実行できます。たとえば、ストアド・プロシージャuser2.proc1によって実行されるプロシージャuser2.proc2の例を考えてみます。proc1を実行する権限を付与されているものの、proc2を実行する権限を付与されていないuser1は、直接proc2を実行できませんが、proc1は実行できます。

- プロシージャまたはファンクションの実行時に、これらが無効であるか、またはコンパイルされていなくても、プロシージャまたはファンクションを実行する権限によって暗黙的なコンパイルが可能になります。

- CREATE OR REPLACEの結果としてオブジェクト(プロシージャ、ファンクション、パッケージ、シノニムなど)が置き換えられても、そのオブジェクトに対してユーザーに付与されていた権限には影響ありません。このこととは対照的に、明示的にDROPを実行してからCREATEを実行してオブジェクトを再作成した場合、そのオブジェクトに対するすべての権限が取り消されます。

権限の付与および取消し

権限を付与するには、SQL文GRANTを使用します。権限を取り消すには、REVOKEを使用します。

次の例では、user1が所有するプロシージャおよびパッケージに対するEXECUTE権限をuser2に付与します。

Command> grant execute on user1.myproc to user2;
Command> grant execute on user1.mypkg to user2;

次の例では、この権限を取り消します。

Command> revoke execute on user1.myproc from user2;
Command> revoke execute on user1.mypkg from user2;

例7-1 必要な権限の付与

この例は、ユーザーuser1によって試行される次の一連の操作を示しています。

1. ユーザーが、必要な権限を付与されていないときに各操作を試行します。その結果、エラーが表示されます。

2. インスタンス管理者が必要な権限を付与します。

3. ユーザーは操作の実行に成功します。

user1はttIsqlユーティリティを使用して操作を実行(または試行)し、インスタンス管理者はこのユーティリティを使用して権限を付与します。

USER1:

ユーザーは、最初はプロシージャを作成する権限を持っていません。ユーザー自身のスキーマであっても、付与される必要があります。

Command> create procedure testproc is
> begin
> dbms_output.put_line('user1.testproc called');
> end;
> /
15100: User USER1 lacks privilege CREATE PROCEDURE
The command failed.

インスタンス管理者:

Command> grant create procedure to user1;

USER1:

user1が自身のスキーマでプロシージャを作成できるようになると、プロシージャの所有者になるため、プロシージャの実行が可能になります。

Command> create procedure testproc is
> begin
> dbms_output.put_line('user1.testproc called');
> end;
> /

Procedure created.

Command> begin
> testproc();
> end;
> /
user1.testproc called

PL/SQL procedure successfully completed.

ただし、ユーザーは別のスキーマではまだプロシージャを作成できません。

Command> create procedure user2.testproc is
> begin
> dbms_output.put_line('user2.testproc called');
> end;
> /
15100: User USER1 lacks privilege CREATE ANY PROCEDURE
The command failed.

インスタンス管理者:

Command> grant create any procedure to user1;

USER1:

user1は別のスキーマでプロシージャを作成できるようになりましたが、スキーマを所有していないか、または権限を持っていないため、まだプロシージャを実行できません。

Command> create procedure user2.testproc is
> begin
> dbms_output.put_line('user2.testproc called');
> end;
> /

Procedure created.

Command> begin
> user2.testproc();
> end;
> /
8503: ORA-06550: line 2, column 7:
PLS-00904: insufficient privilege to access object USER2.TESTPROC
8503: ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
The command failed.

インスタンス管理者:

Command> grant execute any procedure to user1;

USER1:

user1は、別のスキーマでプロシージャを実行できるようになりました。

Command> begin
> user2.testproc();
> end;
> /
user2.testproc called

PL/SQL procedure successfully completed.

無効化されたオブジェクト

オブジェクトに対するユーザーの権限が取り消されると、そのオブジェクトを参照する、そのユーザーのすべてのPL/SQLオブジェクトが一時的に無効化されます。権限が元に戻されると、ユーザーはオブジェクトに対して適宜ALTER PROCEDURE、ALTER FUNCTIONまたはALTER PACKAGEを実行し、オブジェクトを明示的に再コンパイルおよび再検証できます。また、各オブジェクトは、次に実行されるときに自動的に再コンパイルおよび再検証されます。

たとえば、user1が、user2.proc1をコールするプロシージャuser1.proc0を所有している場合、user1のproc1に対するEXECUTE権限が取り消されると、proc0は無効になります。

次を使用して、無効になっているオブジェクトがないかを確認します。

select * from user_objects where status='INVALID';

ALTER文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

例7-2 無効化されたオブジェクト

この例では、無効化されたオブジェクト(この例の場合はPL/SQLプロシージャ)を生成する次のようなシーケンスを示します。

1. ユーザーがCREATE ANY PROCEDURE権限を付与され、別のユーザーのスキーマにプロシージャを作成してから、その別のユーザーのスキーマにあるプロシージャをコールするプロシージャをユーザー自身のスキーマに作成します。

2. ユーザーが別のユーザーのスキーマでプロシージャを実行するEXECUTE権限を付与されます。

3. ユーザーが別のユーザーのスキーマでプロシージャをコールするプロシージャを自身のスキーマで実行します。

4. ユーザーから、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が取り消され、そのユーザー自身のプロシージャが無効化されます。

5. ユーザーに、別のユーザーのスキーマのプロシージャに対するEXECUTE権限が再度付与されます。ユーザーが自身のプロシージャを実行すると、プロシージャは暗黙的に再コンパイルおよび再検証されます。

インスタンス管理者:

Command> grant create any procedure to user1;

USER1:

Command> create procedure user2.proc1 is
> begin
> dbms_output.put_line('user2.proc1 is called');
> end;
> /

Procedure created.

Command> create procedure user1.proc0 is
> begin
> dbms_output.put_line('user1.proc0 is called');
> user2.proc1;
> end;
> /

Procedure created.

インスタンス管理者:

Command> grant execute on user2.proc1 to user1;

USER1:

Command> begin
> user1.proc0;
> end;
> /
user1.proc0 is called
user2.proc1 is called

PL/SQL procedure successfully completed.

user1が無効なオブジェクトを持っていないことを確認するには、次のように実行します。

Command> select * from user_objects where status='INVALID';
0 rows found.

インスタンス管理者:

ここで、user1のEXECUTE権限を取り消します。

Command> revoke execute on user2.proc1 from user1;

USER1:

user1にはuser2.proc1を実行する権限がなくなったため、即座にuser1.proc0は無効になります。

Command> select * from user_objects where status='INVALID';
< PROC0, <NULL>, 273, <NULL>, PROCEDURE, 2009-06-04 14:51:34, 2009-06-04 14:58:23,
2009-06-04:14:58:23, INVALID, N, N, N, 1, <NULL> >
1 row found.

このため、user1はプロシージャを実行できなくなりました。

Command> begin
> user1.proc0;
> end;
> /
8503: ORA-06550: line 2, column 7:
PLS-00905: object USER1.PROC0 is invalid
8503: ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
The command failed.

インスタンス管理者:

再度user2.proc1へのEXECUTE権限をuser1に付与します。

Command> grant execute on user2.proc1 to user1;

USER1:

プロシージャuser1.proc0は、明示的または暗黙的に再コンパイルされるまで無効のままです。次に示すとおり、実行時に暗黙的に再コンパイルされます。または、ALTER PROCEDUREを使用して明示的に再コンパイルすることができます。

Command> select * from user_objects where status='INVALID';
< PROC0, <NULL>, 273, <NULL>, PROCEDURE, 2009-06-04 14:51:34, 2009-06-04 16:13:00,
2009-06-04:16:13:00, INVALID, N, N, N, 1, <NULL> >
1 row found.
Command> begin
> user1.proc0;
> end;
> /
user1.proc0 is called
user2.proc1 is called

PL/SQL procedure successfully completed.

Command> select * from user_objects where status='INVALID';
0 rows found.

SQL操作のためのアクセス制御

無名ブロックで実行された問合せ、またはSQL DML文、あるいはEXECUTE IMMEDIATE文で実行されたSQL DDL文(このマニュアルで説明した操作、または例で使用した操作などすべて)では、ユーザーが、文を実行して必要なオブジェクトにアクセスする権限を持っていることを前提としています。PL/SQL無名ブロックで実行されるSQLには、直接実行した場合と同じ権限が必要です。たとえば、ユーザーが所有する表にデータ行を挿入する場合、権限は必要ありません。所有していない表にデータ行を挿入する場合は、その表に対するINSERT権限が付与されているか、またはINSERT ANY TABLEが付与されている必要があります。

SQL文およびその実行に必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。

定義者権限および実行者権限

PL/SQLのプロシージャまたはファンクションを定義するときに、CREATE FUNCTION文またはCREATE PROCEDURE文のオプションのAUTHID句で、プロシージャまたはファンクションを定義者権限(AUTHID DEFINER、デフォルト)で実行するか、実行者権限(AUTHID CURRENT_USER)で実行するかを指定します。同様に、パッケージ内のプロシージャまたはファンクションでは、CREATE PACKAGE文のAUTHID句で、パッケージのメンバーのファンクションまたはプロシージャそれぞれを定義者権限で実行するか、実行者権限で実行するかを指定します。AUTHID句の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明で、これらの文の構文に関する記述を参照してください。

AUTHIDの設定は、実行時にプロシージャまたはファンクションによって発行されるSQL文の名前解決および権限チェックに影響を与えます。定義者権限の場合、SQLの名前解決および権限チェックは、プロシージャまたはファンクションの所有者(定義者、つまりプロシージャまたはファンクションがあるスキーマの所有者)が実行しているものとして実行されます。実行者権限の場合、SQLの名前解決および権限チェックは、現在のユーザー(実行者)が実行しているものとして実行されます。

実行者権限は、コード本体に対しては広範囲な権限を付与する一方で、そのコードの影響範囲を各ユーザーのスキーマ内の自分のオブジェクトに限定する場合に役立ちます。

定義者権限は、すべてのユーザーが1つの集中管理された表またはその他のSQLオブジェクトにアクセスできるようにするものの、プロシージャによって実行される操作を特定の操作に制限する場合に役立ちます。それ以外の場合、ユーザーはSQLオブジェクトにはアクセスできません。

定義者権限および実行者権限の使用例は、「AUTHID句の使用例」を参照してください。

詳細は、『Oracle Database PL/SQL言語リファレンス』の実行者権限および定義者権限(AUTHIDプロパティ)に関する説明を参照してください。

アクセス制御に関するその他の考慮事項

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

- 接続および接続属性のためのアクセス制御

- システム・ビューおよび提供パッケージのためのアクセス制御

- PL/SQLに関連する組込みプロシージャのためのアクセス制御

接続および接続属性のためのアクセス制御

データベースに接続する場合は、次の点に注意してください。

- データベースに接続する権限は、CREATE SESSION権限によって、インスタンス管理者以外のすべてのユーザーに明示的に付与される必要があります。これはシステム権限であるため、インスタンス管理者またはADMIN権限を持つユーザーのいずれかによって、ユーザーに付与される必要があります。この権限付与は、直接またはPUBLICロールを介して実行できます。その他の情報および例は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。

- PL/SQL接続属性に必要な権限の詳細は、「PL/SQL接続属性」を参照してください。

システム・ビューおよび提供パッケージのためのアクセス制御

システム・ビューおよびPL/SQL提供パッケージへのアクセスについては、次の点に注意してください。

- 様々なシステム表、システム・ビュー、PL/SQLファンクション、PL/SQLプロシージャ、およびPL/SQLパッケージに対するSELECT権限およびEXECUTE権限は、デフォルトで、すべてのユーザーがメンバーとばっているPUBLICロールを介して、すべてのユーザーに付与されています。このロールの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』の権限に関する説明を参照してください。これらのパブリック・データベース・オブジェクトおよび関連する権限のリストを表示するには、次のコマンドを使用します。

SELECT table_name, privilege FROM sys.all_tab_privs
WHERE grantee='PUBLIC';

すべてのユーザーがALL_*システム・ビューおよびUSER_*システム・ビューに対するSELECT権限を持っています。

- EXECUTE ANY PROCEDUREは提供パッケージには適用されませんが、そのほとんどはPUBLICロールを介してアクセス可能です。TimesTenで提供されるPL/SQLパッケージのアクセス制御の詳細は、第8章「TimesTenが提供するPL/SQLパッケージ」を参照してください。

PL/SQLに関連する組込みプロシージャのためのアクセス制御

ライブラリ・キャッシュのパフォーマンスおよびアクティビティに関する統計を返すttPLSQLMemoryStats組込みプロシージャは、どのユーザーでもコールできます。このプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttPLSQLMemoryStatsに関する説明を参照してください。例 6-3も参照してください。

8 TimesTenが提供するPL/SQLパッケージ

TimesTenは、データベース機能を拡張したり、SQL機能にアクセスするPL/SQLを利用するためのパブリックPL/SQLパッケージ(下のリストを参照)を提供しています。TimesTenは、これらのパッケージをユーザーが使用できるよう自動的にインストールします。PL/SQL言語自体の一部であるパッケージまたはOracle Database内部でのみ使用されるパッケージは示しておらず、この章では説明していません。

この章は、各パッケージを構成しているサブプログラムをリストとして表示し、簡単に説明しています。これらのPL/SQLパッケージの詳細は、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』を参照してください。

- DBMS_LOB

- DBMS_LOCK

- DBMS_OUTPUT

- DBMS_PREPROCESSOR

- DBMS_RANDOM

- DBMS_SQL

- DBMS_UTILITY

- TT_DB_VERSION

- TT_STATS

- UTL_FILE

- UTL_IDENT

- UTL_RAW

- UTL_RECOMP

DBMS_LOB

DBMS_LOBパッケージは、一時LOBを含む、BLOB、CLOB、およびNCLOBを操作するためのサブプログラムを提供します。

注意:

- TimesTenは、特にBFILE、SecureFile(Database File System機能など)を対象としたDBMS_LOBサブプログラム、またはLOB内のデータ・フラグメントの挿入や削除をサポートしていません。

- DBMS_LOBプロシージャおよびファンクションは、TimesTenを使用してアクセスされ、TimesTen LOBとして公開されるOracle DatabaseのLOBである、TimesTen LOBおよびパススルーLOBの両方でサポートされています。ただし、CREATETEMPORARYを使用できるのは、TimesTenの一時LOBを作成する場合のみであることに注意してください。SQLなどの他の方法を使用して一時パススルーLOBを作成する場合、ISTEMPORARYおよびFREETEMPORARYをそのLOBに使用できます。
TimesTenローカルLOBと同様、パススルーLOBのロケータは、トランザクションが終了すると無効になります。

COPYは、あるTimesTen LOBから別のTimesTen LOBにコピーできるだけでなく、TimesTen LOBからパススルーLOBにコピーしたり、パススルーLOBからTimesTen LOBにコピーしたり、またはあるパススルーLOBから別のパススルーLOBにコピーすることもできます。パススルーLOBがTimesTen LOBのサイズ制限より大きい場合に、パススルーLOBをTimesTen LOBにコピーしようとすると、エラーが発生します。(LOBのコピーの例については、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』のCOPYプロシージャに関する説明を参照してください。)

関連情報は、「パススルーLOB」を参照してください。

表8-1に、サポートされているDBMS_LOBのサブプログラムを示します。

表8-1 DBMS_LOBのサブプログラム

サブプログラム

説明

APPENDプロシージャ

ソースLOBの内容を宛先LOBに追加します。

CLOSEプロシージャ

オープンされているLOBをクローズします。

COMPAREファンクション

2つのLOB全体、または2つのLOBの一部を比較します。

CONVERTTOBLOBプロシージャ

ソースCLOBまたはNCLOBインスタンスから、文字データを読み取り、指定した文字セットに変換して、変換したデータをバイナリ形式で宛先BLOBインスタンスに書き込み、新しいオフセットを戻します。

CONVERTTOCLOBプロシージャ

ソースBLOBインスタンスを取得し、指定した文字セットを使用して、ソース・インスタンスのバイナリ・データを文字データに変換し、文字データを宛先CLOBまたはNCLOBインスタンスに書き込み、新しいオフセットを戻します。

COPYプロシージャ

ソースLOBの内容を宛先LOBにコピーします。

CREATETEMPORARYプロシージャ

一時データ領域に一時LOBを作成します。Oracle Databaseがサポートするいずれの期間も許可されますが(SESSION、TRANSACTION、またはCALL)、TimesTenでは、LOB期間をトランザクションの終了後まで延長することはできません。

ERASEプロシージャ

すべてまたは一部のLOBを削除します。

FREETEMPORARYプロシージャ

一時データ領域の一時LOBを解放します。

GET_STORAGE_LIMITファンクション

指定したLOBのLOB型の記憶域制限を戻します。

GETCHUNKSIZEファンクション

これは、TimesTenでは、互換性のために値32KBを戻すだけです。パフォーマンスをチューニングする際にこの値を使用しないでください。

GETLENGTHファンクション

BLOBはバイト単位で、CLOBまたはNCLOBは文字単位で、LOB値の長さを戻します。

INSTRファンクション

LOBにあるパターンのn番目の一致のマッチング位置を戻します。

ISOPENファンクション

LOBが入力ロケータを使用して、すでにオープンされたかどうかをチェックします。

ISTEMPORARYファンクション

ロケータが一時LOBを指しているかどうかを確認します。

OPENプロシージャ

指定のモード(読取り/書込みまたは読取り専用)でLOB(永続または一時)を開きます。

注意: LOBをオープンすることは、ファイルを開くことと概念的に似ていますが、技術的には同じではありません。LOBをオープンすることは、必要なリソースに関するヒントのようなものです。

READプロシージャ

指定されたオフセットからLOBのデータを読み取ります。

SUBSTRファンクション

指定されたオフセットからLOB値の一部を戻します。

TRIMプロシージャ

指定された長さまでLOB値を切り捨てます。

WRITEプロシージャ

指定されたオフセットからLOBにデータを書き込みます。

WRITEAPPENDプロシージャ

LOBの終わり以降にバッファを書き込みます。

DBMS_LOCK

DBMS_LOCKパッケージでは、ロック管理サービスへのインタフェースを提供します。TimesTenの現在のリリースでは、スリープ機能のみがサポートされています。

表8-2に、サポートされているDBMS_LOCKのサブプログラムを示します。

表8-2 DBMS_LOCKのサブプログラム

サブプログラム

説明

SLEEPプロシージャ

このプロシージャは、指定した期間、セッションを一時停止します。時間を秒単位で指定します。サポートされている最小の増分は、100分の1秒です。次に例を示します。

DBMS_LOCK.SLEEP(1.95);

注意:

- システムのアクティビティによっては、実際のスリープ時間が指定した時間より多少長くなる場合があります。

- PLSQL_TIMEOUTがこのスリープ時間より短い正の値に設定されている場合は、タイムアウトが先に発生します。スリープ時間をタイムアウト値より短くするか、またはPLSQL_TIMEOUT=0(タイムアウトなし)にする必要があります。PLSQL_TIMEOUTの詳細は、「PL/SQL接続属性」を参照してください。

DBMS_OUTPUT

DBMS_OUTPUTパッケージを使用すると、ストアド・プロシージャおよびパッケージからメッセージを送信できます。このパッケージは、PL/SQLのデバッグ情報を表示する場合に役立ちます。

表8-3に、DBMS_OUTPUTのサブプログラムを示します。

表8-3 DBMS_OUTPUTのサブプログラム

サブプログラム

説明

DISABLEプロシージャ

メッセージ出力を無効にします。

ENABLEプロシージャ

メッセージ出力を有効にします。

GET_LINEプロシージャ

バッファから1行を取得します。

GET_LINESプロシージャ

バッファから行の配列を取得します。

NEW_LINEプロシージャ

PUTで作成された行を終了します。

PUTプロシージャ

行をバッファに格納します。

PUT_LINEプロシージャ

行の一部をバッファに格納します。

DBMS_PREPROCESSOR

DBMS_PREPROCESSORパッケージでは、条件付きコンパイル・ディレクティブの処理後にPL/SQLユニットのソース・テキストを出力または取得するためのインタフェースを提供します。

表8-4に、DBMS_PREPROCESSORのサブプログラムを示します。

表8-4 DBMS_PREPROCESSORのサブプログラム

サブプログラム

説明

GET_POST_PROCESSED_SOURCEファンクション

後処理されたソース・テキストを戻します。

PRINT_POST_PROCESSED_SOURCEプロシージャ

後処理されたソース・テキストを出力します。

DBMS_RANDOM

DBMS_RANDOMパッケージは、組込み式の乱数ジェネレータを提供します。

表8-5に、DBMS_RANDOMのサブプログラムを示します。

表8-5 DBMS_RANDOMのサブプログラム

サブプログラム

説明

INITIALIZEプロシージャ

パッケージをシード値で初期化します(非推奨)。

NORMALファンクション

正規分布の乱数を戻します。

RANDOMプロシージャ

乱数を生成します(非推奨)。

SEEDプロシージャ

シードをリセットします。

STRINGファンクション

ランダム文字列を取得します。

TERMINATEプロシージャ

パッケージを終了します(非推奨)。

VALUEファンクション

2つのオーバーロード・バージョンがあります。1つ目のバージョンでは、0以上1未満で、小数点以下が38桁(精度38桁)の乱数を取得します。2つ目のバージョンでは、指定された下限および上限内の乱数を取得します。

DBMS_SQL

DBMS_SQLパッケージは、動的SQLを使用して次のいずれかを実行する場合のインタフェースを提供します。

- データ操作言語(DML)およびデータ定義言語(DDL)文を実行します。

- 無名PL/SQLブロックを実行します。

- PL/SQLストアド・プロシージャおよびファンクションをコールします。

このパッケージは、事前定義されたデータ型、およびUROWID、タイムゾーン機能、ADT、データベースレベルのコレクション、エディションのオーバーロードなどの、TimesTenでサポートされていないデータ型によるオーバーロードをサポートしていません。TimesTen PL/SQLでサポートされるデータ型の詳細は、「データ型の理解」を参照してください。

表8-6に、DBMS_SQLのサブプログラムを示します。

表8-6 DBMS_SQLのサブプログラム

サブプログラム

説明

BIND_ARRAYプロシージャ

指定された値を指定されたコレクションにバインドします。

BIND_VARIABLEプロシージャ

指定された値を指定された変数にバインドします。

CLOSE_CURSORプロシージャ

指定されたカーソルをクローズしてメモリーを解放します。

COLUMN_VALUEプロシージャ

カーソル内の指定された位置のカーソル要素の値を戻します。

COLUMN_VALUE_LONGプロシージャ

DEFINE_COLUMN_LONGで定義したLONG列の選択された部分を戻します。

重要: TimesTenではLONGデータ・タイプはサポートされていないため、TimesTenでこのプロシージャを使用しようとすると、実行時にORA-01018エラーが発生します。

DEFINE_ARRAYプロシージャ

指定されたカーソルから選択するコレクションを定義します。SELECT文とともに使用します。

DEFINE_COLUMNプロシージャ

指定されたカーソルから選択する列を定義します。SELECT文とともに使用します。

DEFINE_COLUMN_LONGプロシージャ

指定したカーソルから選択するLONG列を定義します。SELECT文とともに使用します。

重要: TimesTenではLONGデータ・タイプはサポートされていないため、TimesTenでCOLUMN_VALUE_LONGプロシージャを使用しようとすると、実行時にORA-01018エラーが発生します。DEFINE_COLUMN_LONGは、COLUMN_VALUE_LONGと組み合せて使用されます。

DESCRIBE_COLUMNSプロシージャ

DBMS_SQLパッケージでオープンして解析したカーソルの列を示します。

DESCRIBE_COLUMNS2プロシージャ

指定された列を示します。DESCRIBE_COLUMNSプロシージャのかわりとして使用します。

DESCRIBE_COLUMNS3プロシージャ

指定された列を示します。DESCRIBE_COLUMNSプロシージャのかわりとして使用します。

EXECUTEファンクション

指定されたカーソルを実行します。

EXECUTE_AND_FETCHファンクション

指定されたカーソルを実行して行をフェッチします。

FETCH_ROWSファンクション

指定されたカーソルから行をフェッチします。

IS_OPENファンクション

指定されたカーソルがオープンしている場合は、TRUEを戻します。

LAST_ERROR_POSITIONファンクション

エラーが発生したSQL文テキスト内のバイト・オフセットを戻します。

LAST_ROW_COUNTファンクション

フェッチされた行の累積数を戻します。

LAST_ROW_IDファンクション

NULLを戻します。TimesTenでは、DML文によって最後に処理された行のROWIDはサポートされていません。

LAST_SQL_FUNCTION_CODEファンクション

文のSQL機能コードを戻します。

OPEN_CURSORファンクション

新しいカーソルのカーソルID番号を戻します。

PARSEプロシージャ

指定された文を解析します。

TO_CURSOR_NUMBERファンクション

OPENによってオープンされた強い型指定のREF CURSOR、または弱い型指定のREF CURSORを取得し、DBMS_SQLカーソル番号に変換します。

TO_REFCURSORファンクション

OPEN、PARSEおよびEXECUTEによってオープン、解析および実行されたカーソルを取得し、PL/SQLのネイティブ動的SQLで使用したり、ネイティブ動的SQLを使用するよう切り替えることができる、PL/SQLで管理可能なREF CURSOR(弱い型指定のカーソル)に変換または移行します。

VARIABLE_VALUEプロシージャ

指定されたカーソルの名前付き変数の値を戻します。

DBMS_UTILITY

DBMS_UTILITYパッケージには、様々なユーティリティ・サブプログラムが含まれています。

TimesTenでサポートされていない機能に関連するサブプログラムは、サポートされていません(ここにも記載されていません)。

表8-7に、DBMS_UTILITYのサブプログラムを示します。

表8-7 DBMS_UTILITYのサブプログラム

サブプログラム

説明

CANONICALIZEプロシージャ

指定された文字列を正規化します。

COMMA_TO_TABLEプロシージャ

名前のカンマ区切りリストを名前の連想配列(索引付き表)に変換します。

COMPILE_SCHEMA

指定したデータベーススキーマ内にあるすべてのプロシージャ、ファンクション、パッケージおよびビューをコンパイルします。

DB_VERSIONプロシージャ

データベースに関するバージョン情報を戻します。

TimesTenではシステム・パラメータCOMPATIBLEはサポートされていないため、互換性設定についてはNULLが戻されます。

FORMAT_CALL_STACKファンクション

現在のコール・スタックをフォーマットします。

FORMAT_ERROR_BACKTRACEファンクション

現在のエラーのポイントからエラーが捕捉された例外ハンドラまでのバックトレースをフォーマットします。

FORMAT_ERROR_STACKファンクション

現在のエラー・スタックをフォーマットします。

GET_CPU_TIMEファンクション

現在のCPUタイムを100分の1秒単位で戻します。

GET_DEPENDENCYプロシージャ

渡されたオブジェクトへの依存を表示します。

GET_ENDIANNESSファンクション

データベース・プラットフォームのエンディアンネスを戻します。

GET_HASH_VALUEファンクション

指定された文字列のハッシュ値を計算します。

GET_SQL_HASHファンクション

MD5アルゴリズムを使用して、指定された文字列のハッシュ値を計算します。

GET_TIMEファンクション

現在の時間を100分の1秒単位で戻します。

INVALIDATEプロシージャ

データベース・オブジェクトを無効にし、オプションでオブジェクトのPL/SQLコンパイラのパラメータ設定を変更します。

IS_BIT_SETファンクション

RAW値の指定されたビットの設定を確認します。

NAME_RESOLVEプロシージャ

次のフォームの指定された名前を解決します。

[[a.]b.]c[@dblink]

a、bおよびcはSQL識別子、dblinkはdblink(データベース・リンク)です。

@dblinkは使用しないでください。TimesTenでは、データベース・リンクはサポートされていません。

NAME_TOKENIZEプロシージャ

パーサーをコールして、次のフォームの指定された名前を解析します。

"a [.b [.c ]][@dblink]"

二重引用符を削除するか、または引用符がない場合は、大文字に変換します。コメントを無視し、セマンティック分析は実行しません。不明な値はNULLになります。

@dblinkは使用しないでください。TimesTenでは、データベース・リンクはサポートされていません。

TABLE_TO_COMMAプロシージャ

名前の連想配列(索引付き表)を名前のカンマ区切りリストに変換します。

VALIDATEプロシージャ

所有者、名前およびネームスペースまたはオブジェクトIDで示されたオブジェクトを有効にします。

TT_DB_VERSION

TT_DB_VERSIONパッケージには、現在のTimesTenリリースを示すブール定数が含まれています。

表8-8に、TT_DB_VERSIONの定数を示します。

TT_DB_VERSIONおよびUTL_IDENTパッケージは、主に条件付きコンパイルに使用されます。

表8-8 TT_DB_VERSIONの定数

名前

説明

VER_LE_1121

このパッケージが付属しているTimesTenのバージョンが11.2.1以前の場合、ブールはTRUEです。TimesTen 11g リリース2 (11.2.2)バージョンの場合はFALSEです。

VER_LE_1122

このパッケージが付属しているTimesTenのバージョンが11.2.2以前の場合、ブールはTRUEです。TimesTen 11g リリース2 (11.2.2)バージョンの場合はTRUEです。

TT_DB_VERSIONおよびUTL_IDENTを使用する例については、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』の例に関する説明を参照してください。

TT_STATS

TT_STATSパッケージには、TimesTenシステム・メトリックのスナップショットを取得レベルに応じて収集および比較する機能が備えられています。各スナップショットは、TimesTenで基本的なメトリックまたは一般的なメトリックとみなされるもの、あるいは使用可能なすべてのメトリックで構成されます。

生成されるレポートは、Oracle Databaseのパフォーマンス分析ツールに例えた場合、Oracle Automatic Workload Repository (AWR)レポートに類似しています。

表8-9 TT_STATSサブプログラム

サブプログラム

説明

CAPTURE_SNAPSHOTプロシージャおよびファンクション

TimesTenメトリックのスナップショットを取得します。また、ファンクションはスナップショットIDも戻します。

DROP_SNAPSHOTS_RANGEファンクション

特定の範囲のスナップショットIDまたはタイムスタンプに従ってスナップショットを削除します。

GENERATE_REPORT_HTMLプロシージャ

特定の2つのスナップショットのデータに基づいて、レポートをHTML形式で生成します。

GENERATE_REPORT_TEXTプロシージャ

特定の2つのスナップショットのデータに基づいて、レポートをプレーン・テキスト形式で生成します。

GET_CONFIGファンクション

特定のTT_STATS構成パラメータの値またはすべての構成パラメータの値を取得します。

SET_CONFIGプロシージャ

特定のTT_STATS構成パラメータに特定の値を設定します。

SHOW_SNAPSHOTSファンクション

データベースに現在格納されているすべてのスナップショットのスナップショットIDおよびタイムスタンプを表示します。

UTL_FILE

UTL_FILEパッケージを使用すると、PL/SQLプログラムでオペレーティング・システムのテキスト・ファイルの読取りと書込みが可能になります。

現在のリリースでは、このパッケージは事前に定義された一時ディレクトリのアクセスにのみ制限されます。詳細は、『Oracle TimesTen In-Memory Databaseリリース・ノート』を参照してください。

注意:
デフォルトでは、ユーザーにはUTL_FILEに対する実行権限はありません。TimesTenでUTL_FILEを使用するには、次の例に示すとおり、ADMINユーザーまたはインスタンス管理者が、明示的にEXECUTEを実行して権限を付与する必要があります。

GRANT EXECUTE ON SYS.UTL_FILE TO scott;

表8-10に、UTL_FILEのサブプログラムを示します。

表8-10 UTL_FILEのサブプログラム

サブプログラム

説明

FCLOSEプロシージャ

ファイルをクローズします。

FCLOSE_ALLプロシージャ

すべてのファイル・ハンドルをクローズします。

FCOPYプロシージャ

ファイルの連続する部分を新しく作成されたファイルにコピーします。

FFLUSHプロシージャ

保留中のすべての出力を物理的にファイルに書き込みます。

FGETATTRプロシージャ

ディスク・ファイルの属性を読み取って戻します。

FGETPOSプロシージャ

ファイル内の現在の相対オフセット位置をバイト単位で戻します。

FOPENファンクション

入力または出力に使用するファイルをオープンします。

FOPEN_NCHARファンクション

入力または出力に使用するファイルをUnicodeでオープンします。

FREMOVEプロシージャ

ユーザーに十分な権限がある場合、ディスク・ファイルを削除します。

FRENAMEプロシージャ

既存のファイルの名前を新しい名前に変更します(UNIXのmvコマンドと同様)。

FSEEKプロシージャ

ファイル・ポインタを指定されたバイト数だけファイル内で前後に調整します。

GET_LINEプロシージャ

オープン・ファイルからテキストを読み取ります。

GET_LINE_NCHARプロシージャ

オープン・ファイルからテキストをUnicodeで読み取ります。

GET_RAWファンクション

RAW文字列値をファイルから読み込み、読み込んだバイトの数だけ、ファイルのポインタを前方に調整します。

IS_OPENファンクション

ファイル・ハンドルがオープン・ファイルを参照しているかどうかを判断します。

NEW_LINEプロシージャ

1つ以上のOS固有の行終了記号をファイルに書き込みます。

PUTプロシージャ

文字列をファイルに書き込みます。

PUT_LINEプロシージャ

ファイルに1行書き込み、OS固有の行終了記号を1つ追加します。

PUT_LINE_NCHARプロシージャ

Unicode行をファイルに書き込みます。

PUT_NCHARプロシージャ

Unicode文字列をファイルに書き込みます。

PUT_RAWファンクション

RAWデータ値を入力として受け入れ、出力バッファに書き込みます。

PUTFプロシージャ

これはPUTプロシージャと同様ですが、書式付きです。

PUTF_NCHARプロシージャ

これはPUT_NCHARプロシージャと同様ですが、書式付きです。Unicode文字列を書式付きでファイルに書き込みます。

UTL_IDENT

UTL_IDENTパッケージは、PL/SQLを実行しているのがTimesTen、Oracle Databaseクライアント、Oracle DatabaseサーバーまたはOracle Formsであるかを示します。これらにはそれぞれ、定数に適切な設定を持つUTL_IDENTのバージョンがあります。

表8-11に、TimesTenのUTL_IDENT設定を示します。

UTL_IDENTパッケージは、次のように、主に条件付きコンパイルに使用されます。

$if utl_ident.is_oracle_server $then
[...Run code supported for Oracle Database...]
$elsif utl_ident.is_timesten $then
[...code supported for TimesTen Database...]
$end

表8-11 UTL_IDENTの定数

名前

説明

IS_ORACLE_CLIENT

BOOLEANはFALSEに設定されています。

IS_ORACLE_SERVER

BOOLEANはFALSEに設定されています。

IS_ORACLE_FORMS

BOOLEANはFALSEに設定されています。

IS_TIMESTEN

BOOLEANはTRUEに設定されています。

TT_DB_VERSIONおよびUTL_IDENTを使用する例については、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』の例に関する説明を参照してください。

UTL_RAW

UTL_RAWパッケージは、RAWデータ・タイプを操作するためのSQLファンクションを提供します。

表8-12に、UTL_RAWのサブプログラムを示します。

表8-12 UTL_RAWのサブプログラム

サブプログラム

説明

BIT_ANDファンクション

2つのRAW値でビット単位の論理演算"AND"を実行し、結果のRAWを戻します。

BIT_COMPLEMENTファンクション

1つのRAW値でビット単位の論理演算"COMPLEMENT"を実行して、結果のRAWを戻します。

BIT_ORファンクション

2つのRAW値でビット単位の論理演算"OR"を実行し、結果のRAWを戻します。

BIT_XORファンクション

2つのRAW値でビット単位の論理演算"EXCLUSIVE OR"を実行し、結果のRAWを戻します。

CAST_FROM_BINARY_DOUBLEファンクション

BINARY_DOUBLE値のRAWバイナリ表現を戻します。

CAST_FROM_BINARY_FLOATファンクション

BINARY_FLOAT値のRAWバイナリ表現を戻します。

CAST_FROM_BINARY_INTEGERファンクション

BINARY_INTEGER値のRAWバイナリ表現を戻します。

CAST_FROM_NUMBERファンクション

NUMBER値のRAWバイナリ表現を戻します。

CAST_TO_BINARY_DOUBLEファンクション

BINARY_DOUBLE値のRAWバイナリ表現をBINARY_DOUBLEに変換します。

CAST_TO_BINARY_FLOATファンクション

BINARY_FLOAT値のRAWバイナリ表現をBINARY_FLOATに変換します。

CAST_TO_BINARY_INTEGERファンクション

BINARY_INTEGER値のRAWバイナリ表現をBINARY_INTEGERに変換します。

CAST_TO_NUMBERファンクション

NUMBER値のRAWバイナリ表現をNUMBERに変換します。

CAST_TO_NVARCHAR2ファンクション

nデータ・バイトで表現されたRAW値をnデータ・バイトのNVARCHAR2値にキャストします。

CAST_TO_RAWファンクション

nデータ・バイトで表現されたVARCHAR2値をnデータ・バイトのRAW値にキャストします。

CAST_TO_VARCHAR2ファンクション

nデータ・バイトで表現されたRAW値をnデータ・バイトのVARCHAR2値にキャストします。

COMPAREファンクション

2つのRAW値を比較します。

CONCATファンクション

最大12個のRAW値を単一のRAW値に連結します。

CONVERTファンクション

RAW値をあるキャラクタ・セットから別のキャラクタ・セットに変換して、結果のRAWを戻します。

COPIESファンクション

RAW値を指定回数コピーして、連結されたRAW値を戻します。

LENGTHファンクション

RAW値の長さをバイトで戻します。

OVERLAYファンクション

ターゲットRAW値の指定部分をオーバーレイRAW値でオーバーレイします(指定したバイト位置から開始され、指定したバイト数だけ進められます)。

REVERSEファンクション

RAW値内のバイトの順序を逆にします。

SUBSTRファンクション

指定された開始位置から指定されたバイト数だけ、RAW値のサブストリングを戻します。

TRANSLATEファンクション

指定された変換RAW値のバイトに従って、入力RAW値内の指定されたバイトを変換します。

TRANSLITERATEファンクション

指定された文字変換RAW値のバイトに従って、入力RAW値内の指定されたバイトを変換します。

XRANGEファンクション

指定されたバイト・コードで開始および終了する連続する1バイト・エンコーディングを含むRAW値を戻します。

UTL_RECOMP

UTL_RECOMPパッケージを使用すると、無効なPL/SQLモジュールを再コンパイルできます。このパッケージは、特に、通常ではすべてのPL/SQLオブジェクトが無効になるメジャー・バージョン・アップグレードの後に役立ちます。

表8-13に、UTL_RECOMPのサブプログラムを示します。

重要:
このパッケージを使用するには、インスタンス管理者である必要があり、SYS.UTL_RECOMPを指定する必要があります。

表8-13 UTL_RECOMPのサブプログラム

名前

説明

RECOMP_PARALLELプロシージャ

指定されたスキーマ内の無効なオブジェクトまたはデータベース内のすべての無効なオブジェクトをパラレルに再コンパイルします。

注意: TimesTenではDBMS_SCHEDULERがサポートされていないため、パラレルに実行される再コンパイル・スレッドの数は、ユーザーの指定にかかわらず常に1です。したがって、TimesTenではRECOMP_PARALLELとRECOMP_SERIALの違いは事実上ありません。

RECOMP_SERIALプロシージャ

指定されたスキーマ内の無効なオブジェクト、またはデータベース内のすべての無効なオブジェクトをシリアルに再コンパイルします。

9 TimesTen PL/SQLサポート: リファレンスの概要

この章では、PL/SQLの言語要素および機能の概要を示し、TimesTenにおけるサポートとOracle Databaseにおけるサポートを比較します。Oracle Databaseマニュアルでは、これらの機能の多くは、『Oracle Database PL/SQL言語リファレンス』のPL/SQLの言語要素に関する項で説明されています。

表9-1 TimesTenにおけるPL/SQL言語要素および機能のサポート

機能名

説明

サポート

例/コメント

ALTER {PROCEDURE| FUNCTION | PACKAGE}文

PL/SQLプロシージャ、ファンクション、またはパッケージを再コンパイルします。

Y

構文およびセマンティクスはOracle Databaseの場合と同じです。

これらの文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

ALTER SESSION文

セッション・パラメータを動的に変更します。

Y

TimesTenでは、「PL/SQL接続属性」で説明されているように、ALTER SESSIONを使用して、一部のPL/SQL接続属性を設定できます。

TimesTenにおけるこの文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のALTER SESSIONに関する説明を参照してください。

代入文

変数、パラメータまたは要素の現在の値を設定します。

Y

「PL/SQLの変数および定数」を参照してください。

AUTONOMOUS_TRANSACTIONプラグマ

ルーチンを自律型としてマークします。

N

TimesTenでは、自律型トランザクションはサポートされていません。

ブロック宣言

ブロック(PL/SQLソース・プログラムの基本単位)を宣言します。

Y

「PL/SQLブロック」を参照してください。

BULK COLLECT句

複数行を選択します。

Y

PL/SQLでSELECT文とともにこの句を使用すると、カーソルを使用せずに行を取得できます。「FORALL操作およびBULK COLLECT操作」および「FORALLおよびBULK COLLECTを使用する例」を参照してください。

CALL文

SQL内からルーチンを実行します。

Y

TimesTenでは、Oracle Database、またはTimesTen組込みプロシージャと同様に、CALL文を使用してPL/SQLのストアド・プロシージャとファンクションを実行します。(TimesTen組込みプロシージャでは、CALLがPL/SQL内にある場合、EXECUTE IMMEDIATE文を使用します。)「PL/SQLのプロシージャおよびファンクションを実行する方法」および例5-19「EXECUTE IMMEDIATEを使用したttConfigurationのコール」を参照してください。

CASE文

式を評価し、複数の値と比較して、比較結果がTRUEの場合にアクションを実行します。

Y

「PL/SQL制御構造」を参照してください。

CLOSE文

カーソルまたはカーソル変数をクローズします。

Y

(特に)例2-13「カーソルを使用した従業員情報の取得」を参照してください。

コレクション定義

すべて同じ型の要素の順序付きグループであるコレクションを指定します。

Y

たとえば、連想配列(索引付き表またはPL/SQL表)、ネストした表、VARRAYなどがあります。

TimesTenは、PL/SQLプログラムのこれら3つのコレクション型のすべてをサポートしますが、連想配列だけは、PL/SQLおよび他の言語(OCIまたはJDBC)で記述されたアプリケーション間のバウンド・パラメータとしてサポートされます。

「PL/SQLでのコレクションの使用」を参照してください。

コレクション・メソッド

コレクションに対して動作し、ドット表記法を使用してコールされる組込みサブプログラム。

Y

『Oracle Database PL/SQL言語リファレンス』のコレクション・メソッドに関する説明を参照してください。コレクション・メソッドには、COUNT、DELETE、EXISTS、EXTEND、FIRST、LAST、LIMIT、NEXT、PRIOR、TRIMなどがあります。

コメント

説明のためにコードに含められるテキスト。

Y

1行コメントと複数行コメントがサポートされています。

COMMIT文

現在のトランザクションを終了し、トランザクションで加えられたすべての変更を確定します。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCOMMITに関する説明を参照してください。

重要: TimesTenでは、COMMIT文およびROLLBACK文によってすべてのカーソルがクローズされます。

接続属性

Oracle Databaseの初期化パラメータに相当します。

Y

「PL/SQL接続属性」を参照してください。これらの接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPL/SQL初期接続属性およびPL/SQL一般接続属性に関する説明も参照してください。

定数と変数の宣言

PL/SQLコードで使用する定数と変数を、PL/SQLブロック、サブプログラムまたはパッケージの宣言部で指定します。

Y

「PL/SQLの変数および定数」を参照してください。

CONTINUE文

ループの現在の反復を終了し、制御を次の反復に渡します。

Y

「CONTINUE文」を参照してください。

CREATE FUNCTION文

PL/SQLファンクションを作成します。

Y

CREATE FUNCTIONはTimesTenでサポートされていますが、AS LANGUAGE、AS EXTERNALおよびPIPELINED句はサポートされていません。

「PL/SQLのプロシージャおよびファンクション」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCREATE FUNCTIONに関する説明も参照してください。

TimesTenでDBMSSTDX.SQLを実行する必要はありません。

CREATE LIBRARY文

ライブラリを共有しているオペレーティング・システムに関連するスキーマ・オブジェクトを作成します。

N

CREATE LIBRARYは、TimesTenでサポートされていません。

CREATE PACKAGE文

CREATE PACKAGE BODY文

これらの文を同時に使用して、PL/SQLパッケージ定義およびパッケージ本体を作成します。

Y

構文およびセマンティクスはOracle Databaseの場合と同じです。

「PL/SQLパッケージ」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE PACKAGEおよびCREATE PACKAGE BODYに関する説明も参照してください。

TimesTenでDBMSSTDX.SQLを実行する必要はありません。

CREATE PROCEDURE文

PL/SQLプロシージャを作成します。

Y

CREATE PROCEDUREはTimesTenでサポートされていますが、AS LANGUAGEおよびAS EXTERNAL句はサポートされていません。

「PL/SQLのプロシージャおよびファンクション」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCREATE PROCEDUREに関する説明も参照してください。

注意: TimesTenでは、DBMSSTDX.SQLを実行する必要はありません。

CREATE TYPE文

ユーザー定義のオブジェクト型またはコレクション型を作成します。

N

TimesTenはCREATE TYPEをサポートしていません。

CURRENT_DATEファンクション

セッション・タイムゾーンの現在の日付を戻します。

Y

TimesTenでは、UTC(世界標準時)で現在の日時を戻します。TimesTenは、ローカル・タイムゾーンをサポートしていません。

カーソル属性

カーソルまたはカーソル変数に追加され、データ操作文の実行に関する有用な情報を戻します。

Y

明示カーソルとカーソル変数には、%FOUND、%ISOPEN、%NOTFOUNDおよび%ROWCOUNTという4つの属性があります。

暗黙カーソル(SQL)には、さらに%BULK_ROWCOUNTおよび%BULK_EXCEPTIONSという属性があります。

「%ROWCOUNT属性および%NOTFOUND属性の使用」および「SQL%BULK_ROWCOUNTでのFORALLの使用」を参照してください。また、『Oracle Database PL/SQL言語リファレンス』の名前付きカーソル属性に関する説明も参照してください。

カーソル宣言

カーソルを宣言します。複数行の問合せを実行するために、TimesTenによって、処理情報が格納される名前のない作業領域がオープンされます。カーソルを使用して、作業領域に名前を付けたり、情報にアクセスしたり、行を個別に処理できます。

Y

「PL/SQLプログラムでのカーソルの使用」を参照してください。

カーソル変数(REF CURSOR)

SQL結果セット上のカーソルへのハンドルとして機能します。

Y

TimesTenでは、OUT REF CURSORは1文に1つのみがサポートされています。

「PL/SQL REF CURSOR」を参照してください。

Databaseリンク(dblinks)

Oracle Databaseサーバーから別のデータベース・サーバーへの一方向の接続パスを定義するポインタ。

N

TimesTenはデータベース・リンクをサポートしていません。

DELETE文

表から行を削除します。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のDELETEに関する説明を参照してください。

DROP { PROCEDURE | FUNCTION | PACKAGE }文

指定されたとおりにPL/SQLプロシージャ、ファンクション、またはパッケージを削除します。

Y

構文およびセマンティクスはOracle Databaseの場合と同じです。

これらの文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。

エラー・レポート

(説明なし)

Y

TimesTenアプリケーションでは、エラーのレポートにTimesTenエラー・コードではなくOracle Databaseエラー・コードが使用されます。エラー・コードを含むメッセージは、TimesTenエラー・メッセージまたはOracle Databaseエラー・メッセージです。

EXCEPTION_INITプラグマ

ユーザー定義の例外をTimesTenエラー番号に関連付けます。

Y

『Oracle Database PL/SQL言語リファレンス』のEXCEPTION_INITプラグマに関する説明を参照してください。

例外定義

実行時エラーまたは警告状態である例外を指定します。事前定義の例外とユーザー定義の例外があります。

Y

事前定義の条件は暗黙的に発生します。ユーザー定義の例外は、RAISE文によって明示的に発生します。発生した例外を処理するには、例外ハンドラと呼ばれる個別のルーチンを作成します。

第4章「エラーと例外の処理」を参照してください。

EXECUTE IMMEDIATE文

動的SQL文を作成して実行します。

Y

TimesTenは、これをOracle Databaseと同じようにサポートし、SQL DMLまたはDDL文を実行したり、PL/SQL無名ブロックを実行したり、PL/SQLストアド・プロシージャまたはファンクションをコールします。「PL/SQLでの動的SQL(EXECUTE IMMEDIATE文)」を参照してください。

TimesTenでは、EXECUTE IMMEDIATE文を使用してTimesTenの組込みプロシージャとTimesTen固有のSQL機能(SELECT FIRSTなど)を実行することもできます。

クライアント・アプリケーションからのPL/SQLの実行

(説明なし)

Y

TimesTenでは、ODBC、OCI、Pro*C/C++、TTClasses(一連のTimesTen C++クラス)、JDBC、およびODP.NETがサポートされています。

SQLからのPL/SQLの実行

(説明なし)

N

TimesTenでは、((静的または動的)な)SQL文からPL/SQLを実行できません。

EXIT文

ループを終了し、制御をループの最後に渡します。

Y

(特に)例6-2「ALTER SESSIONを使用した属性設定の変更」を参照してください。

式定義

オペランド(変数、定数、リテラル、演算子など)と演算子を組み合せた式を指定します。最も単純な式は1つの変数です。

Y

『Oracle Database PL/SQL言語リファレンス』の式に関する説明を参照してください。

FETCH文

複数行の問合せの結果セットからデータ行を取得します。

Y

(特に)例2-13「カーソルを使用した従業員情報の取得」を参照してください。

FORALL文

入力コレクションをSQLエンジンに送信する前にバルク・バインドします。

Y

「FORALL操作およびBULK COLLECT操作」を参照してください。

ファンクションの宣言と定義

PL/SQLブロックまたはパッケージで宣言および定義できる、単一値を戻すサブプログラムまたはストアド・プログラムを指定します。

Y

TimesTenでは、ストアド・ファンクションまたはプロシージャを無名ブロックで、またはCALL文を使用して実行できますが、その他のSQL文からは実行できません。「PL/SQLのプロシージャおよびファンクションを実行する方法」を参照してください。

TimesTen SQLでCREATE FUNCTION文を使用してストアド・ファンクションを作成します。「PL/SQLのプロシージャおよびファンクション」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCREATE FUNCTIONに関する説明も参照してください。

後述の「プロシージャの宣言と定義」も参照してください。

GOTO文

文ラベルまたはブロック・ラベルに無条件に分岐します。

Y

『Oracle Database PL/SQL言語リファレンス』のGOTO文に関する説明を参照してください。

IF文

関連付けられているブール式の値に応じて、一連の文を実行するかスキップします。

Y

「条件制御」を参照してください。

初期化パラメータ

Oracleデータベースでの初期化パラメータの設定。

n/a

TimesTen接続属性が相当します。上記のエントリを参照してください。

INLINEプラグマ

サブプログラムのコールをインライン化するかどうかを指定します。

Y

『Oracle Database PL/SQL言語リファレンス』のINLINEプラグマに関する説明を参照してください。

INSERT文

1つ以上のデータ行を表に挿入します。

Y

「INSERT文を使用する例」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のINSERTに関する説明も参照してください。

リテラル宣言

数値、文字列、またはブール値を指定します。

Y

例:

数値リテラル: 135

文字列リテラル: 'TimesTen'

LOCK TABLE文

指定されたロック・モードでデータベース表をロックします。

N

TimesTenでは、LOCK TABLE文はサポートされていません。

LOOP文

一連の文を複数回実行します。たとえば、FORループまたはWHILEループを実装する場合に使用できます。

Y

例2-8「WHILEループの使用」を参照してください。また、『Oracle Database PL/SQL言語リファレンス』の基本LOOP文に関する説明も参照してください。

MERGE文

1つ以上のソースから行を選択して、更新したりターゲット表に挿入できます。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のMERGEに関する説明を参照してください。

ネイティブ動的SQLの実行

EXECUTE IMMEDIATEを使用して、ほとんどの動的SQL文を処理します。

Y

上記のEXECUTE IMMEDIATEのエントリを参照してください。

非ASCII名

表、列、プロシージャ、ファンクションおよびその他のデータベース・オブジェクトの名前で、非ASCIIキャラクタ・セットを使用。

N

これはTimesTenではサポートされていません。

大文字以外の名前

表、列、プロシージャ、ファンクションおよびその他のデータベース・オブジェクトの名前で、引用符内に大文字以外の文字を使用。

N

これは、TimesTenでサポートされていません(例: lowercaseおよびMixedCase)。たとえば、次のように使用することはできません。

create or replace procedure "MixedCase" as
begin
...
end;

NULL文

これは、操作が行われない文です。アクションは実行されずに、制御は次の文に渡されます。

Y

『Oracle Database PL/SQL言語リファレンス』のNULL文に関する説明を参照してください。

オブジェクト型宣言

SQLで作成され、データベースに格納されるカスタム・オブジェクト型を指定します。

N

TimesTenは、データベース・レベルでオブジェクト型をサポートしていません。たとえば、CREATE TYPEはサポートされていません。

OPEN文

カーソルに関連付けられた問合せを実行します。問合せを処理するためのデータベース・リソースを割り当て、結果セットを識別します。

Y

例2-13「カーソルを使用した従業員情報の取得」を参照してください。

OPEN-FOR文

カーソル変数(REF CURSOR)に関連付けられたSELECT文を実行します。結果セット内の最初の行の前にカーソル変数を配置します。

Y

パッケージ宣言

関連するPL/SQLの型、項目およびサブプログラムを論理的にグループ化するデータベース・オブジェクトであるパッケージを指定します。

Y

SQL文CREATE PACKAGEおよびCREATE PACKAGE BODYを使用します。

「PL/SQLパッケージ」を参照してください。CREATE文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明も参照してください。

プロシージャの宣言と定義

PL/SQLブロックまたはパッケージで宣言および定義できる、特定のアクションを実行するサブプログラムまたはストアド・プログラムを指定します。

Y

TimesTenでは、ストアド・プロシージャまたはファンクションを無名ブロックで、またはCALL文を使用して実行できますが、その他のSQL文からは実行できません。「PL/SQLのプロシージャおよびファンクションを実行する方法」を参照してください。

TimesTen SQLでCREATE PROCEDURE文を使用してストアド・プロシージャを作成します。「PL/SQLのプロシージャおよびファンクション」を参照してください。また、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCREATE PROCEDUREに関する説明も参照してください。

前述の「ファンクションの宣言と定義」も参照してください。

RAISE文

PL/SQLブロックまたはサブプログラムの通常の実行を停止し、制御を例外ハンドラに渡します。

Y

「RAISE文の使用」を参照してください。

レコード定義

データベース行と同様に様々な型のデータ値が格納される複合変数であるレコードを定義します。

Y

「PL/SQLでのレコードの使用」を参照してください。

RESTRICT_REFERENCESプラグマ

パッケージ指定またはオブジェクト型指定内のサブプログラム(通常はファンクション)が、データベース表またはパッケージ変数の読取りや書込みを行わないことを示します。

N

TimesTenでは、このプラグマは無視されます。

結果のキャッシュ

これは、アプリケーションを実行するセッションの度に利用できる共有グローバル・エリア(SGA)でのPL/SQLファンクションの結果をキャッシュする機能です。

N

TimesTenは、これをサポートしていません。

RETURN文

サブプログラムの実行を即座に完了し、制御をコール元に戻します。実行は、サブプログラムのコール後の文から再開します。

Y

『Oracle Database PL/SQL言語リファレンス』のRETURN文に関する説明を参照してください。

RETURNING INTO句

この句が属している文によって戻された値を格納する変数を指定します。

Y

「RETURNING INTO句」および「RETURNING INTOを使用する例」を参照してください。

ROLLBACK文

現在のトランザクション中に加えられたデータベースの変更を元に戻します。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のROLLBACKに関する説明を参照してください。

重要: TimesTenでは、COMMIT文およびROLLBACK文によってすべてのカーソルがクローズされます。

%ROWTYPE属性

データベース表内の行を表すレコード型を指定します。

Y

例2-2「代入演算子を使用した変数への値の代入」を参照してください。

SAVEPOINT文

トランザクション処理の現在の位置に名前を付けてマークします。

N

TimesTenでは、SAVEPOINTはサポートされていません。

SELECT INTO文

表の1行から値を取得し(SELECT)、その値を変数またはレコードに格納します。BULK COLLECT句(上述)とともに使用すると、結果セット全体を1回で取得できます。

Y

例2-3「SELECT INTOを使用した変数への値の代入」を参照してください。また、『Oracle Database PL/SQL言語リファレンス』の問合せ結果セットの処理に関する説明も参照してください。

SERIALLY_REUSABLEプラグマ

サーバーへの1回のコールの間のみ、パッケージ状態が必要であることを示します。

N

TimesTenでは、SERIALLY_REUSABLEプラグマはサポートされていません。

SET TRANSACTION文

読取り専用トランザクションまたは読取り/書込みトランザクションを開始します。

N

TimesTenでは、SET TRANSACTION文はサポートされていません。

SOUNDEX SQL関数

charと同じ音声表現を持つ文字列を戻します。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス』のSOUNDEXに関する説明を参照してください。

SQLカーソル

SELECT文の結果セットの処理に使用される、明示的または暗黙的カーソル。

Y

「PL/SQLプログラムでのカーソルの使用」を参照してください。

SQLCODEファンクション

直前に発生した例外の番号コードを戻します。

Y

エラー条件が同じ場合、組込みファンクションのSQLCODEによって戻されるエラー・コードはTimesTenとOracle Databaseで同じですが、SQLERRMの戻り値は異なることがあります。

このことについては、「TimesTenエラー・メッセージおよびSQLコード」でも説明しています。

SQLERRMファンクション

error-number引数に関連付けられているエラー・メッセージを戻します。

Y

エラー条件が同じ場合、組込みファンクションのSQLERRMによって戻されるエラー・メッセージは、TimesTenとOracle Databaseで同じとはかぎりませんが、SQLCODEの戻り値は同じです。

このことについては、「TimesTenエラー・メッセージおよびSQLコード」でも説明しています。

提供パッケージ

これらは、データベースに提供されるPL/SQLパッケージです。

Y

TimesTenには、Oracle Database PL/SQLの提供パッケージのサブセットが用意されています。

第8章「TimesTenが提供するPL/SQLパッケージ」を参照してください。

システム表およびシステム・ビュー

これらは、管理目的でデータベースに提供される表およびビューです。

Y

TimesTenでは、Oracle Databaseシステム表およびシステム・ビューのサブセットがサポートされています。

『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明を参照してください。

SYSTIMESTAMP

データベースが常駐しているシステムの日付を、小数秒およびタイムゾーンを含めて戻します。

N

戻り型TIMESTAMP WITH TIME ZONEは現在サポートされていないため、TimesTenではサポートできません。

別の方法として、動的SQLを使用してSELECT tt_sysdate FROM dualを次のように使用できます。

declare
ts timestamp;
begin
execute immediate
'select tt_sysdate from dual'
into ts;
-- ts has millisecond resolution
end;

トリガー

これらは、データベースに格納されており、表に行を追加するなどの特定の条件が発生したときにアクティブ化されるプロシージャです。

N

TimesTenはトリガーをサポートしていませんが、XLAを使用して同様の機能を実現できます。『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAおよびTimesTenイベント管理に関する説明を参照してください。

ttPLSQLMemoryStats組込みプロシージャ

ライブラリ・キャッシュのパフォーマンスおよびアクティビティについての統計情報を戻します。

Y

『Oracle TimesTen In-Memory Databaseリファレンス』のttPLSQLMemoryStatsに関する説明を参照してください。

注意: Oracle Databaseでは、V$LIBRARYCACHEシステム・ビューによって同じ統計情報が提供されます。

%TYPE属性

フィールド、レコード、ネストした表、データベース列または変数のデータ型をハードコードするのではなく、宣言で使用できます。このことは、特にデータベース列を参照する変数、フィールドおよびパラメータを宣言する場合に役立ちます。

Y

「PL/SQLの変数および定数」を参照してください。

UPDATE文

表のすべての行または検索条件を満たす行の1つ以上の列の値を更新します。

Y

『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のUPDATEに関する説明を参照してください。

V$LIBRARYCACHEシステム・ビュー

Oracle Databaseでは、このシステム・ビューを使用すると、ライブラリ・キャッシュのパフォーマンスやアクティビティに関する統計情報が戻されます。

n/a

TimesTenでは、ttPLSQLMemoryStats組込みプロシージャを使用して同様の統計情報を取得します。上記のエントリを参照してください。

索引
A B C D E F G I L N O P Q R S T U V W

記号

%BULK_EXCEPTIONS属性, 2.7.3, 5.5.4

%BULK_ROWCOUNT属性, 5.5.1

%FOUND属性, 9

%ISOPEN属性, 9

%NOTFOUND属性, 5.4.1, 9

%ROWCOUNT属性, 5.4.2, 9

%ROWTYPE属性, 2.2

%TYPE属性, 2.2

A

アクセス制御

接続, 7.4.1

TimesTen組込みファンクションの場合, 7.4.3

権限の付与および取消し, 7.1.2

PL/SQLに対する影響, 7

プロシージャの権限, ファンクション, パッケージ, 7.1

SQL操作, 7.2

提供パッケージおよびシステム・ビュー, 7.4.2

ALTER SESSION, 6.2 無名ブロック, 2.1 配列バインド

連想配列バインド, 3.2.3.3

バルク・バインド, 2.7.3

連想配列(索引付き表)

バインディング, 3.2.3.3

例, 5.3.3

使用, 3.2.3.1

このドキュメントの対象読者, 1.3 AUTHID句, 5.8, 7.3

B

BINARY_INTEGER型, 3.2.2.1

バインド・パラメータ, 「パラメータ」を参照

バインド変数, 「パラメータ」を参照

ブロック, 2.1

組込みファンクション(TimesTen)

アクセス制御, 7.4.3

EXECUTE IMMEDIATEを使用したコール, 2.7.2, 5.6.4, 5.6.4

バルク・バインド

%BULK_EXCEPTIONS属性, 2.7.3, 5.5.4

カーソルを使用したBULK COLLECT INTO, 5.5.3

問合せを使用したBULK COLLECT INTO, 5.5.2

RETURNING INTOを使用したBULK COLLECT INTO, 5.7.2

例, 5.5

FORALL文, 2.7.3

概要, 2.7.3

SAVE EXCEPTIONS句, 2.7.3, 5.5.4

C

キャッシュ機能, PL/SQLからの使用, 2.7.5

CALL文, ファンクションおよびプロシージャのコール, 2.5

CASE文, 2.4.1

コレクション, 3.2.3.1

コンパイル

条件付きコンパイル, PLSQL_CCFLAGSの使用, 6.2

条件付き, UTL_IDENTおよびTT_DB_VERSIONの使用, 8

DBMS_UTILITY.COMPILE_SCHEMA, 8

DBMS_UTILITY.INVALIDATE, コンパイラのパラメータ設定の変更(オプション), 8

暗黙的, 7.1.1

相互参照情報のコンパイルのためのPLSCOPE_SETTINGS, 6.2

最適化レベルのためのPLSQL_OPTIMIZE_LEVEL, 6.2

無効なオブジェクトを再コンパイルするためのUTL_RECOMPパッケージ, 8

PL/SQLのコンポーネント, 概要, 1.2 複合データ型, 3.2.3 条件制御, 2.4.1 接続属性

初期接続属性, 6.2

一般接続属性, 6.2

PLSCOPE_SETTINGS属性, 6.2

PLSQL属性, 6.2

PLSQL_CCFLAGS属性, 6.2

PLSQL_CONN_MEM_LIMIT属性, 6.2

PLSQL_MEMORY_ADDRESS属性, 6.2

PLSQL_MEMORY_SIZE属性, 6.2

PLSQL_OPTIMIZE_LEVEL属性, 6.2

PLSQL_TIMEOUT属性, 6.2

定数と変数, 2.2 CONTINUE文, 2.4.3 変換, 「データ型の変換」を参照 カーソル

トランザクションの終了時にクローズ, 2.12

カーソル属性, 9

カーソルFORループ, 例, 5.4.3

例, 5.4

REF CURSOR, 3.2.4

PL/SQLでの使用, 2.8

D

データ型

連想配列(索引付き表), 3.2.3.1

カテゴリ, 3.2.1

コレクション, 3.2.3.1

複合データ型, 3.2.3

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

PL/SQLとSQLとの間の変換, 3.4.1

PL/SQL型間での変換, 3.3.1

TimesTenにおける相違点, 3.4

索引付き表(連想配列), 3.2.3.1

ネストした表, 3.2.3.1

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

サポート対象の概要, 3

PLS_INTEGERおよびBINARY_INTEGER, 3.2.2.1

PL/SQL型, 3.2

レコード, 3.2.3.2

REF CURSOR, 3.2.4

ROWID, 3.2.2.3

スカラー型, 3.2.2

SIMPLE_INTEGER, 3.2.2.2

データ型環境, 3.1

VARRAY, 3.2.3.1

DBMS_LOBパッケージ, 8 DBMS_LOCKパッケージ, 8 DBMS_OUTPUTパッケージ, 8 DBMS_PREPROCESSORパッケージ, 8 DBMS_RANDOMパッケージ, 8 DBMS_SQLパッケージ, 8 DBMS_UTILITYパッケージ, 8 DDL文, 2.7.2 定義者権限, 5.8, 7.3 デモ・アプリケーション, 1.4 TimesTenにおける相違点

データ型に関する考慮事項, 3.4

例外処理と動作, 4.4

SQLからのPL/SQLの実行, 1.2.2.2

PL/SQL言語要素および機能のサポート, 9

PL/SQLブロックでのSQL文, 1.2.2.1

トランザクション動作, 2.12

DML RETURNING, 2.7.4, 5.7 DML文, 2.7.1 重複したパラメータ, 2.6.1 動的SQL

DBMS_SQLパッケージ, 8

EXECUTE IMMEDIATEの例, 5.6

EXECUTE IMMEDIATEの使用方法, 2.7.2

E

PL/SQLの有効化

有効かどうかの確認, 6.1.2

エラー

エラー・メッセージ, Oracleと比較した相違点, 4.4.2

例外のタイプ, 4.1.2

RAISE文, 4.2.2.1

RAISE_APPLICATION_ERRORプロシージャ, 4.2.2.2

ttIsqlでのエラー表示, 4.3

SQLCODE組込みファンクション, 4.2.2.1, 4.4.2

SQLERRM組込みファンクション, 4.2.2.1, 4.4.2

トランザクションとロールバック動作, Oracleと比較した相違点, 4.4.1

事前定義例外のトラップ, 4.2.1

ユーザー定義例外のトラップ, 4.2.2

例外の理解, 4.1

警告(サポートされていない), 4.4.3

例

バインド変数, 5.3

バルク・バインド, 5.5

カーソルFORループ, 5.4.3

カーソル, 5.4

動的SQL, 5.6

FETCH文, 5.4.1

INSERT文, 5.2

システム・ビューの問合せ, 5.9

RETURNING INTO, 5.7

SELECT文, 5.1

例外, 「エラー」を参照 EXECUTE IMMEDIATE文

例, 5.6

使用方法, 2.7.2

F

機能, 概要, 1.1

FETCH文, 例, 5.4.1

初期接続属性, 6.2

FORループ, 2.4.2

FORALL文, 2.7.3, 5.5.1

機能

アクセス制御, 7.1

基本的な使用方法と例, 2.9

SQLファンクション, PL/SQLから, 2.3

サポートされている実行方法, 2.5

G

一般接続属性, 6.2

権限の付与, 7.1.2

I

IF-THEN-ELSE文, 2.4.1

IN OUTパラメータ, 2.6.2

INパラメータ, 2.6.2

索引付き表(連想配列)

バインディング, 3.2.3.3

使用, 3.2.3.1

INSERT文, 例, 5.2 PL/SQLのインストール(ttmodinstall), 6.1.1 INTEGER型

BINARY_INTEGER, 3.2.2.1

PLS_INTEGER, 3.2.2.1

SIMPLE_INTEGER, 3.2.2.2

実行者権限, 5.8, 7.3 反復制御, 2.4.2

L

言語要素および機能, サポート, 9

LOB

DBMS_LOBパッケージ, 8

概要, 2.7.6

PL/SQLでの使用, 2.7.6

N

ネストした表, 3.2.3.1

NLS_DATE_FORMAT, 3.4.2

NLS_TIMESTAMP_FORMAT, 3.4.2

非ASCII名(サポートされていない), 9

大文字以外の名前(サポートされていない), 9

O

PL/SQLの操作, 概要, 1.2

OUTパラメータ, 2.6.2

概要

コンポーネントと操作, 1.2

機能, 1.1

P

パッケージ

アクセス制御, 7.1

概念, 2.10.1

作成と使用, 2.10.2

TimesTenが提供するパッケージ, 8

パラメータ

バインド, 2.6.1

重複したパラメータ, 2.6.1

バインド変数を使用する例, 5.3

IN, 2.6.2

IN OUT, 2.6.2

OUT, 2.6.2

PLS_INTEGER型, 3.2.2.1 PLSCOPE_SETTINGS接続属性, 6.2 PLSQL接続属性, 6.2 PLSQL_CCFLAGS接続属性, 6.2 PLSQL_CONN_MEM_LIMIT接続属性, 6.2 PLSQL_MEMORY_ADDRESS接続属性, 6.2 PLSQL_MEMORY_SIZE接続属性, 6.2 PLSQL_OPTIMIZE_LEVEL接続属性, 6.2 PLSQL_TIMEOUT接続属性, 6.2 事前定義例外

TimesTenでサポートされていない, 4.4.4

TimesTenでサポートされている, 4.2.1

権限

プロシージャ, ファンクション, パッケージ, 7.1

付与と取消し, 7.1.2

権限, 「アクセス制御」も参照 プロシージャ

アクセス制御, 7.1

基本的な使用方法と例, 2.9

サポートされている実行方法, 2.5

プログラミング機能

条件制御, 2.4.1

CONTINUE, 2.4.3

反復制御, 2.4.2

パブリック・オブジェクト, 2.10.2

Q

問合せ, 2.7.1

Quick Startデモ・アプリケーション, 1.4

R

RAISE文(例外), 4.2.2.1

RAISE_APPLICATION_ERRORプロシージャ, 4.2.2.2

レコード, 3.2.3.2

REF CURSOR, 3.2.4

レプリケーション, PL/SQL DDL, サポートされていない, 2.9.1

RETURNING INTO句, 2.7.4, 5.7

権限の取消し, 7.1.2

ROWID型, 3.2.2.3

S

サンプル, 「例」を参照

SAVE EXCEPTIONS句, 2.7.3, 5.5.4

セキュリティ, 「アクセス制御」も参照

SELECT文, 2.7.1

SELECT文, 例, 5.1

エラー表示, ttIsql, 4.3

SIMPLE_INTEGER型, 3.2.2.2

スリープ機能, 8

SQL

DDL文, 2.7.2

動的SQL, 2.7.2

静的SQL, 2.7.1

SQLファンクション, PL/SQLから, 2.3 SQLCODE組込みファンクション, 4.2.2.1, 4.4.2 SQLERRM組込みファンクション, 4.2.2.1, 4.4.2 スタンドアロン・サブプログラム(プロシージャおよびファンクション), 2.9 静的SQL, 2.7.1 ストアド・ファンクション

アクセス制御, 7.1

基本的な使用方法と例, 2.9

サポートされている実行方法, 2.5

ストアド・プロシージャ

アクセス制御, 7.1

基本的な使用方法と例, 2.9

サポートされている実行方法, 2.5

サブプログラム

アクセス制御, 7.1

基本的な使用方法と例, 2.9

サポートされている実行方法, 2.5

提供パッケージおよびシステム・ビュー

アクセス制御, 7.4.2

システム・ビュー, 問合せ, 5.9

シノニム

パッケージ, 2.10.3

プロシージャおよびファンクション, 2.9.2

T

TimesTen Application-Tier Database Cache (TimesTen Cache), PL/SQLからの使用, 2.7.5

TimesTen組込みファンクション

アクセス制御, 7.4.3

EXECUTE IMMEDIATEを使用したコール, 2.7.2, 5.6.4, 5.6.4

TO_CHARファンクション, 3.4.2 TO_DATEファンクション, 3.4.2 トランザクションとロールバック動作, Oracleと比較した相違点, 4.4.1 トランザクション動作, 2.12 例外のトラップ

事前定義例外, 4.2.1

ユーザー定義例外, 4.2.2

TT_DB_VERSIONパッケージ, 8 TT_DECIMAL型(サポートされていない), 3.4.1 TT_STATSパッケージ, 8 ttIsql, エラー表示, 4.3 ttmodinstallユーティリティ(PL/SQLのインストール), 6.1.1 ttPLSQLMemoryStats組込みプロシージャ, 6.2, 7.4.3, 9 ttSrcScanユーティリティ(サポートされていない機能の確認), 6.3 データ型の変換

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

PL/SQLとSQLとの間, 3.4.1

PL/SQL型間, 3.3.1

TimesTenにおける相違点, 3.4

U

サポートされていない機能, ttSrcScanによる確認, 6.3

UTL_FILEパッケージ, 8

UTL_IDENTパッケージ, 8

UTL_RAWパッケージ, 8

UTL_RECOMPパッケージ, 8

V

変数と定数, 2.2

VARRAY, 3.2.3.1

W

警告(サポートされていない), 4.4.3

WHILE ループ, 2.4.2

PL/SQLのソース・コードのラップ, 2.11

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。