广告
返回顶部
首页 > 资讯 > 数据库 >2011-11-24 RESULT_CACHE函数
  • 664
分享到

2011-11-24 RESULT_CACHE函数

2024-04-02 19:04:59 664人浏览 薄情痞子
摘要

Http://www.itpub.net/thread-1499223-19-1.html 185楼 我创建了如下的表并填入数据: CREATE TABLE plch_tab (

Http://www.itpub.net/thread-1499223-19-1.html

185楼

我创建了如下的表并填入数据:

CREATE TABLE plch_tab
(
   this_is_it       VARCHAR2 (20)
, another_column   NUMBER (2)
)
/
BEGIN
   INSERT INTO plch_tab (this_is_it)
        VALUES ('PL/sql Challenge');
   COMMIT;
END;
/

然后我编译了如下的函数:

CREATE OR REPLACE FUNCTioN plch_foo (p_in_value IN NUMBER)
   RETURN VARCHAR2
   RESULT_CACHE
IS
   lvretval   plch_tab.this_is_it%TYPE;
BEGIN
   SELECT this_is_it INTO lvretval FROM plch_tab;
   DBMS_OUTPUT.put_line (lvretval);
   RETURN lvretval;
END;
/

哪些代码块执行之后会显示 "PL/SQL Challenge" 仅仅一次?

(A)

DECLARE
   lvdummy   plch_tab.this_is_it%TYPE;
BEGIN
   lvdummy := plch_foo (NULL);
   lvdummy := plch_foo (NULL);
END;
/
SQL> DECLARE
  2     lvdummy   plch_tab.this_is_it%TYPE;
  3  BEGIN
  4     lvdummy := plch_foo (NULL);
  5     lvdummy := plch_foo (NULL);
  6  END;
  7  /
PL/SQL Challenge
PL/SQL procedure successfully completed
SQL>

(B)

DECLARE
  lvDummy  plch_tab.this_is_it%TYPE;
BEGIN
  lvDummy := plch_foo(1);
  lvDummy := plch_foo(1);
END;
/
SQL> DECLARE
  2    lvDummy  plch_tab.this_is_it%TYPE;
  3  BEGIN
  4    lvDummy := plch_foo(1);
  5    lvDummy := plch_foo(1);
  6  END;
  7  /
PL/SQL Challenge
PL/SQL procedure successfully completed
SQL>

(C)

DECLARE
   lvdummy   plch_tab.this_is_it%TYPE;
BEGIN
   lvdummy := plch_foo (2);
   UPDATE plch_tab SET another_column = 1;
   COMMIT;
   lvdummy := plch_foo (2);
END;
/
SQL> DECLARE
  2     lvdummy   plch_tab.this_is_it%TYPE;
  3  BEGIN
  4     lvdummy := plch_foo (2);
  5  
  6     UPDATE plch_tab SET another_column = 1;
  7     COMMIT;
  8  
  9     lvdummy := plch_foo (2);
 10  END;
 11  /
PL/SQL Challenge
PL/SQL Challenge
PL/SQL procedure successfully completed
SQL>

(D)

DECLARE
   lvdummy   plch_tab.this_is_it%TYPE;
BEGIN
   lvdummy := plch_foo (3);
   UPDATE plch_tab SET another_column = 1;
   lvdummy := plch_foo (3);
END;
/
SQL> DECLARE
  2     lvdummy   plch_tab.this_is_it%TYPE;
  3  BEGIN
  4     lvdummy := plch_foo (3);
  5  
  6     UPDATE plch_tab SET another_column = 1;
  7  
  8     lvdummy := plch_foo (3);
  9  END;
 10  /
PL/SQL Challenge
PL/SQL Challenge
PL/SQL procedure successfully completed
SQL>

(E)

DECLARE
   lvdummy   plch_tab.this_is_it%TYPE;
BEGIN
   lvdummy := plch_foo (4);
   UPDATE plch_tab
      SET another_column = 1
    WHERE another_column = 2;
   lvdummy := plch_foo (4);
END;
/
SQL> DECLARE
  2     lvdummy   plch_tab.this_is_it%TYPE;
  3  BEGIN
  4     lvdummy := plch_foo (4);
  5  
  6     UPDATE plch_tab
  7        SET another_column = 1
  8      WHERE another_column = 2;
  9  
 10     lvdummy := plch_foo (4);
 11  END;
 12  /
PL/SQL Challenge
PL/SQL procedure successfully completed
SQL>

答案说明在191楼

2011-11-24 答案ABE.
PL/SQL 函数的结果缓存机制提供了一种把PL/SQL 函数的结果缓存在SGA里面的办法,这个结果对运行应用程序的所有会话都是可用的。缓存机制简单而且有效,你不必再费心设计开发自己的缓存及其管理机制。
为了打开函数的结果缓存,你只需在函数头加上RESULT_CACHE子句(如果在PACKAGE里面使用,则包头和包体中的函数声明都必须有这个子句)
当一个结果缓存函数被调用时,系统检查缓存。如果以前调用的结果存在于缓存中,参数也相同,系统直接返回结果二不是再次执行函数体。如果缓存中找不到该结果,系统执行函数体,并在把控制权交还给调用者之前,把结果加入到缓存(针对于这组参数)。
函数结果缓存通常保存在函数体中查询到的一个或多个表的数据。oracle需要确保这个数据的拷贝是干净的(即未被修改过)。
ORACLE通过两个机制来确保数据干净:
1. 每当表发生了修改并被提交,所有依赖于这个表的结果缓存将被清空。随后对函数的调用会导致数据再次进入缓存。
2. 一旦你在会话中修改了表,那么所有依赖于这个表的缓存将被忽略。即:缓存结果依赖于被改过的表的函数体将会被执行,一直到你提交或回滚了这些修改。
A: 两次调用参数都为NULL, ORACLE认为没有变化,直接取缓存结果而不是重新调用。
B: 同上,参数没有发生变化。
C: 参数没有发生变化,但是代码修改了 plch_foo 表,函数的缓存对当前会话不再有效;COMMIT发生后,CACHE对所有会话都不再有效。因此再次调用函数时,函数被再次执行了
D: 同上,虽然没有COMMIT, 但是该缓存对当前会话已经不可用了,所以函数会被再次执行。
   假如这个选项后面还有更多的调用:lvdummy := plch_foo (3);
   则函数体每次都会被重新执行。
E: UPDATE没有修改任何数据,因此缓存仍然有效。
您可能感兴趣的文档:

--结束END--

本文标题: 2011-11-24 RESULT_CACHE函数

本文链接: https://www.lsjlt.com/news/49232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 2011-11-24 RESULT_CACHE函数
    http://www.itpub.net/thread-1499223-19-1.html 185楼 我创建了如下的表并填入数据: CREATE TABLE plch_tab (...
    99+
    2022-10-18
  • 2011-11-4 LEAST函数
    http://www.itpub.net/thread-1499223-12-1.html 113楼 下面的选项都实现了这个过程: CREATE OR REPLACE&n...
    99+
    2022-10-18
  • 2011-11-2 游标和管道函数
    http://www.itpub.net/thread-1499223-11-1.html 105楼 我创建了这张表并填入数据: CREATE TABLE plch_parts ...
    99+
    2022-10-18
  • python基础学习11----函数
    一.函数的定义 def 函数名(参数列表): 函数体 return语句 return语句不写或后边不加任何对象即为return None 二.函数的参数 无参数 def func1(): print("没有...
    99+
    2023-01-30
    函数 基础 python
  • 【MongoDB学习笔记24】MongoDB的explain和hint函数
    一、explain函数explain函数可以提供大量查询相关的信息,如果是慢查询,它最重要的诊断工具。例如:在有索引的字段上查询:> db.post.find({"loc.city":"ny...
    99+
    2022-10-18
  • C++11中的default函数使用
    对于C++ 11标准中支持的default函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量。 C++的类有四类特殊成员函数...
    99+
    2022-11-12
  • Python 函数参数11个案例分享
    目录1. 参数分类2. 十一个案例3. 传参的坑大家好,今天给大家分享一下明哥整理的一篇 Python 参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上 80%...
    99+
    2023-02-27
    Python 函数参数 Python 函数参数案例
  • Oracle系列:(11)通用函数和条件判断函数
    使用NVL(a,b)通用函数,统计员工年收入,NVL()作用于任何类型,即(number/varchar2/date)通用函数:参数类型可以是number或varchar2或date类型select...
    99+
    2022-10-18
  • c++11中std::move函数的使用
    C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引入了多余的构造、析构及其内部资源的申请释放函数调用,导致程序运行时性能受损,...
    99+
    2022-11-13
  • C++11中如何使用forward函数
    本篇文章给大家分享的是有关C++11中如何使用forward函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。传值函数模板假设有一组函数,根据两个输入值进行工作,例如下面的ad...
    99+
    2023-06-19
  • MySQL基础教程11 —— 函数之Cast函数和操作符
    BINARY BINARY操作符将后面的字符串抛给一个二进制字符串。这是一种简单的方式来促使逐字节而不是逐字符的进行列比较。这使得比较区分大小写,即使该列不被定义为 BINARY或 BLOB。BINARY也会产生...
    99+
    2022-05-27
    binary CAST MySQL
  • C++11移动构造函数的使用
    目录一、引言二、左值和右值三、深拷贝构造函数四、右值引用五、移动构造函数六、std::move()七、参考资料一、引言 移动构造函数是什么?先举个例子,你有一本书,你不想看,但我很想...
    99+
    2022-11-13
  • 一文详解C++11中的lambda函数
    目录1.lambda函数语法1.1 捕获列表1.2 mutable修饰符1.3 匿名lambda函数2.lambda与STL我可以明确告诉你:lambda函数是C++11中最重要的,...
    99+
    2023-02-07
    C++11 lambda函数使用 C++11 lambda函数 C++11 lambda
  • C++11的函数对象怎么使用
    这篇文章主要介绍“C++11的函数对象怎么使用”,在日常操作中,相信很多人在C++11的函数对象怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11的函数对象怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-19
  • C++11 成员函数作为回调函数的使用方式
    目录C++11成员函数作为回调函数使用示例1示例2类成员函数作为回调函数的方法及注意点类成员函数当回调函数的方法为什么回调函数必须为静态函数?类的静态成员函数如何访问非静态成员?C+...
    99+
    2022-11-13
    C++11 成员函数 C++11 回调函数 使用回调函数
  • C++11写一个只触发一次槽函数的Qtconnect函数
    目录引言ConnectionUtil.h:ConnectionUtil.cpp:引言 在之前的Qt项目中,我发现经常会用到槽函数只需要执行一次的情况。也就是说,槽函数执行一次后,就需...
    99+
    2022-11-13
  • 11个案例讲透Python函数参数小结
    目录1. 参数分类2. 十一个案例3. 传参的坑大家好,今天给大家分享一下明哥整理的一篇 Python 参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上 80%...
    99+
    2023-02-27
    Python函数参数 Python参数函数
  • C++11中内联函数(inline)用法实例
    目录inline 是什么?引入inline的目的是什么?内联函数的特点内联函数的写法隐式内联和显式内联inline 函数的编译器处理内联函数优缺点虚函数可以是内联函数吗?虚函数内联条...
    99+
    2022-11-13
    c++内联函数定义 c++11内联函数 inline怎么用
  • C++11的cbegin和cend函数怎么使用
    本篇内容介绍了“C++11的cbegin和cend函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!const迭代器先看下面的程序:...
    99+
    2023-06-19
  • C++11怎么移动构造函数通常
    这篇文章主要讲解了“C++11怎么移动构造函数通常”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11怎么移动构造函数通常”吧!不会抛出异常的移动构造函数拷贝构造函数通常伴随着内存分配操...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作