インライン化された SQL 関数およびコンパイル済み SQL 関数

SQL 関数のインプリメンテーションのタイプには、インライン化された SQL 関数とコンパイル済み SQL 関数の 2 つがあります。

インライン SQL 関数は、多くの場合、最高のパフォーマンスを実現します。 しかし、コンパイル済み SQL 関数ではサポートされる一部の SQL PL 言語フィーチャーおよびデータ・タイプがサポートされていません。 それらのフィーチャーには、次のものが含まれます。
  • CASE ステートメント
  • REPEAT ステートメント
  • カーソルの処理
  • 動的 SQL
  • 条件ハンドラー

SQL PL モジュールの中で宣言されている SQL 関数は、常にコンパイル済みです。

PL/SQL 関数は、常にコンパイル済みです。 インライン関数は PL/SQL コードの中で参照できますが、PL/SQL を使用して宣言することはできません。 それらは SQL PL を使用して宣言する必要があります。

他のすべての場合について、SQL 関数がインラインかコンパイル済みかは、CREATE FUNCTION ステートメントの構文によって決まります。
  • 本体がアトミックの SQL PL 関数は、インライン関数です。 SQL 関数がアトミックであるのは、その内容が単一の RETURN ステートメントである場合、または BEGIN ATOMIC のキーワードで始まる 1 個のコンパウンド・ステートメントで構成される場合です。
  • 非アトミック SQL PL 関数は、コンパイル済み関数です。 SQL PL 関数が非アトミックであるのは、その内容がキーワード BEGIN または BEGIN NOT ATOMIC で始まる 1 個のコンパウンド・ステートメントである場合です。

  • インライン関数
    create function F1 (N integer)
    returns integer
    deterministic
    no external action
    contains sql
    return N * 10
    @
    
    create function F2 (N integer)
    returns integer
    deterministic
    no external action
    contains sql
    begin atomic
      if N < 5 then
        return N * 10
      else
        return N * 20
      end if;
    end
    @
  • コンパイル済み関数
    create function F3 (N integer)
    returns integer
    deterministic
    no external action
    contains sql
    begin
      if N < 5 then
        return N * 10
      else
        return N * 20
      end if;
    end
    @
    
    create function F4 (N integer)
    returns integer
    deterministic
    no external action
    contains sql
    begin not atomic
      if N < 5 then
        return N * 10
      else
        return N * 20
      end if;
    end 
    @