♣ 题目部分 在Oracle中,简述Oracle中的游标。 ♣ 答案部分 在介绍游标之前先介绍一下Oracle数据库中库缓存(Library Cache)的作用及其组成结构。...当同样的SQL语句和PL/SQL语句再次被执行的时候就可以直接利用已经缓存在库缓存中的那些相关对象而无须再次从头开始解析,这样就提高了这些SQL语句和PL/SQL语句在重复执行时的执行效率。...库缓存(Library Cache)在SGA中的位置如下图所示: ?...当Oracle要执行目标SQL“select * from lhr.emp”时,首先会对该SQL的SQL文本进行哈希运算,然后根据得到的哈希值找到相关的Hash Bucket,在Hash Bucket中遍历对应的库缓存对象句柄链表...② 对每一个库缓存对象而言,都或多或少需要往库缓存中存储一些该库缓存对象所特有的动态运行时(runtime)数据,比如SQL语句所对应的库缓存对象就需要在库缓存中缓存该SQL语句所对应的编译好的二进制格式的执行计划
♣ 题目部分 在Oracle中,游标有哪几类?...Oracle在解析目标SQL时去库缓存中查找匹配Shared Cursor的过程如下图所示: ?...从上图可以看出,Oracle在解析目标SQL时去库缓存中查找匹配共享游标(Shared Cursor)的过程包含如下几个步骤: (1)根据目标SQL的SQL文本的哈希值去库缓存中查找匹配的Hash Bucket...(3)在步骤(2)中,如果找到了匹配的父游标,那么Oracle接下来就会遍历从属于该父游标的所有子游标以查找匹配的子游标。...在匹配的父游标中查找匹配的子游标时,如果找到了匹配的子游标,那么Oracle就会把存储于该子游标中的解析树和执行计划直接拿过来重用,而不用再从头开始解析。
♣ 题目部分 在Oracle中,什么是会话游标?会话游标和共享游标的区别有哪些?会话游标分为哪几类?...由于在缓存会话游标的哈希表的对应Hash Bucket中,Oracle会存储目标SQL对应的父游标的库缓存对象句柄地址,所以,Oracle可以通过会话游标找到对应的父游标,进而就可以找到对应子游标中目标...隐式游标、显式游标SQL%ROWCOUNT数值型表示最近的一条SQL语句成功执行后受其影响而改变的记录的数量,后续执行的SQL会覆盖SQL%ROWCOUNT的值。...在Oracle 10g中默认为20(注意:在官方文档中记录的该值默认为0是有误的),11g中默认为50。...① 在Oracle 11gR2中,一个会话游标能够被缓存在PGA中的必要条件是该会话游标所对应的SQL解析和执行的次数要超过3次。
♣ 题目部分 在Oracle中,什么是常规游标共享?...下面分别来介绍常规游标共享和自适应游标共享这两个方面。 1、 常规游标共享 常规游标共享是在Oracle 8i中引入的。...当开启了常规游标共享后,Oracle在实际解析目标SQL之前,会先用系统产生的绑定变量来替换目标SQL的SQL文本中WHERE条件或者INSERT中的VALUES子句中的具体输入值,这样替换后实际执行的...在Oracle 10g及其后续的版本中,Oracle会自动收集直方图统计信息,这意味着在Oracle 10g及其后续的版本中出现不安全的谓词条件的概率要大大高于Oracle 10g之前的版本,所以在Oracle...在Oracle 11g里也不要将CURSOR_SHARING的值设成SIMILAR,因为在Oracle 11g里自适应游标共享已经被默认启用了,在自适应游标共享被启用的情形下,Oracle并不推荐将CURSOR_SHARING
1,大家都知道数据库中的事物可以回滚,而游标在其中起着非常重要的作用,由于对数据库的操作我们会暂时放在游标中,只要不提交,我们就可以根据游标中内容进行回滚,在一定意义有利于数据库的安全。 ...2,另外,在Oracle中PL/SQL只能返回单行数据,而游标弥补了这个不足。相当于ADO.NET中的Data table吧。...例如SQL%rowcount..../SQL语句即可完成的,这样我们在这里就必须用到循环结构了,在Oracle数据库中我们可以使用while…… loop……end loop , for…… loop……end loop,loop……end...在这里需要提出的是,for循环结构在Oracle中被简化了,我们只需要声明和使用即可。
--=============================== -- PL/SQL -->隐式游标(SQL%FOUND) --=============================== 在PL.../SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括 声明游标,打开游标,从游标提取数据,关闭游标。...其过程由oracle控制,完全自动化。隐式游标 的名称是SQL,不能对SQL游标显式地执行OPEN,FETCH,CLOSE语句。...当执行select into ,insert update,delete时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭 游标,因为是隐式游标,故SQL%ISOPEN总是false...SQL%ROWCOUNT 在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为,如果没有 成功,SQL%
REF游标和静态游标的区别 1)静态游标不能返回到客户端。ref游标能够被返回到客户端,是从Oracle的存储过程返回结果集的方式。 2)不能在包说明或包体中的过程或函数之外定义ref游标。...在PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。...%FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。...%NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。 %ROWCOUNT:当前时刻已经从游标中获取的记录数量。 %ISOPEN:是否打开。...在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。
在Oracle数据库里,任意一个目标sql一定会同时对应两个shared cursor。...在解析和执行目标sql时,始终会先去当前session的pga中寻找是否有匹配的缓存session cursor 2 在当前session的pga中找不到匹配的缓存,Oracle就去缓存中寻找是否存在匹配的...0,执行前为null,没有返回或没有改变任何记录,其值为TRUE,否则为FALSE SQL%ISOPEN:表示隐式游标是否处于open状态,对于隐式游标,其值永远是FALSE SQL%ROWCOUNT:...表示一条sql语句成功执行后受其影响而改变的记录的数量,代表最近一次执行的sql的sql%rowcount,没有任何记录的值0 2 显式游标 在plsql中,显式的打开,关闭 Cursorname%found...里的共享游标 Shared cursor之间的共享,就是重用存储在child cursor中的解析树和执行计划,避免不用从头开始硬解析 常用游标共享,参数cursor_sharing select *
本节对Oracle中的游标进行详细讲解。...本节所举实例来源Oracle中scott用户下的emp表dept表: 一、游标: 1、概念: 游标的本质是一个结果集resultset,主要用来临时存储从数据库中提取出来的数据块。...'); DBMS_OUTPUT.PUT_LINE('读取了'||emp_cursor%ROWCOUNT||'行'); ELSE DBMS_OUTPUT.PUT_LINE('游标没有打开...2、隐式游标:由系统定义并为它创建工作区域,并且隐式的定义打开提取关闭,隐式游标的游标名就是'SQL',属性和显示游标相同,主要用于对单行select语句或dml操作进行处理。...,在结合游标FOR循环快速超找所需要的数据。
如果要对列中的指定行进行操作,就必须使用游标。...当在PL/SQL块中执行查询语句(SELECT)和数据操纵语句(DML)时,Oracle会为其分配一个上下文区(Context Area) 游标是指向上下文区的指针,它为应用提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法...注意: 显示游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行 显示游标的操作过程 数据库 ——> (打开游标)——> 得到数据库的内容 ——> 提取行(得到变量)——> 关闭游标 示例...(游标 for 循环) 游标for循环简化游标处理 使用游标for循环时,oracle隐含打开游标,提取数据并关闭游标。...Oracle隐式地打开、提取,并总是自动地关闭SQL游标 隐式游标属性包括 SQL%FOUND、 SQL%NOTFOUND SQL%ROWCOUNT SQL%ISOPEN declare v_empno
]之内,所以刚才Oracle在执行上述SQL时(即第8次执行目标SQL)用的就是软解析/软软解析,并且此时重用的就是CHILD_NUMBER为5的Child Cursor中存储的解析树和执行计划。...l 为了存储这些额外的Child Cursor,Shared Pool在空间方面也会承受额外的压力(所以当从Oracle 10g升级到Oracle 11g时,Oracle会建议适当增加Shared Pool...这里需要注意的是,自适应游标共享在Oracle 11g中有一个硬限制——只有当目标SQL中的绑定变量(不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的)的个数不超过14个时,自适应游标共享才会生效...,可以推断出如果自适应游标共享对上述SQL不起作用的话,那么常规游标共享就会起作用,即上述SQL在被执行了三次的情况下应该只会产生一个Child Cursor。...数据库中与自适应游标共享相关的全部内容。
对应的列VERSION_COUNT的值从之前的5变为了现在的6,列EXECUTIONS的值为7,说明Oracle在第7次执行目标SQL时依然用的是硬解析。...注意,“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'CLUSTER'”,说明Oracle在硬解析上述SQL的过程中确实再次使用了绑定变量窺探...中记录的之内,所以Oracle此时还是得用硬解析。...究其根本原因,还是因为在自适应共享游标被启用的前提条件下,当已经被标记为Bind Aware的Child Cursor所对应的目标SQL再次被执行时,Oracle会根据当前传入的绑定变量值所对应的谓词条件的可选择率...如果当前传入的绑定变量值所在的谓词条件的可选择率处于该SQL之前硬解析时同名谓词条件在V$SQL_CS_STATISTICS中记录的可选择率范围之内,则此时Oracle就会使用软解析/软软解析,反之则是硬解析
一、游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据...a)静态游标 - 隐式游标 - 显式游标 b)Ref游标 三、游标具有的属性 %notfound 询问是否没有结果集 %found 询问是否存在结果集 %rowcount...返回受影响的行数 %isopen 询问游标是否已经打开 四、隐式游标 隐式游标 ---由Oracle数据库自动创建,名称是(SQL) ,主要用途是可以返回一个操作是否成功或失败. ...SQL%notfound --返回Boolean值 存在结果集返回 False SQL%found --返回Boolean值 存在结果集返回 True SQL%rowcount... --用户成功提取数据的行数 SQL%isopen --在隐式游标里一般这个属性是自动打开和关闭的.且任何时候查询都返回False 示例:向表中插入一行数据,询问是否插入成功. declare
♣ 题目部分 在Oracle中,什么是自适应游标共享?...在Oracle 10g及其后续的版本中,Oracle会自动收集直方图统计信息,这意味着与之前的版本相比,在Oracle 10g及其后续的版本中Oracle有更大的概率会知道目标列实际数据的分布情况,也就是说绑定变量窥探的副作用将会更加明显...为了解决上述绑定变量窥探所带来的问题,Oracle在l1g中引入了自适应游标共享(Adaptive Cursor Sharing,ACS)。...先介绍Oracle数据库中与自适应游标共享相关的一些基本概念。...这里需要注意的是,自适应游标共享在Oracle 11g中有一个硬限制——只有当目标SQL中的绑定变量(不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的)的个数不超过14个时,自适应游标共享才会生效
,则Oracle此时除了会新生成一个Child Cursor之外,还会把存储相同执行计划的原有Child Cursor标记为非共享(把原有Child Cursor在V$SQL中对应记录的列IS SHAREABLE...注意到“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'INDEX'”,这说明Oracle在硬解析目标SQL的过程中确实再次使用了绑定变量窥探...在介绍自适应游标共享的整体执行流程时曾经提到过:对于标记为Bind Aware的Child Cursor所对应的目标SQL,当该SQL再次被执行时,Oracle就会根据当前传入的绑定变量值所对应的谓词条件的可选择率...注意到“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'SYNONYM'”,这说明Oracle在硬解析该SQL的过程中确实再次使用了绑定变量窥探...注意,“Peeked Binds”部分的内容为“1 - :X (VARCHAR2(30), CSID=852): 'JAVA CLASS'”,说明Oracle在硬解析上述SQL的过程中确实再次使用了绑定变量窺探
对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。 非预定义 ( Predefined )错误 即其他标准的ORACLE错误。...-1---ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP) 游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现 为了处理 SQL 语句,ORACLE 必须分配一片叫上下文...TRUE; %ROWCOUNT 数字型属性,返回已从游标中读取的记录数。...在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable中各元素的名称与游标查询语句选择列表中所制定的列名相同。...,当最近一次读记录时成功返回,则值为true; SQL%NOTFOUND 布尔型属性,与%found相反; SQL %ROWCOUNT 数字型属性, 返回已从游标中读取得记录数; SQL %ISOPEN
显示游标是有用户声明和操作的一种游标。隐式游标是Oracle为所有的数据操作语句自动声明的一种游标。...在每个用户的会话中,我们可以同时打开多个游标,这个数量有数据库初始化参数文件中的OPEN CURSORS这个参数来定义。...声明游标和变量都在declare中的。通常先声明变量,在声明游标。 2、打开游标,从打开游标开始,后面的步骤都是在begin和end中执行的。...语法:open游标名>;当打开游标后查询语句就开始执行了,查询结果放到Oracle的缓冲区中,然后游标指向了这个缓冲区中查询结果的第一行记录之前。...隐式游标与显示游标的相同的:有相同的属性,隐式游标使用属性的方法是在属性名前面加上SQL%,即SQL%FOUND,SQL%ISOPEN等。
♣ 题目部分 在Oracle中,常规游标共享和自适应游标共享的联系和区别有哪些? ♣ 答案部分 从严格意义上来说,常规游标共享和自适应游标共享是各自独立的,两者之间没有必然的联系。...常规游标共享的目的是通过使用系统产生的绑定变量替换目标SQL的SQL文本中的具体输入值,以达到在不改一行应用代码的情况下,使那些仅仅是SQL文本的WHERE条件或者VALUES子句(适用于INSERT语句...)中的具体输入值不同的目标SQL彼此之间共享解析树和执行计划。...在Oracle 11g中,对于使用了绑定变量的目标SQL而言,不管这个绑定变量是该SQL自带的还是开启常规游标共享后系统产生的,只要满足一定的条件(比如绑定变量窥探被开启,该SQL中使用的绑定变量的数量不超过...在自适应游标共享被开启的情况下,Oracle并不推荐将CURSOR_SHARING的值设为SIMILAR,因为当把CURSOR_SHARING的值设为SIMILAR后,对自适应游标共享可能有不好的影响,
SQL 语句集,经编译后存储在数据库中。...存储过程是由流控制和 SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。 在 ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。...---- procedure优点 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。...%ROWCOUNT < 1; COMMIT; END LOOP; 这 里 的 SQL%ROWCOUNT 是 隐 士 游 标 。...%ROWCOUNT(然后当前游标所指向的行位置) (4).
游标名称 游标名称区分大小写。 游标名称在例程和相应类中必须是唯一的。游标名称可以是任意长度,但在前29个字符内必须是唯一的。游标名称区分大小写。...SQL中,如果对受影响的表和列具有适当的权限,则游标始终可以用于更新或删除操作。 DECLARE语句可以在查询后指定FOR UPDATE或FOR READ ONLY关键字子句。...它们是作为在代码中记录发出查询的进程是否具有所需的更新和删除对象权限的一种方式提供的。 示例 下面的嵌入式SQL示例使用DECLARE为指定两个输出主机变量的查询定义游标。...,"读取的行数 = ",%ROWCOUNT &sql( CLOSE EmpCursor ) if SQLCODE < 0 { w "SQL关闭游标错误...,"读取的行数 = ",%ROWCOUNT &sql( CLOSE EmpCursor2 ) if SQLCODE < 0 { w "SQL关闭游标错误
领取专属 10元无门槛券
手把手带您无忧上云