TimesTenのPL/SQLコンポーネントおよび操作
この項では、アプリケーションとPL/SQLの対話や、PL/SQLコンポーネントとTimesTenの他のコンポーネントの対話の説明など、TimesTenにおけるPL/SQL操作の概要について説明します。
この章の内容は次のとおりです。
アプリケーションとTimesTenおよびPL/SQLのやり取り
PL/SQLコンポーネントは、PL/SQL操作の間に、PL/SQLコンポーネント同士で、および他のTimesTenコンポーネントとやり取りします。
アプリケーションは、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のイベント管理を参照してください。)