Sql 如何在oracle 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

我正在使用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;
您可以使用“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数据库选择不重新执行该函数,则不会捕获这样做的结果。”