原创:oracle PL/SQL编程基础 下<十二>

本文详细介绍了Oracle数据库中的游标概念,包括显示和隐式游标的区别、主要属性及使用方法,并通过实例展示了如何使用游标进行数据检索、更新和处理。

游标: 游标(cursor)可以被看作指向结果集(a set of rows)中一行的指针(pointer)。在oracle数据库中可以使用显示或隐式两种游标。


隐式游标:
在执行一个sql语句时,oracle服务器将自动创建一个隐式游标,这个游标是内存中处理该语句的工作区域,其中存储了执行SQL语句的结果.通过游标的属性可获得sql语句执行的结果以及游标状态信息。
游标的主要属性如下:
%found 布尔属性 如果sql语句至少影响一行则为true 否则为false
%notfound 布尔属性与%found相反。
%isopen 布尔属性游标是否打开 打开为true 否则为false
%rowcount 数字属性返回受sql语句影响的行数
怎么来使用这些属性呢?
则可以通过 “sql属性名 “来查看结果
//%rowcount 用来检查受影响的行
SQL> declare
2 emp_row emp%rowtype;
3 begin
4 select * into emp_row from emp where empno=7369;
5 dbms_output.put_line(sql%rowcount);
6 end;
7 /

1 //返回的结果为1
//%found用来检查是否影响到了行
SQL> begin
2 update emp set sal=2000 where empno=7369;
3 if sql%found then
4 dbms_output.put_line('更新记录成功影响了'||sql%rowcount||'行');
5 else
6 dbms_output.put_line('未更新记录');
7 end if;
8 end;
9 /
更新记录成功 影响了1行

// %notfound
//%isopen
一以上两个的使用方式参考 %found进行理解。


另外一种隐式游标cursor for loop可用于处理sql语句的结果集
SQL> begin
2
3 for rec in (select * from emp) loop
4 dbms_output.put_line(rec.empno||'/'||rec.ename||'/'||rec.job||'/'||rec.mgr||'/'||rec.hiredate||'/'||rec.sal||'/'||rec.comm||'/'||rec.deptno);
5 end loop;
6 end;
7 /

显示游标
是在PL/SQL程序中使用包含select语句来声明的游标。如果需要处理从数据库中检索的一组记录,则可以使用显示游标.使用显示游标处理数据需要四个步骤:声明游标,打开游标,检索数据,关闭游标。
1、 声明游标
声明游标就是通过定义游标的名称,游标的特性来声明游标,以及打开游标后就可调用查询语句,声明的语法如下:
Cursor cursor_name[parameter[,parameter]….]
[return return_type] is select_statement;
Parameter作为游标的输入参数,它可以让用户在打开游标式,向游标传递值;语法如下:
Parameter_name [in] datatype[{:=|default} expression]\
举例:
declare
cursor emp_cursor (pno in number(4) default 7369)
is select * from emp
where empno=pno;
2、 打开游标
就是指执行声明游标时指定的查询语句。打开的方式只需使用open打开语法:
Open cursor_name(参数);
如果没有指定参数就采用默认值执行select语句

3、 检索数据
检索数据就是从检索到的结果集中获取数据保存到变量中,以便变量进行处理。
使用fetch语句找出结果集中的单行,并从中提取单个值传递给主变量。
语法如下:
Fetch cursor_name into [variable_list[record_variable]]
变量用于存储检索的数据

4、 关闭游标

close 游标名称

综上所述综合案例如下:
SQL> declare
2 cursor emp_cursor (pno in number default 7369) //声明游标
3 is select * from emp where empno=pno;
4
5 emp_row emp%rowtype; //声明变量
6 begin
7 open emp_cursor(7934); //打开游标
8 fetch emp_cursor into emp_row; //检索数据 结果为一行
9 dbms_output.put_line(emp_row.ename); //输出检索结果
10
11 close emp_cursor; //关闭游标
12 end;
13 /


游标for循环
依次读取结果集中的行,当for循环开始时,游标会自动打开(不需要使用open方法开启),每循环读取一次,系统自动读取当前数据(不需要使用fetch),当退出for循环时,游标也会自动关闭(不需要使用close方法)。
SQL> declare
2 cursor emp_cursor (pno in number default 7369) //声明游标
3 is select * from emp where empno=pno;
4
5 begin
6 for emp_row in emp_cursor(7934) loop //for循环开始时 自动打开游标 并且自动获取数据 自动关闭
7 dbms_output.put_line(emp_row.ename);
8 end loop;
9 end;
10 /


游标变量
游标变量也可以处理多行查询结果集。
游标变量的定义包括两个步骤:
1、 定义cursor类型的指针
语法:
Type ref_cursor_name is ref cursor[return return_type]
举例:
Type var_cursor_name is ref cursor;
2、 定义ref cursor类型的变量
v_rc var_cursor_name;
综合写法如下:
Type var_cursor_name is ref cursor;
v_rc var_cursor_name;
上面的综合声明的游标变量 称为弱的ref cursor类型,因为它没有指明游标返回的结果,因此它可以指向任何一个具有多列的select查询结果.

相对于上面还有一种称为:强ref cursor类型.
声明方式如下:
Type varcursorName is ref cursor return emp%rowtype; //指明了返回的结果
Vcn varcursorName; //声明一个强的ref cursor类型的变量

使用游标变量与游标使用方式一样,也需要声明,打开,检索,关闭游标变量。

综合案例如下:
SQL> declare
2
3 type emp_cname is ref cursor return emp%rowtype; //声明游标变量第一步
4
5 ecname emp_cname; //声明游标变量第二步
6
7 emp_row emp%rowtype; //声明用于保存检索数据的变量
8
9 begin
10 dbms_output.put_line('开始');
11 open ecname for select * from emp where empno=7934; //打开游标变量
12 loop
13 fetch ecname into emp_row; //查询结果赋值给保存的变量
14 exit when ecname%notfound; //退出条件
15 dbms_output.put_line(emp_row.ename); //输出结果
16 end loop; //退出循环
17 close ecname; //关闭游标变量
18 dbms_output.put_line('结束');
19 end;
20 /

开始
MILLER
结束

//复杂的案例
SQL> declare
2
3 type emp_cname is ref cursor return emp%rowtype;
4
5 ecname emp_cname;
6
7 emp_row emp%rowtype;
8
9 begin
10 dbms_output.put_line('开始');
11 open ecname for select * from emp;
12 loop
13 fetch ecname into emp_row;
14 exit when ecname%notfound;
15 dbms_output.put_line(emp_row.ename);
16 end loop;
17 close ecname;
18 dbms_output.put_line('结束');
19 end;
20 /

开始
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

结束



使用游标更新数据库
1、 定位游标之后进行删除|修改指定的数据行 更新的时候需要使用for update选项 语法如下:
Cursor cursor_name is select_statement;
For update[of column[,column],[nowait]]
Of用来指定要锁定的列,如果忽略of那么表中选择的数据行都将锁定。如果被锁定行已经被锁定了,那么必须等待释放才能锁定对于这种情况我们可以使用nowait语句。

当使用for update语句声明游标后,可以再delete|update语句中使用where current of子句,修改|删除游标结果集中当前行对应的表中的数据。
语法如下:
Where { current of cursor_name|search_condition}
举例说明:
//修改操作
SQL> declare
2
3 cursor ecname is select * from emp where empno=7934
4 for update of sal nowait;
5
6 esal number(7,2);
7
8
9 begin
10 dbms_output.put_line('开始');
11
12 for r in ecname loop
13 esal:=r.sal*10;
14 update emp set sal=esal where current of ecname;
15 end loop;
16
17 dbms_output.put_line('结束');
18 end;
19 /

开始
结束



以上内容归redarmy_chen所有,如需转载请附带出处,如有疑问请发送至redarmy_chen@qq.com


内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值