3

私はオラクル10gを使用しています。パッケージに次の関数があり、パッケージ内で何度も呼び出されます。代わりに、「関数結果キャッシュ」(11g で利用可能) を維持したいので、クエリを実行する前にまずキャッシュを検索します。これは10gで可能ですか、それとも他のオプションを選択する必要がありますか?

function f_get_col_data_type(tab_name varchar,
                              col_name varchar
                              ) return varchar is
    v_col_data_type user_tab_columns.data_type%type;
  begin
    select data_type
      into v_col_data_type
      from user_tab_columns
     where upper(table_name) = upper(tab_name)
       and upper(column_name) = upper(col_name);

    return v_col_data_type;
end f_get_col_data_type;
4

2 に答える 2

1

関数をパッケージに入れ、パッケージに PLSQL テーブルを追加し、VARCHAR2 でインデックスを付けます。

初回実行時は、「tab_name || '.'」でテーブルを確認してください。|| col_name" をインデックス (ハッシュ) として結合します。

空の場合は、クエリを実行し、tab_name || を使用してデータを PLSQL テーブルに書き込みます。「.」|| col_name をインデックスとして使用します。

各セッション内でこの関数を呼び出すクエリが実行されると、最初の呼び出しはテーブルを構築するため長くなり、その後の呼び出しははるかに速くなります。

このアプローチで注意すべき点は、メモリ管理 (大量のデータ、セッション数)、古いデータです。揮発性のデータ テーブルには適していません。キャッシュをクリアするには、パッケージ内の「無料」機能も検討する必要があります。

于 2014-07-22T17:01:11.763 に答える