Sql 如何在oracle 10g中缓存函数的查询结果?
我正在使用oracle 10g。 我在包中有以下函数,它将在包中多次调用。相反,我希望维护“函数结果缓存”(11g提供),在执行查询之前,我将首先在缓存中查找。10g是否可以实现这一点,或者我必须选择其他选项来实现这一点Sql 如何在oracle 10g中缓存函数的查询结果?,sql,oracle,caching,plsql,oracle10g,Sql,Oracle,Caching,Plsql,Oracle10g,我正在使用oracle 10g。 我在包中有以下函数,它将在包中多次调用。相反,我希望维护“函数结果缓存”(11g提供),在执行查询之前,我将首先在缓存中查找。10g是否可以实现这一点,或者我必须选择其他选项来实现这一点 function f_get_col_data_type(tab_name varchar, col_name varchar ) return varcha
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;
您可以使用“DETERMINISTIC”子句将值存储在缓存中。请参见下面的示例
CREATE OR REPLACE FUNCTION text_length(a CLOB)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN DBMS_LOB.GETLENGTH(a);
END;
将函数放入包中,并在包中添加一个PLSQL表,索引为VARCHAR2 在第一次执行时,使用“tab_name | |'.| | col_name”组合作为索引(哈希)检查表 如果为空,则运行查询并将dat写入PLSQL表,使用tab|name | |'.| col|u name作为索引 当在每个会话中运行调用此函数的查询时,第一个调用会随着表的构建而变长,随后的调用会更快
这种方法需要注意的是内存管理(大数据、会话数)、陈旧数据——不适合于易失性数据表。你也应该在包中考虑一个“免费”功能来清除缓存。 10G,你需要自己做缓存(或者仅仅依靠Oracle缓存缓存中的“全局”缓存)谢谢你的回复。我不想在这里维护全局缓存。那么,我如何使用其他技术呢?我的意思是,我自己还有其他可能的方法吗?在@hemanth用例的上下文中,这个答案是不正确的!他试图缓存受数据库查询影响的函数结果。关于DETERMINISTIC关键字:“不要指定此子句来定义以任何可能影响函数返回结果的方式[…]访问数据库的函数。如果Oracle数据库选择不重新执行该函数,则不会捕获这样做的结果。”