3

我正在使用oracle 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" 组合为索引(哈希)。

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

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

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

于 2014-07-22T17:01:11.763 回答
0

您可以使用“DETERMINISTIC”子句将值存储在缓存中。请看下面的例子

    CREATE OR REPLACE FUNCTION text_length(a CLOB) 
   RETURN NUMBER DETERMINISTIC IS
BEGIN 
  RETURN DBMS_LOB.GETLENGTH(a);
END;
于 2013-09-15T18:52:47.780 回答