首页 文章

如何在oracle 10g中缓存函数的查询结果?

提问于
浏览
3

我正在使用oracle 10g . 我在包中有以下函数,它将在包中多次调用 . 相反,我想维护“功能结果缓存”(11g可用),我将在执行查询之前首先在缓存中查找 . 这可能与10克或我必须选择一些其他选项来实现它?

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;

2 回答

  • 1

    将函数放在一个包中,并在包中添加一个PLSQL表,由VARCHAR2索引 .

    首次执行时,使用“tab_name ||”检查表 . || col_name“组合为索引(哈希) .

    如果为空,请运行查询并使用tab_name ||将dat写入PLSQL表'' || col_name作为索引 .

    当运行在每个会话中调用此函数的查询时,第一个调用将在构建表时更长,后续调用将更快 .

    使用这种方法需要注意的是内存管理(大数据,会话数),陈旧数据 - 不适用于易失性数据表 . 你也应该考虑包中的“免费”功能来清除缓存 .

  • 0

    您可以使用“DETERMINISTIC”子句将值存储在缓存中 . 请参阅下面的示例

    CREATE OR REPLACE FUNCTION text_length(a CLOB) 
       RETURN NUMBER DETERMINISTIC IS
    BEGIN 
      RETURN DBMS_LOB.GETLENGTH(a);
    END;
    

相关问题