我正在使用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;
答案 0 :(得分:1)
将函数放在一个包中,并在包中添加一个PLSQL表,由VARCHAR2索引。
首次执行时,请使用“tab_name ||”检查表格。 || col_name“组合为索引(哈希)。
如果为空,请运行查询并使用tab_name ||将dat写入PLSQL表'' || col_name作为索引。
当在每个会话中运行调用此函数的查询时,第一次调用将在构建表时更长,后续调用会更快。
使用这种方法需要注意的是内存管理(大数据,会话数),过时数据 - 不适合易失性数据表。你也应该考虑包中的“免费”功能来清除缓存。
答案 1 :(得分:0)
您可以使用“DETERMINISTIC”子句将值存储在缓存中。请参阅下面的示例
CREATE OR REPLACE FUNCTION text_length(a CLOB)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN DBMS_LOB.GETLENGTH(a);
END;