TimesTenのPL/SQLとキャッシュ

PL/SQLプログラムでSQL文を実行すると、そのSQL文は、他のプログラミング言語で記述したアプリケーションから実行された場合と同じ方法で、TimesTenで処理されます。TimesTen SQLのすべての標準動作が適用されます。キャッシュ環境において、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パススルー機能を使用してTimesTenからOracle Databaseに自動的にSQL文をルーティングする機能があります。(パススルー機能の詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』パススルー・レベルの設定を参照してください。)

    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ブロックをルーティングすることはできません。たとえば、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です。

『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』定義者権限および実行者権限(AUTHID句)を参照してください。