`
kevin.wang
  • 浏览: 251159 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

游 标

阅读更多
对于普通数据库,主语言是面向记录的,一组主变量一次只能存放一条记录。
游标的优点
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

一、参数游标   
参数游标是带有参数的游标,在定义参数游标之后,当使用不同参数值多次打开游标时,可以产生不同的结果集,语法如下:
cursor cursor_name(parameter_name datatype) is select_statement;
定义参数游标时,游标参数只能指定数据类型,而不能指定长度。
示例如下:

declare   
cursor temp_cursor(no number) is select name from cip_temps where id=no;   
v_name cip_temps.name%type;    
begin   
open temp_cursor(1);   
loop   
fetch temp_cursor into v_name;   
exit when temp_cursor%notfound;   
dbms_output.put_line(v_name);   
end loop;   
close temp_cursor;   
end;  



declare
cursor temp_cursor(no number) is select name from cip_temps where id=no;
v_name cip_temps.name%type; 
begin
open temp_cursor(1);
loop
fetch temp_cursor into v_name;
exit when temp_cursor%notfound;
dbms_output.put_line(v_name);
end loop;
close temp_cursor;
end;


二、使用游标更新或删除数据
通过使用显示游标,不仅可以一行一行的处理select语句结果,而且也可以更新或删除当前游标的数据,注意,如果要通过游标更新或删除数据,在定义游标时一定要带有for update子句,语法如下:
cursor cursor_name(parameter_name datatype) is select_statement for updae [of column_reference][nowait];如上所示:for update子句用于在游标结果集数据上加行共享锁,以防止其他用户在相应行上执行DML操作,当select语句要引用到多张表是,使用of子句可以确定哪些表要加锁,如果没有of子句,则会在select语句所引用的全部表上加锁,nowait用于指定不等待锁,为了更新或删除当前游标行数据,必须在update 或delete语句中引用where current of 子句,语法如下:
update table_name set column=.. where current of cursor_name;
delete from table_name  where current of cursor_name;
1、使用游标更新数据

declare   
cursor temp_cursor is select name,address,id from cip_temps for update;   
v_name cip_temps.name%type;   
v_address cip_temps.ADDRESS%type;   
v_id cip_temps.id%type;   
begin   
open temp_cursor;   
loop   
fetch temp_cursor into v_name,v_address,v_id;   
exit when temp_cursor%NOTFOUND;   
if(v_id>4) then   
update cip_temps set name='name'||to_char(v_id),address='address'||to_char(v_id) where current of temp_cursor;   
end if;   
end loop;   
close temp_cursor;   
end;  



declare
cursor temp_cursor is select name,address,id from cip_temps for update;
v_name cip_temps.name%type;
v_address cip_temps.ADDRESS%type;
v_id cip_temps.id%type;
begin
open temp_cursor;
loop
fetch temp_cursor into v_name,v_address,v_id;
exit when temp_cursor%NOTFOUND;
if(v_id>4) then
update cip_temps set name='name'||to_char(v_id),address='address'||to_char(v_id) where current of temp_cursor;
end if;
end loop;
close temp_cursor;
end;


2、使用游标删除数据 

declare   
cursor temp_cursor is select name,address,id from cip_temps for update;   
v_name cip_temps.name%type;   
v_address cip_temps.ADDRESS%type;   
v_id cip_temps.id%type;   
begin   
open temp_cursor;   
loop   
fetch temp_cursor into v_name,v_address,v_id;   
exit when temp_cursor%NOTFOUND;   
if(v_id>2) then   
delete from cip_temps where current of temp_cursor;   
end if;   
end loop;   
close temp_cursor;   
end;  


declare
cursor temp_cursor is select name,address,id from cip_temps for update;
v_name cip_temps.name%type;
v_address cip_temps.ADDRESS%type;
v_id cip_temps.id%type;
begin
open temp_cursor;
loop
fetch temp_cursor into v_name,v_address,v_id;
exit when temp_cursor%NOTFOUND;
if(v_id>2) then
delete from cip_temps where current of temp_cursor;
end if;
end loop;
close temp_cursor;
end;


3、使用of子句在特定表加行共享锁。
如果使用子查询涉及到多张表,那么默认情况下会在所有表上加行共享锁,为了只在特定表上加行共享锁,需要在for update子句后带有of子句,of后面跟字段名,如果跟表名或游标名称,则会报错:标示符无效。示例如下:

declare   
cursor gData is select name,address,cip_temps.id from cip_temps,cip_t    
where cip_temps.id=cip_t.id for update  of address;   
rs gData%rowtype;   
begin   
  open gData;   
  loop   
     fetch gData into rs;   
     exit when gData%notfound;   
         if rs.id=1 then   
            delete from cip_temps where current of gData;    
         else   
            update cip_temps set name='塞北的雪' where current of gData;   
         end if;   
     
  end loop;   
  close gData;   
end;  


declare
cursor gData is select name,address,cip_temps.id from cip_temps,cip_t 
where cip_temps.id=cip_t.id for update  of address;
rs gData%rowtype;
begin
  open gData;
  loop
     fetch gData into rs;
     exit when gData%notfound;
         if rs.id=1 then
            delete from cip_temps where current of gData; 
         else
            update cip_temps set name='塞北的雪' where current of gData;
         end if;
  
  end loop;
  close gData;
end;


4、使用nowait子句
使用for update语句对被作用于行加锁,如果其他会话已经在被作用于行上加锁,那么默认情况下当前会话要一直等待对方释放锁,通过在for update子句中指定 nowait语句,可以避免等待锁,当指定了nowait子句之后,如果其他会话已经在被作用行加锁,那么当前会话会显示错误提示信息,并退出PL/SQL,示例如下:

declare   
cursor gData is select name,address,cip_temps.id from cip_temps,cip_t    
where cip_temps.id=cip_t.id for update  nowait;   
rs gData%rowtype;   
begin   
  open gData;   
  loop   
     fetch gData into rs;   
     exit when gData%notfound;   
         if rs.id=1 then   
            delete from cip_temps where current of gData;    
         else   
            update cip_temps set name='塞北的雪' where current of gData;   
         end if;   
     
  end loop;   
  close gData;   
end;  


declare
cursor gData is select name,address,cip_temps.id from cip_temps,cip_t 
where cip_temps.id=cip_t.id for update  nowait;
rs gData%rowtype;
begin
  open gData;
  loop
     fetch gData into rs;
     exit when gData%notfound;
         if rs.id=1 then
            delete from cip_temps where current of gData; 
         else
            update cip_temps set name='塞北的雪' where current of gData;
         end if;
  
  end loop;
  close gData;
end;


三、游标for循环
   使用游标for循环是循环游标最简单的方法,oracle会隐含打开游标、循环提取数据、关闭游标,语法如下:
     for record_name  in cursor_name  loop
           ..........
     end loop;
如上所示:cursor_name是已经定义的游标名称,record_name是oracle隐含定义的记录变量。
1、使用游标for循环
   当使用游标开发程序时,建议使用for循环,从而简化代码程序,示例如下:

declare   
cursor temp_cursor is  select name,age,address,id from cip_temps;   
begin   
for emp_record in temp_cursor loop   
dbms_output.put_line(temp_cursor%rowcount||'第一行数据:'||emp_record.name||':'|| emp_record.age||':'||  emp_record.address||':'|| emp_record.id);   
end loop;   
end;  


declare
cursor temp_cursor is  select name,age,address,id from cip_temps;
begin
for emp_record in temp_cursor loop
dbms_output.put_line(temp_cursor%rowcount||'第一行数据:'||emp_record.name||':'|| emp_record.age||':'||  emp_record.address||':'|| emp_record.id);
end loop;
end;


2、在游标for循环时直接使用子查询

declare      
begin      
for emp_record in (select * from cip_temps) loop      
dbms_output.put_line('第一行数据:'||emp_record.name||':'|| emp_record.age||':'||  emp_record.address||':'|| emp_record.id);      
end loop;      
end;    
分享到:
评论

相关推荐

    旅游标准评定委员会.docx

    在2016年1月20日,四川省旅游标准评定委员会对外发布了川旅标评委发〔2016〕4号文件,对外公布了对599家单位的乡村旅游特色业态经营点的认定结果。这一举动标志着该省乡村旅游发展的新里程,更是一次对乡村旅游业...

    乡村旅游标准要求与质量控制.pptx

    主要目标市场是城市居民,满足他们体验田园生活和回归朴素民俗的需求,形成了独特的"乡村休闲游"模式。 乡村旅游质量评价的主体主要是城市居民,评价要素包括田园风味的独特性、整体印象、乡村文化的领略、农庄生活...

    oracle 游 标 使 用

    ### Oracle 游标使用详解 #### 一、游标简介 在Oracle数据库中,游标是一种重要的编程技术,主要用于处理查询结果集中的数据。通过游标,开发人员可以在程序中一行行地处理查询结果,而不仅仅是获取整个结果集。...

    c# SQL 旅游管理系统

    某旅行社要开发一个小型旅游管理子系统,主要涉及的基本实体及其基本信息如下: 旅游线路:线路编号、起点、终点、旅游天数、主要景点。 旅游班次:班次编号、出发日期、回程日期、旅游标准、报价、折扣率。...

    中国旅游市场现状及出路

    一方面,旅游市场的规模不断扩大,国内游客数量逐年攀升,出境游也呈现出强劲的增长势头。另一方面,旅游产品和服务日益多元化,从传统的观光旅游到文化体验、生态旅游、乡村旅游等各类特色旅游形式应运而生。 然而...

    ios-ScrollView实现游尺标功能.zip

    本示例“ios-ScrollView实现游尺标功能.zip”着重讲解如何利用UIScrollView实现一个具有游标功能的界面,该功能允许用户既可以通过滑动浏览,也可以手动输入值来导航。下面将详细介绍如何实现这一功能。 首先,我们...

    2020旅游风向标.pdf

    2020旅游风向标.pdf

    旅游标准化示范创建单位旅游企业标准体系建设.pptx

    标准体系的建立依据包括企业性质、目标、组织结构、相关法律法规以及国标、行标和地标的要求。体系通常由总则、基础标准体系、管理标准体系、服务标准体系和岗位工作标准体系构成。基础标准体系涉及标准化导则,包括...

    5A级旅游景区导览标识牌规划设计设置导视系统工程规范标准.docx

    服务设施标识则是提供给游客必要服务的指向标,包括售票处、游客中心等关键场所的指引。 在规划和设计导览标识系统时,需要从多个方面进行综合考虑。首先是目标设定,即通过标识系统的设计来树立高品质服务形象,...

    中国在线旅游行业及对标品牌分析XXXX0407.pptx

    中国在线旅游行业及对标品牌分析XXXX0407.pptx

    手游弱网、性能测试方法及标准文档

    手游弱网和性能测试是确保游戏在各种网络条件和设备环境下稳定运行的关键环节。下面将详细阐述这些领域的关键知识点。 1. **纯丢包网络模型**:在手游测试中,模拟真实世界的网络环境是非常重要的,这包括模拟网络...

    云计算平台建设项目技术参数要求.doc

    - 方案评审不合格的将被废标。 3. 业务需求: - 内部业务:协同办公、即时通讯和在线会议。 - 旅游管理:在线业务办理、电子合同监管、质量监管、导游考试和培训。 - 为企业提供 IT 服务:存储、运维、安全、...

    精品商业计划书2020-手游渠道评级标准.xlsx

    精品商业计划书2020-手游渠道评级标准.xlsx

    2020旅游风向标.zip

    4. **本地游与周边游兴起**:长途旅行受限,短途和本地旅游成为新的趋势,推动了乡村旅游和城市周边游的发展。 5. **健康安全成为首要考量**:旅行者对目的地的卫生条件和安全措施的关注度空前提高,影响着旅游目的...

    行业洞察-2020旅游风向标.zip

    【标题】"行业洞察-2020旅游风向标" 涵盖了2020年全球旅游业的发展趋势、挑战与机遇。这一主题旨在分析在这一年中,旅游业受到的各种影响,包括政策变化、经济环境、消费者行为、技术创新等因素,并对未来的发展方向...

    游戏产品评级标准

    页游手游评级标准参考,可用于游戏行业各渠道商接入标准

    《旅游景区规划与开发》课程标准.pdf

    能力目标方面,课程要求学生能够运用所学知识进行实践,如规划景区的服务设施、基础设施、游线,进行景区形象策划,分析规划内容并评估景区项目的经济效益。学生还应具备良好的社会能力,包括参与编制景区规划文本和...

Global site tag (gtag.js) - Google Analytics