oracle 中pl/sql详解(二)

Hierarchical-Localization 环境配置与依赖管理全攻略 本文提供了Hierarchical-Localization(hloc)视觉定位工具箱从零开始的环境配置与依赖管理全攻略。针对Windows、Ubuntu和macOS三大操作系统,详细解析了Python版本选择、PyTorch与CUDA版本匹配、pycolmap版本锁定等核心依赖的安装步骤,并汇总了权重文件格式、NumPy版本、路径配置等常见问题的排查与解决方案,旨在帮助用户高效搭建稳定的hloc开发环境。 阅读详情
 

游标:

  游标(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  /

 

开始

结束

 

 

 

 

 

从通用到定制:营销Agent如何跨越数据鸿沟,实现对话SOP的个性化飞跃 阅读详情

相关推荐

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 292

for update和for update nowait的区别和使用

首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改。for update 和for update nowait主要区别在于是否等待,如果不加nowait,在执行select时就会报错,如果加了nowait,在执行select时就会等待,直至锁被释放。首先我们使用两个sql:1.select * from HH t whe...

weixin_33692284的博客 700

X3850x6 6241 fireware固件升级

登录联想https://datacentersupport.lenovo.com/cn/zc网站,选择system x,x3850 x6,type选择6241 选择驱动及应用程序,BIOS/UEFI 选择lnvgy_fw_uefi_a9e156a-4.90_anyos_32-64.uxz 文件,点击下载 选择IMM2, 下载lnvgy_fw_imm2_tcoo58b-5.80_anyos_noarch.uxz ps:3837和3839会跳转到ibm网站下载 笔记本直连.

zds00virtue的博客 5450

Oracle NOWAIT关键字的理解

sql_1:select 1 from dual for update;sql_2:select 1 from dual for update;sql_3:select 1 from dual for update nowait; 执行sql_1,不提交,表dual被锁分支1):执行sql_2,sql_2被阻塞,等待sql_1提交分支2):执行sql_3,因为有nowa

留下脚印 1万+

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 423

手把手教你用TJA1145A实现CAN节点智能唤醒(含数据帧过滤技巧)

本文详细介绍了如何使用TJA1145A收发器实现CAN节点的智能唤醒功能,包括数据帧过滤技巧和超低功耗设计。通过硬件级帧过滤和双条件唤醒机制,TJA1145A在保持微安级休眠电流的同时,能对特定报文做出毫秒级响应,显著提升电池供电设备的续航能力。

weixin_28721917的博客 249

oracle入门10

游标:   游标(cursor)可以被看作指向结果集(a set of rows)中一行的指针(pointer)。在oracle数据库中可以使用显示或隐式两种游标。 隐式游标: 在执行一个sql语句时,oracle服务器将自动创建一个隐式游标,这个游标是内存中处理该语句

251

EM算法求解混合伯努利模型

本文记录了EM算法求解混合伯努利分布的推导,并提供了matlab实验代码。

霁月难逢 彩云易散 6969

SQL语句:for update(有与没有)和for update nowait的区别

for update 和for update nowait 的区别:首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态。如果加入了for update,则Ora...

qq_37779709的博客 3894

高通QCS2290 SecureBoot全流程实战:从密钥生成到NON-HLOS.bin生成

本文详细拆解了高通QCS2290平台SecureBoot安全启动技术的端到端实战流程。从开发环境搭建、RSA密钥对生成与证书链构建,到关键XML配置文件修改、固件编译与数字签名,最终完成NON-HLOS.bin集成打包,为嵌入式开发者提供了一份清晰、可操作的安全启动部署指南。

weixin_28273593的博客 298

模电实验室:手把手教你调试共射放大电路静态工作点(避免波形失真)

本文详细介绍了共射放大电路静态工作点的调试方法,帮助避免波形失真问题。从实验准备、电路搭建到静态工作点测量,提供了实用的电阻选值策略和常见波形失真解决方案,适合电子相关专业学生和硬件工程师参考学习。

weixin_42531128的博客 375

Oracle 执行SQL一直卡死不动和“资源正忙,但指定以NOWAIT方式获取资源,或链接失效”的解决办法

Oracle 执行SQL一直卡死不动和“资源正忙,但指定以NOWAIT方式获取资源,或链接失效”的解决办法

SPACE 8371

鸿蒙设备部署轻量级Web服务器NexServer实践

Web服务器作为互联网基础设施的核心组件,其轻量化部署在移动终端领域具有重要实践价值。本文以鸿蒙操作系统为技术载体,深入解析微内核架构如何通过资源隔离和分布式软总线实现服务高可用。重点探讨NexServer这一专为嵌入式场景设计的轻量级服务器,其ARM原生支持特性与15MB级内存占用,在HTTP/2协议处理与WebSocket通信中展现出独特优势。在智能家居控制面板、边缘计算节点等物联网典型场景中,鸿蒙设备结合NexServer的方案相比传统Nginx部署可降低60%资源消耗。通过实测数据对比,该组合在50

weixin_30411239的博客 481

Oracle PL/SQL の 二

2.1   PL/SQL块 PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。   PL/SQL块的结构如下:   DECLARE --声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 BEGIN

910

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

oracle中除号,Oracle之PL/SQL学习笔记之PL/SQL块(二)

Oracle之PL/SQL学习笔记之PL/SQL块(二)1. PL/SQL块PL/SQL 程序由三部分组成,即声明部分,执行部分,例外部分(异常部分)PL/SQL 块的结构如下:declare/*声明部分:在此声明PL/SQL用到的变量,类型以及游标,局部的存储过程和函数*/begin/*执行部分:过程以及语句,即程序的主要部分*/exception/*执行异常部分:错误处理*/end;‍‍其中,...

weixin_29386469的博客 315

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

oracle pl/sql(二)

2014-04-14 1.标量变量:用于存放单行单列的数据 2.复合数据类型 1)PL/SQL记录:处理单行多列数据 2)PL/SQL集合:用于处理多行单列数据 AA:索引表(Associative arrays, also known as index-by tables) BB...

chunciqin6314的博客 174

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Oracle学习专栏(二):PL/SQL编程入门

本文介绍了Oracle PL/SQL编程的核心概念与应用。PL/SQL作为SQL的过程化扩展,解决了SQL在复杂业务逻辑处理中的局限性,具有减少网络传输、封装业务逻辑和增强数据安全性的优势。文章详细解析了PL/SQL的两种代码块结构:匿名块(临时执行)和命名块(可重复调用),并通过存储过程、函数和触发器的代码示例展示了实际应用场景。特别强调了异常处理机制的重要性,列举了常见预定义异常类型。最后以一个薪资计算自动化程序的实战案例,从表结构创建到存储过程编写,完整演示了PL/SQL在企业级应用中的价值。

qq_43947876的博客 1003

ORACLE PL/SQL编程总结(二)

----------异常错误处理--------- 即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。任何ORACLE错误(报告为ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误),都可以。当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在...

Dragon_a的博客 560

oracle 11g PL/SQL Programming学习二

------------------------------------------------------------- -----------------Cryking 学习笔记系列----------------- ------------------转载请注明出处,谢谢!----------------    第二章 PL/SQL基础   PL/SQL语言和SQL一样是一种大小写

流云追风 2461

oracle中pl/sql编程(二)

oracle中pl/sql编程(二): set serveroutput on -打开输出选项(这样才可以输出) set serveroutput off-关闭输出选项 1.包含定义部分和执行部分的pl/sql块 declare --定义部分 v_ename  varchar2(5);--定义字符串变量 begin --执行部分 select en

弗兰-随风小欢的博客 842

Oracle之PL/SQL学习笔记之PL/SQL块(二)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34392906的博客 158

Oracle 数据库 - PL/SQL 编程(二)

目录 流程控制语句 1、选择语句 1)、if ... then 语句 2)、if ... then ... else 语句 3)、if ... then ... elsif 语句 4)、case 语句 2、循环语句 1)、loop 语句 2)、while 语句 3)、for 语句 PL/SQL 异常处理 1、预定义异常 2、自定义异常 1)、错误编号异常 2)、业务逻...

徐小mu的博客 796

ORACLE PL/SQL练习(二)

一个PL/SQL块最多由4个不同单元组成,只有一个单元是必不可少的。块头(Header) 只有命名块才会有这个单元。块头单元就确定了这个命名块或者程序的调用方式, 这个单元是可选的。 声明单元(Declaration section) 这部分定义变量,游标,以及可以被后面的执行单元或异常处理单元引用的子块。 这一单元也是可选的。 执行单元(...

weixin_34256074的博客 126

基于 JetBrains DataGrip 之 Oracle PL/SQL 攻略 (二)

对异常的检测 EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('无相关匹配的信息'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('实际返回的行数超出请求的行数'); 使用游标从数据库中检索单行数据,进行两个的FETCH,进而判断结果DECLARE --创建一个

我们都一样 都不一样 2874

ORACLE PL/SQL 集合学习笔记(二)

三、嵌套表的使用方法 1、将嵌套表定义为PL/SQL的程序构造块 TYPE type_name IS TABLE OF element_type[NOT NULL]; 如下例所示:DECLARE -- Define a nested table of variable length strings. TYPE card_table IS TAB

朝着梦想 渐行前进 1400

oracle (二) pl/sql基础

---------------------------PL/SQL基础--------------- -----------------/*pl/sql基本结构*/ DECLARE nNUMBER; BEGIN n:=CEIL(123/12); dbms_ou...

chouxi3060的博客 127
上一篇: oracle中PL/SQL详解(一)
下一篇: oracle触发器详解
日依
博客等级 码龄15年 165粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值