Oracle 游标(光标)、抛出异常、存储过程、存储函数、触发器、视图语法及应用

游标(光标): 是用来操作查询结果集,相当于是JDBC中ResultSet
       语法: cursor 游标名[(参数名 参数类型)] is 查询结果集
       开发步骤:
           1. 声明游标
           2. 打开游标    open 游标名
           3. 从游标中取数据  fetch 游标名 into 变量
               游标名%found :找到数据
               游标名%notfound : 没有找到数据 
           4. 关闭游标    close 游标名
           
      系统引用游标
           1. 声明游标 : 游标名 sys_refcursor
           2. 打开游标: open 游标名 for 结果集
           3. 从游标中取数据
           4. 关闭游标
                
     for循环遍历游标:
           不需要声明额外变量
           不需要打开游标
           不需要关闭游标      

Oracle:> declare--游标cursor vrows is select * from 表1;--s声明变量,记录一行数据vrow 表1%rowtype;
begin--1.打开游标  open vrows;--2.从游标提取数据--循环取数据loopfetch vrows into vrow; exit when vrows%notfound;  dbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal);end loop;--3.关闭游标close vrows;
end;

--输出指定部门下的员工姓名和工资

Oracle:>
declare--声明游标cursor vrows(dno number) is select * from 表1 where deptno = dno;--声明变量vrow 表1%rowtype;
begin--1.打开游标 , 指定10号部门open vrows(10);--2. 循环遍历,取数据loopfetch vrows into vrow;exit when vrows%notfound;    dbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal);end loop;close vrows;
end;

--系统引用游标
--输出员工表中所有的员工姓名和工资

Oracle:> declare--声明系统引用游标vrows sys_refcursor;--声明一个变量vrow 表1%rowtype;
begin--1.打开游标open vrows for select * from 表1;--2.取数据loopfetch vrows into vrow;exit when vrows%notfound;dbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal);end loop;close vrows;
end;

--扩展内容----使用for循环遍历游标

Oracle:>declare--声明一个游标cursor vrows is select * from 表1;
beginfor vrow in vrows loopdbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal || '工作:'|| vrow.job);end loop;
end;Oracle:>select * from 表1;

例子:--按照员工工作给所有员工涨工资,总裁涨1000,经理涨800,其他人涨400

Oracle:>declare--声明游标cursor vrows is select * from emp;--声明一个变量vrow emp%rowtype; 
begin--1.打开游标open vrows;--2.循环取数据loop--取数据fetch vrows into vrow;--退出条件exit when vrows%notfound;  --根据不同的职位,涨工资 总裁涨500,经理涨300,其他人涨200if vrow.job = 'PRESIDENT' thenupdate emp set sal = sal + 500 where empno = vrow.empno;elsif vrow.job = 'MANAGER' thenupdate emp set sal = sal + 300 where empno = vrow.empno;elseupdate emp set sal = sal + 200 where empno = vrow.empno; end if;       end loop;--3.关闭游标close vrows;--4.提交事务commit;
end;

抛出异常

语法:
declare--声明变量begin--业务逻辑exception--处理异常when 异常1 then...when 异常2 then...when others then...处理其它异常end;

   zero_divide : 除零异常
   value_error : 类型转换异常
   too_many_rows : 查询出多行记录,但是赋值给了rowtype记录一行数据变量
   no_data_found : 没有找到数据
 
   自定义异常:
       异常名  exception;
       raise 异常名        

Oracle:>declarevi number;vrow emp%rowtype;
begin--select * into vrow from emp;select * into vrow from emp where empno=1;
exceptionwhen zero_divide thendbms_output.put_line('发生了除零异常');when value_error thendbms_output.put_line('发生了类型转换异常');when too_many_rows thendbms_output.put_line(' 查询出多行记录,但是赋值给了rowtype记录一行数据变量');when no_data_found thendbms_output.put_line('没有找到数据异常');when others thendbms_output.put_line('发生了其它异常' || sqlerrm);     
end;

例子:--查询指定编号的员工,如果没有找到,则抛出自定义的异常

Oracle:>declare--声明游标cursor vrows is select * from emp where empno=1;   --声明一个记录型变量vrow emp%rowtype;--声明一个自定义异常no_emp exception;  
begin--1.打开游标open vrows;--2.取数据fetch vrows into vrow;--3.判断游标是否有数据if vrows%notfound thenraise no_emp;end if;close vrows;
exceptionwhen no_emp thendbms_output.put_line('发生了自定义的异常');
end;

存储过程: 实际上是封装在服务器上一段PLSQL代码片断,已经编译好了的代码
              1.客户端取调用存储过程,执行效率就会非常高效
         语法:

create [or replace] procedure 存储过程的名称(参数名 in|out 参数类型,参数名 in|out 参数类型)is | as--声明部分begin-业务逻辑 end; 

例子:--给指定员工涨薪,并打印涨薪前和涨薪后的工资

Oracle:>create or replace procedure proc_updatesal(vempno in number,vnum in number)
is--声明变量.记录当前工资vsal number;    
begin--查询当前的工资select sal into vsal from emp where empno = vempno;--输出涨薪前的工资dbms_output.put_line('涨薪前:'||vsal);--更新工资update emp set sal = vsal + vnum where empno = vempno;--输出涨薪后的工资dbms_output.put_line('涨薪后:'||(vsal+vnum));--提交commit;
end;--方式1
Oracle:>call proc_updatesal(1000,10);--方式2 用的最多的方式
Oracle:>declarebeginproc_updatesal(1000,100);
end;

存储函数: 实际上是一段封装是Oracle服务器中的一段PLSQL代码片断,它是已经编译好了的代码片段

语法: 
create [or replace] function 存储函数的名称(参数名 in|out 参数类型,参数名 in|out 参数类型) return 参数类型is | asbeginend;存储过程和函数的区别:1.它们本质上没有区别2.函数存在的意义是给过程调用   存储过程里面调用存储函数3.函数可以在sql语句里面直接调用4.存储过程能实现的,存储函数也能实现,存储函数能实现的,过程也能实现默认是 in       

例子:查询指定员工的年薪

Oracle:>create or replace function func_getsal(vempno number) return number
is--声明变量.保存年薪vtotalsal number;     
beginselect sal*12 + nvl(comm,0) into vtotalsal from emp where empno = vempno;return vtotalsal;
end;--调用存储函数
declarevsal number;
beginvsal := func_getsal(1000);dbms_output.put_line(vsal);
end;--查询员工的姓名,和他的年薪
select ename,func_getsal(empno) from emp;
--查询员工的姓名和部门的名称--查询指定员工的年薪--存储过程来实现
--参数: 员工编号
--输出: 年薪
Oracle:>create or replace procedure proc_gettotalsal(vempno in number,vtotalsal out number)
isbeginselect sal*12 + nvl(comm,0) into vtotalsal from emp where empno = vempno;
end;declarevtotal number;
beginproc_gettotalsal(1000,vtotal);dbms_output.put_line('年薪:'||vtotal);
end;Oracle:>select *  from emp where empno = 123; 

触发器: 当用户执行了 insert | update | delete 这些操作之后, 可以触发一系列其它的动作/业务逻辑
       作用 : 
            在动作执行之前或者之后,触发业务处理逻辑
            插入数据,做一些校验

    语法:create [or replace] trigger 触发器的名称before | afterinsert | update | delete on 表名[for each row]declarebeginend;

           触发器的分类:
           语句级触发器:   不管影响多少行, 都只会执行一次
           
           行级触发器:     影响多少行,就触发多少次
                  :old  代表旧的记录, 更新前的记录
                  :new  代表的是新的记录

--新员工入职之后,输出一句话: 欢迎

Oracle:>create or replace trigger tri_test1
after
insert
on emp
declarebegindbms_output.put_line('欢迎');
end;Oracle:>insert into emp(empno,ename) values(1,'lisi');

--数据校验, 星期6休息, 不能办理新员工入职
--在插入数据之前
--判断当前日期是否是周六
--如果是周六,就不能插入

Oracle:>create or replace trigger tri_test2
before
insert 
on emp
declare--声明变量vday varchar2(10);
begin--查询当前select trim(to_char(sysdate,'day')) into vday from dual;--判断当前日期:if vday = 'saturday' thendbms_output.put_line('星期六,不能办理入职');--抛出系统异常raise_application_error(-20001,'星期六,不能办理入职');end if;
end;Oracle:>insert into emp(empno,ename) values(2,'zhangsan');

Oracle视图

--创建一个视图
Oracle:>create or replace view 视图名 as select 表字段 from 表;--通过视图修改数据
Oracle:>update 视图名 set 字段='值' where  字段='值';--创建一个只读视图
Oracle:>create or replace view 视图名 as select 表字段 from 表 with read only;Oracle:>update 视图名 set 字段='值' where 字段='值';



             

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spectral Adversarial MixUp for Few-Shot Unsupervised Domain Adaptation论文速读

文章目录 Spectral Adversarial MixUp for Few-Shot Unsupervised Domain Adaptation摘要方法Domain-Distance-Modulated Spectral Sensitivity (DoDiSS)模块Sensitivity-Guided Spectral Adversarial Mixup (SAMix)模块 实验结果 Spectral Adversarial MixUp for F…

上海计算机学会 2023年10月月赛 乙组T3 树的连通子图(树、树形dp)

第三题:T3树的连通子图 标签:树、树形 d p dp dp题意:给定一棵 n n n个结点的树, 1 1 1号点为这棵树的根。计算这棵树连通子图的个数,答案对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007取余数。题解&#xff1…

python flask 运行本地其他的python文件

在Flask中运行其他Python文件通常意味着你想在Flask应用中调用其他Python脚本或函数。这可以通过多种方式实现,例如使用subprocess模块、导入模块或直接调用函数。 以下是一个简单的例子,演示如何在Flask路由中调用另一个Python文件中的函数&#xff1a…

HTML内联框架

前言&#xff1a; 我们有时候打开网页时会有广告窗的出现&#xff0c;而这些窗口并不是来自于本站的&#xff0c;而是来自于外部网页&#xff0c;只是被引用到了自己网页中而已。这一种技术可以通过内联来实现。 标签介绍&#xff1a; HTML 内联框架元素 (<iframe>) 表示…

快速入门Spring Data JPA

Spring Data JPA是Spring Data框架的一小部分&#xff0c;它能够让开发者能够更加简单的对数据库进行增删改查。 由于Spring Data JPA可以自动生成SQL代码所以一般情况下&#xff0c;简单的增删查改就可以交给Spring Data JPA来完成&#xff0c;而复杂的动态SQL等用MyBatis来完…

设计模式---模板方法模式

一、介绍 所谓模板方法模式&#xff0c;就是提供一种方法的模板来实现一种规范&#xff0c;其他人可以利用这个模板定义自己的逻辑。 在Java编程中的应用&#xff0c;主要就是通过接口或者抽象类来实现的&#xff0c;抽象类中可以把逻辑函数声明为final类型&#xff0c;表示不能…

即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录 一、摘要 二、创新点说明 2.1 Methodology 2.2SRU for Spatial Redundancy​编辑 2.3CRU for Channel Redundancy 三、实验 3.1基于CIFAR的图像分类 3.2基于ImageNet的图像分类 3.3对象检测 四、代码详解 五、总结 论文&#xff1a;https://openaccess.thecvf.c…

vue2/Vue3项目中,通过请求接口来刷新列表中的某个字段(如:Axios)

vue2/Vue3项目中&#xff0c;通过请求接口来刷新列表中的某个字段。可以使用 Vue 的异步请求库&#xff08;如 Axios&#xff09;来发送请求&#xff0c;并在请求成功后更新相应的字段。 示例如下&#xff08;Vue2&#xff09;&#xff1a; 简单的示例如下&#xff0c;假设列…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

jetson nx安装nomachine后无法进入linux shell

以下问题都是一个原因造成的 我在jetson nx上安装了nomachine后&#xff0c;连接时需要登陆用户名和密码&#xff0c;那这个用户名密码是什么&#xff0c;我使用系统的用户名和密码返回错误。login as a system user on this server总是failed&#xff0c;直接登录ssh输入用户…

nginx-http-flv配置

hls配置 hls配置放在 http.server里面 http {server {# HTTP监听端口listen 8002;location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias ./temp/hls; # HLS文件存放路径&#xff0c;请替换为你实际的路径expires -1;add_header Cache-Control no…

你的RPCvs佬的RPC

一、课程目标 了解常见系统库的hook了解frida_rpc 二、工具 教程Demo(更新)jadx-guiVS CodejebIDLE 三、课程内容 1.Hook_Libart libart.so: 在 Android 5.0&#xff08;Lollipop&#xff09;及更高版本中&#xff0c;libart.so 是 Android 运行时&#xff08;ART&#x…

ubuntu手动编译opencv 4.9.0遇到的问题汇总

ubuntu手动编译opencv 4.9.0遇到的问题汇总 编译流程 以4.9.0版本为例&#xff0c;可参考&#xff1a;https://docs.opencv.org/4.9.0/d2/de6/tutorial_py_setup_in_ubuntu.html 编译加速 https://blog.csdn.net/tfb760/article/details/104030841 ippicv_2021.10.0_lnx_i…

细说postgresql之pg_rman备份恢复 —— 筑梦之路

pg_rman是一款开源的备份恢复软件&#xff0c;支持在线和基于PITR的备份恢复方式。 pg_rman类似于oracle的rman&#xff0c;可以进行全量、增量、归档日志的备份。 运行模式&#xff1a; 安装部署 Releases ossc-db/pg_rman GitHub 1、需要根据PG Server的版本&#xff0c;下…

聊天机器人ChatGPT指导下的论文写作

ChatGPT无限次数:点击直达 聊天机器人ChatGPT指导下的论文写作 引言 随着人工智能技术的不断发展&#xff0c;聊天机器人在各个领域得到了广泛应用。其中&#xff0c;ChatGPT作为一个先进的自然语言处理模型&#xff0c;为各种文本生成任务提供了强大的支持。在学术界&#xf…

ThreadLocal和ThreadLocalHashMap

请直接百度详细介绍 -------------------------------------------------------------------------------------------------------------------------------- 1.ThreadLocalMap是Thread类里的一个局部变量 2.ThreadLocalMap是ThreadLocal类里的一个静态内部类, 3.ThreadL…

浅谈对称加密(AES与DES)

浅谈对称加密&#xff08;AES与DES&#xff09; 对称加密是一种加密方式&#xff0c;其中同一个密钥&#xff08;也称为私钥或共享密钥&#xff09;用于加密和解密数据。这意味着加密和解密都使用相同的密钥。对称加密速度通常很快&#xff0c;因为它不涉及复杂的数学运算。 …

10. Spring MVC 程序开发

本文源码位置: Spring-MVC 1. Spring MVC 概要 摘自Spring官方&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes …

Adobe AE(After Effects)2015下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

大创项目推荐 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…