大家好,如果您还对第四章:高效游标操作指南不太了解,没有关系,今天就由本站为大家分享第四章:高效游标操作指南的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
游标概念
为了处理SQL语句,ORACLE必须分配一个称为上下文(context area)的区域来处理必要的信息,包括要处理的行数、指向语句被分析后表示的指针,以及查询活动集。
游标是上下文的句柄或指针。游标允许PL/SQL 控制上下文以及处理语句时上下文中发生的情况。
对于不同的SQL语句,游标的使用也不同:
SQL语句游标不是查询语句。隐式结果是单行查询语句。隐式或显示的结果是多行查询语句。显式游标处理。显式游标处理。
显式游标处理需要四个PL/SQL 步骤:定义游标:,即定义游标名称及其对应的SELECT 语句。
格式:
CURSOR 光标名称[(参数[, 参数]…)] IS select_statement;
游标参数只能是输入参数,其格式为:
参数名称[IN] 数据类型[{:=|默认}表达式]
指定数据类型时不能使用长度约束。例如NUMBER(4)、CHAR(10)等都是错误的。打开游标:是执行游标对应的SELECT语句,将查询结果放入工作区,并将指针指向工作区的头部,标识游标结果集。如果游标查询语句包含FOR UPDATE选项,OPEN语句也会锁定数据库表中游标结果集对应的数据行。
格式:
OPEN 光标名称[([参数=]值[,[参数=]值]…)];
向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。 PL/SQL 程序不能使用OPEN 语句重复打开游标。提取游标数据:是检索结果集中的数据行并将其放入指定的输出变量中。
格式:
FETCH 游标名INTO {变量列表|记录变量};处理记录;继续处理,直到活动集合中没有记录为止;关闭游标:提取并处理游标结果集数据后,应及时关闭游标,以释放游标系统资源占用的空间,游标的工作区变为无效,无法再使用FETCH语句检索数据。可以使用OPEN 语句重新打开关闭的游标。
格式:
关闭游标名;
注:定义的游标不能有 INTO 子句。示例1.查询前10名员工信息。
宣布
--定义光标
光标c_cursor 是选择姓氏,薪水
来自员工
其中rownum 11
按工资排序;
v_name 员工.last_name%type;
v_sal 员工.salary%type;
开始
--打开光标
打开c_cursor;
--提取光标数据
将c_cursor 获取到v_name,v_sal;
while c_cursor % 找到循环
dbms_output.put_line(v_name || ":" || v_sal);
将c_cursor 获取到v_name,v_sal;
结束循环;
--关闭光标
关闭c_cursor;
end;例2.游标参数传递方法。
宣布
--定义光标
光标c_cursor(emp_no number 默认11) 是选择姓氏,薪水
来自员工
其中rownum emp_no
按工资排序;
v_name 员工.last_name%type;
v_sal 员工.salary%type;
开始
--打开光标
打开c_cursor;
--提取光标数据
将c_cursor 获取到v_name,v_sal;
while c_cursor % 找到循环
dbms_output.put_line(v_name || ":" || v_sal);
将c_cursor 获取到v_name,v_sal;
结束循环;
--关闭光标
关闭c_cursor;
结束;声明
--定义光标
光标c_cursor(emp_no number 默认11) 是选择姓氏,薪水
来自员工
其中rownum emp_no
按工资排序;
v_name 员工.last_name%type;
v_sal 员工.salary%type;
开始
--打开光标
打开c_cursor(emp_no=20);
--提取光标数据
将c_cursor 获取到v_name,v_sal;
while c_cursor % 找到循环
dbms_output.put_line(v_name || ":" || v_sal);
将c_cursor 获取到v_name,v_sal;
结束循环;
--关闭光标
关闭c_cursor;
结束;光标属性
%FOUND 布尔属性,当最新读取记录成功返回时,值为TRUE; %NOTFOUND 布尔属性,与%FOUND相反;
%ISOPEN 布尔属性,当游标打开时返回TRUE;
%ROWCOUNT 返回已从游标读取的记录数的数字属性。例3:工资低于3000的员工,工资调整为3000。宣布
v_eid 员工.employee_id%类型;
v_sal 员工.salary%type;
光标c_cursor是选择employee_id,salary
来自员工;
开始
打开c_cursor;
环形
将c_cursor取入v_eid,v_sal;
当c_cursor %notfound 时退出;
如果v_sal=3000 那么
更新员工设置工资=3000;
其中employee_id=v_eid;
dbms_output.put_line("员工:" || v_eid || "工资已更新");
结束如果;
结束循环;
dbms_output.put_line("记录数为:" || c_cursor %rowcount);
关闭c_cursor;
end;游标的FOR循环
PL/SQL语言提供游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句;当进入循环时,游标FOR循环语句自动打开游标并提取游标第一行数据。当程序处理完当前提取的数据并进入下一个循环时,游标FOR循环语句自动提取下一行数据进行程序处理。当结果集中的所有数据行都提取完毕后,循环结束,游标自动关闭。
格式:
FOR 索引变量IN 游标名称[值[, 值].] LOOP
-- 光标数据处理代码
结束循环;其中:index_variable 是游标FOR 循环语句隐式声明的索引变量。该变量是一个记录变量,其结构与游标查询语句返回的结构集合相同。提取出的游标数据可以在程序中通过引用索引记录变量元素来读取。 index_variable中每个元素的名称与游标查询语句选择列表中指定的列名相同。如果游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名,然后才能通过游标FOR循环语句中的索引变量访问这些列数据。注意:不要在程序中手动操作光标;不要定义用于控制程序中的FOR 循环的记录。示例4:声明
光标c_emp选择last_name,salary sal
来自员工;
开始
for c_emp 循环中的v_emp
dbms_output.put_line(v_emp.last_name || "," || v_emp.sal);
结束循环;
end;例5:当声明的游标有参数时,通过游标FOR循环语句将参数传递给游标。宣布
光标c_emp(dep_id 编号默认50) 是
选择姓氏、工资
来自员工
其中部门ID=部门ID;
开始
for c_emp 循环中的v_emp
dbms_output.put_line(v_emp.last_name || "," || v_emp.sal);
结束循环;
结束;声明
光标c_emp(dep_id 编号默认50) 是
选择姓氏、工资
来自员工
其中部门ID=部门ID;
开始
for c_emp(80) 循环中的v_emp
dbms_output.put_line(v_emp.last_name || "," || v_emp.sal);
结束循环;
end;例6:PL/SQL还允许在游标FOR循环语句中使用子查询来实现游标的功能。开始
for v_emp in(选择姓氏,员工的薪水)循环
dbms_output.put_line(v_emp.last_name || "," || v_emp.salary);
结束循环;
结尾;处理隐式游标显式游标主要用于处理查询语句,尤其是当查询结果为多条记录时;对于非查询语句,例如修改和删除操作,ORACLE系统自动为这些操作设置游标并创建它们的工作区。这些由系统隐式创建的游标称为隐式游标。隐式游标的名称是SQL,是ORACLE系统定义的。隐式游标的定义、打开、取值、关闭等操作均由ORACLE系统自动完成,无需用户任何处理。用户只能通过隐式游标的相关属性来完成相应的操作。在隐式游标的工作区中,存储的数据是独立于用户定义的显示游标处理的最新SQL语句中包含的数据。
调用格式为:SQL%隐式游标属性
SQL%FOUND 布尔属性,当最新读取记录成功返回时,值为TRUE;
SQL%NOTFOUND 布尔属性,与%FOUND相反;
SQL%ROWCOUNT 数值属性,返回从游标读取的记录数;
SQL%ISOPEN 布尔属性,该值始终为FALSE。隐式游标在SQL命令执行后立即关闭。示例7: 更新指定的员工信息。如果未找到该员工,则打印消息“未找到此人”。宣布
v_name 员工.last_name%type;
v_id 员工.employee_id%type :=v_id;
开始
更新员工
设置姓氏="xx"
其中员工ID=v_id;
如果SQL%NOTFOUND 那么
dbms_output.put_line("没有找到这样的人");
结束如果;
end;关于NO_DATA_FOUND和%NOTFOUND的区别SELECT . INTO语句触发NO_DATA_FOUND;当未找到显式游标的WHERE 子句时触发;当未找到显式游标的WHERE 子句时触发;当未找到UPDATE 或DELETE 语句的WHERE 子句时触发
SQL%NOTFOUND;在提取循环中,使用NOTFOUND或FOUND来确定循环的退出条件。不要使用NO_DATA_FOUND。游标的修改和删除操作。游标修改和删除操作是指修改或删除游标定位下表中的指定数据。数据行。这时就要求游标查询语句中必须使用FOR UPDATE选项,在游标打开时锁定表中游标结果集中对应数据行的所有列和部分列。
为了防止正在处理(查询)的行被其他用户更改,ORACLE提供了FOR UPDATE子句来锁定选定的行。此要求强制ORACLE 锁定游标结果集的行,从而防止其他事务更新或删除相同的行,直到您的事务提交或回滚。
语法:
选择。 FROM … FOR UPDATE [OF 列[, 列]…] [现在]
如果另一个会话已锁定活动集中的行,则SELECT FOR UPDATE 操作将等待,直到另一个会话释放锁定,然后再继续其操作。在这种情况下,当添加NOWAIT 子句时,如果这些行确实被另一个会话锁定,则OPEN 立即返回并给出: ORA-0054: 资源繁忙并指定了nowait 进行获取。如果使用FOR UPDATE 声明游标,则可以在DELETE 和UPDATE 语句中使用WHERE CURRENT OFcursor_name 子标题。语句修改或删除游标结果集中当前行对应的数据库表中的数据行。例8:从EMPLOYEES表中查询某个部门的员工,设置其最低工资为3000;宣布
v_dep_id员工.department_id%type :=v_dep_id;
游标emp_cursor 是
选择姓氏、工资
来自员工
其中部门ID=v_dep_id
立即更新;
开始
for emp_cursor 循环中的emp_rec
如果emp_rec.salary 3000 那么
更新员工设置工资=3000
其中emp_cursor 的当前值;
结束如果;
结束循环;
【第四章:高效游标操作指南】相关文章:
用户评论
学习数据库就一定要了解游标的概念啊!
有14位网友表示赞同!
感觉这个标题很有吸引力,我要看一看这章到底讲什么游标的用法。
有13位网友表示赞同!
终于到了游标的部分了,我已经按捺不住我的激动心情!
有16位网友表示赞同!
我一直对数据库游标的运用不太了解,这章节应该能帮我填补一些知识空白。
有8位网友表示赞同!
以前没接触过游标,希望能通过这章课文有一个清晰的理解。
有15位网友表示赞同!
学习游标的关键是什么?这个标题引发了我很多思考。
有12位网友表示赞同!
期待这章讲解游标的各种应用场景!
有8位网友表示赞同!
我想知道游标是如何与数据库交互工作的,希望这个章节能详细解释。
有17位网友表示赞同!
掌握游标的使用技巧,可以提高程序效率吗?我很想了解!
有19位网友表示赞同!
学习游标,对我未来的编程道路很有帮助吧!
有5位网友表示赞同!
这章的内容一定会让我对数据库有了更深的理解!
有17位网友表示赞同!
我很好奇游标的优缺点是什么,想知道这章会给我哪些启发。
有19位网友表示赞同!
希望这章讲游标的时候可以用一些实例讲解,这样更容易理解。
有8位网友表示赞同!
这个标题让我迫不及待想要翻开这本编程书了!
有16位网友表示赞同!
游标在实际开发中有哪些应用?我想这章会给我答案!
有15位网友表示赞同!
我已经开始期待学习游标的使用方法啦!
有5位网友表示赞同!
我想把游标的操作技巧学好,以便能写出更优秀的程序代码!
有15位网友表示赞同!
我相信通过学习游标,我可以成为一名更合格的程序员!
有16位网友表示赞同!
这章内容应该很理论性,希望还能结合实际案例进行讲解。
有11位网友表示赞同!
我要努力学习游标的使用技巧,让我在编程的道路上更加强大!
有9位网友表示赞同!