TimesTenのPL/SQLコンポーネントおよび操作

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

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

アプリケーションとTimesTenおよびPL/SQLのやり取り

PL/SQLコンポーネントは、PL/SQL操作の間に、PL/SQLコンポーネント同士で、および他のTimesTenコンポーネントとやり取りします。

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

図1-1の説明が続きます
「図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

この項では、PL/SQLの処理、およびTimesTenと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文

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はトリガーをサポートしていません。(トリガーのかわりとなる、TimesTenでのXLAによる高パフォーマンスで非同期的な方法については、『Oracle TimesTen In-Memory Database C開発者ガイド』XLAおよびTimesTenのイベント管理を参照してください。)