存储过程解析

2023-11-01

 

  • 使用存储过程来解决涨工资
    • 涨工资,总裁涨1000,经理涨800,其他人涨400。

伪代码:

ResultSet rs = “select empno,job from emp”;

While(rs.next()){

Int eno = rs.getInt(“empno”);

String job = rs.getString(“job”);

If(“PRESIDENT”.equals(job))

{

       update emp set sal = sal+1000;

}else if(“Manager”.equals(job))

{

       update emp set sal = sal+800;

}else

{

       update emp set sal = sal+400;

}

}

分析:那么上面这样的一个过程,使用存储过程(PL/SQL)就可以轻松解决。可以写很少的java代码。

①.查询emp表:7839的姓名和薪水并打印.

declare

pename emp.ename%type;

psal emp.sal%type;

begin

--得到7839的姓名和薪水

select ename,sal into pename,psal from emp where empno = 7839;

dbms_output.put_line(pename||'的薪水是'||psal);

end;

运行结果:KING的薪水是5000

②.使用记录型变量

记录型变量:取这个表里面的一行作为我们的这个类型,那么一行有多个列,那么就有多个类型,相当于一个数组。

多个数据类型作为的我们的数据类型。

set serveroutput on

declare

  emp_rec emp%rowtype;

  begin

  select * into  emp_rec from emp where empno=7839;

  dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);

  end;

 /

③.从键盘接收一个数字(使用PL/SQL判断输入输出数字)

set serveroutput on

accept num prompt '请输入一个数字';

declare

  pnum number :=#

  begin

  if pnum = 0 then dbms_output.put_line('你输入的数字是0');

  elsif pnum = 1 then dbms_output.put_line('你输入的数字是1');

  else dbms_output.put_line('其他数字');

  end if;

  end;

  /

运行结果:你输入的数字是1

④.输出1~10的数字

set serveroutput on

 declare

   pnum number :=1;

   begin

 loop

  exit when pnum>10;

 dbms_output.put_line(pnum);

  pnum := pnum+1;

  end loop;

end;

  • 光标的使用

光标的作用:用于存储一个查询返回的多行数据。

①.查询所有人的薪水:

set serveroutput on

declare

cursor cemp is select ename,sal from emp;

pename emp.ename%type;

psal emp.sal%type;

begin

  open cemp;

  loop

  fetch cemp into pename,psal; 

  exit when cemp%notfound;

  dbms_output.put_line(pename||'的薪水是'||psal); 

  end loop;

end;

运行结果:

SMITH的薪水是800

ALLEN的薪水是1600

WARD的薪水是1250

JONES的薪水是2975

MARTIN的薪水是1250

BLAKE的薪水是2850

CLARK的薪水是2450

SCOTT的薪水是3000

KING的薪水是5000

TURNER的薪水是1500

ADAMS的薪水是1100

JAMES的薪水是950

FORD的薪水是3000

MILLER的薪水是1300

②.使用光标:涨工资,总裁涨1000,经理涨800,其他人涨400

set serveroutput on

declare

cursor cemp is select empno,job[h1]  from emp;

pno emp.empno%type;

pjob emp.job%type;

begin

  open cemp;

  loop

    fetch cemp into pno,pjob;

    exit when cemp%notfound; 

     -- 判断职位

  if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pno;

  elsif pjob='MANAGER' then update emp set sal=sal+800 where empno=pno;

  else update emp set sal = sal +400 where empno=pno;

  end if;

  end loop;

  close cemp;

end;

③.定义带参数的光标(查询并打印某个部门中员工的姓名)

set serveroutput on

declare

 cursor cemp(dno number) is select ename from emp where empno = dno;

 pname emp.ename%type;

begin

open cemp(7369);//传递参数7369

loop

  fetch cemp into pname;

  exit when cemp%notfound; 

  dbms_output.put_line(pname);

end loop;

close cemp;

end;

运行结果:

SMITH

④.查询并打印30号部门员工姓名。

  declare

  cursor cemp(dno number) is select ename from emp where deptno = dno;

  dename emp.ename%type;

  begin

    open cemp(30);

    loop

      fetch cemp into dename;

      exit when cemp%notfound;

      dbms_output.put_line(dename);

    end loop;

    close cemp;

    end;

 

⑤.为部门号为10的员工涨工资

declare

  cursor cemp(dno number) is select deptno from emp where deptno = dno;

  dempno emp.deptno%type;

  begin

    open cemp(10);

    fetch cemp into dempno;

    update emp set sal= sal*1.1 where deptno=dempno;

    close cemp;

  end;

  • 例外的使用
  • 被0除例外

declare

  pnum number;

  begin

    pnum := 1/0;

    exception

      when zero_divide then dbms_output.put_line('1:0不能做被除数');

      dbms_output.put_line('2:0不能做被除数');

      when value_error then dbms_output.put_line('算数或者替换错误');

      when others then dbms_output.put_line('其他例外');

  end;

运行结果:

1:0不能做被除数

2:0不能做被除数

  • 查询并打印50号部门的员工姓名(测试异常:原因:数据表里面没有50号部门)

declare

  cursor cemp is select ename from emp where deptno=50[h2] ;

  pename emp.ename%type; 

  no_emp_found[h3]  exception;

  begin

    open cemp;

    fetch cemp into pename;

    if cemp%notfound then    

      raise no_emp_found[h4] ;

    end if;

    close cemp;   

    exception

      when no_emp_found[h5]  then dbms_output.put_line('没有找到员工');

      when others then dbms_output.put_line('其他例外');

end;

运行结果:

没有找到员工

  • 存储过程存储函数

 


 [h1]必须是数据库的字段列名。

 [h2]由于数据库没有部门号50这个部门,那么就会抛出异常,我们这里手动自定义一个异常,然后抛出,然后再下面捕获。

 [h3]定义异常

 [h4]抛出异常

 [h5]捕获异常

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储过程解析 的相关文章

  • 从java运行sqlplus脚本的简单方法

    我有包含 sqlplus 特定脚本的 sql 文件 它包括 或 作为语句终止符 执行存储过程的 EXEC 等 我需要从 java jdbc 执行此脚本 而不需要 sqlplus sql ant任务 maven sql插件无法处理不同的终止符
  • 您可以在不是在 Google 协作平台下创建的网站上使用 Google 脚本吗? [复制]

    这个问题在这里已经有答案了 Google 脚本有一种方法可以嵌入到 Google 网站中 但我想知道是否可以在非 Google 托管的网站上使用 Google 脚本 此 google 脚本的目的是作为 Javascript 的简单替代方案
  • 如何按关系的数量或成员对 Doctrine DQL 查询进行排序?

    我正在尝试创建一个查询 用于从 Doctrine 数据库中检索对象 并按特定一对多关系的成员数量排序 更具体地说 我有两个实体 Person 和 Federation 一个人可以是一个联盟的成员 人具有 联盟 关系 并且一个联盟可以有n人
  • 将逗号分隔的主数据替换为列中的描述

    有 2 个 SQL Server 表 Products Name Status Code Product 1 1001 1003 Product 2 1001 1005 1006 Status Code Description 1001 S
  • 如何在 Sequelize 现有模型中添加列?

    我使用此命令添加了模型和迁移文件 node modules bin sequelize model generate name User attributes firstName string lastName string email s
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • 处理大数据表时应该如何使用Hibernate Mapping

    问题定义 我有一个包含大量数据 超过 100 000 行 的数据库表 表结构如下 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个 applicationID 可能有数千个文档
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 如何插入包含“&”的字符串

    如何编写包含 字符的插入语句 例如 如果我想将 J J Construction 插入数据库的列中 我不确定这是否有什么不同 但我正在使用 Oracle 9i 我总是忘记这一点 然后又回到它 我认为最好的答案是迄今为止提供的答复的组合 首先
  • 火鸟删除速度很慢

    我正在做这个简单的交易 DELETE FROM ominve01 WHERE CVE OBS IN SELECT CVE OBS FROM minve01 M WHERE M FECHA DOCU lt 31 12 2010 OR FECH
  • IN 运算符对 SQL 查询性能的影响有多大?

    我的 SQL 查询需要 9 个小时才能执行 见下文 Select Field1 Field2 From A Where Field3 IN 45 unique values here 当我将此查询拆分为 3 个完全相同的查询 仅每个 IN
  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • 更高效的 LINQ 查询

    有人可以帮我将此查询循环变成高效的 Linq 查询吗 我将其加载到 TreeView 中 因此必须附加每个项目 包含也非常低效 延迟加载项目也不起作用 事实上 这个查询访问数据库的次数比应有的要多 public IQueryable
  • 重命名猫鼬中的字段[重复]

    这个问题在这里已经有答案了 我有两个 JSON 对象 每个对象都有一个名字字段 我想将名字重命名为名称 还想使用猫鼬将现有的名字值导入到名称 Schema const mongoose require mongoose const Sche
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • 如何在sql server 2008R2中将单个单元格拆分为多个列?

    我想将每个名称拆分为各个列 create table split test value integer Allnames varchar 40 insert into split test values 1 Vinoth Kumar Raj
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • 在 Oracle 中如何将多行组合成逗号分隔的列表? [复制]

    这个问题在这里已经有答案了 我有一个简单的查询 select from countries 结果如下 country name Albania Andorra Antigua 我想在一行中返回结果 如下所示 Albania Andorra
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • 小白入门脑电信号

    是个脑电信号研究小白 今年3月下旬临时换了研究方向 到现在也看了不少论文 试过一些特征提取的代码还有分类的代码 现在也想总结一下这段时间所学的东西 算是做个中期回顾吧 Ps 里面的特征提取的代码以及分类的代码均不是我所写的 后面会附上链接
  • ReactNative WebView组件详解

    源码传送门 在开发Android的时候 一般我们会有一些加载网页的需求 或者执行一些JavaScript 我们都知道在Android中实现这个功能的控件是WebView 在ReactNative中也有实现此类需求额的组件 它的名字也是Web
  • C++:STL:常用算法(下):拷贝,算术,集合算法

    一 常用拷贝和替换算法 学习目标 掌握常用的拷贝和替换算法 算法简介 copy 容器内指定范围的元素拷贝到另一容器中 replace 将容器内指定范围的旧元素修改为新元素 replace if 容器内指定范围满足条件的元素替换为新元素 sw
  • SC不是内部命令或外部命令

    CMD中 输入SC命令或注册odbc时 系统提示sc不是内部或外部命令 解决方法如下 右击我的电脑 点击属性 gt 高级 gt 环境变量 在弹出的新窗口下的系统变量中找到Path 点击编辑 在变量值一行最后添加以下内容 SystemRoot
  • openstack nova 命令行指令大全

    来自官方文档 nova absolute limits Print a list of absolute limits for a user actions Retrieve server actions add fixed ip Add
  • 对抗样本 - 提高机器学习模型的性能

    20200827 0 引言 今天编写文章 DGA生成与检测 论文 DeepDGA Adversarially Tuned Domain Generation and Detection 阅读 时 那篇论文最后的实验中提到了增强机器学习模型的
  • Hasura GraphQL Engine 存在远程命令执行漏洞

    文章目录 Hasura GraphQL Engine 存在远程命令执行漏洞 1 Hasura GraphQL Engine 简介 2 漏洞描述 3 影响版本 4 fofa查询语句 5 漏洞复现 6 POC EXP 7 整改意见 8 往期回顾
  • 【java学习】EasyExcel的简单使用

    EasyExcel的简单使用 前言 Excel读 1 实体类 2 读监听器与测试类 3 输出结果 Excel写 1 实体类 2 写入Excel的测试类 3 输出结果 填充Excel 1 Excel模板 2 测试类 3 输出结果 前言 Eas
  • JAVA之Thread类

    一 主线程 主线程 执行主方法的线程 main JVM执行main main 会进入到栈内存 JVM会找操作系统开辟一条main方法通向CPU的执行路径 CPu就可以通过这个路径来执行main方法 而这个路径就叫做主 main 线程 单线程
  • pptpd配置参数详解

    在LINUX下搭建PPTPD服务器主要有3个配置文件 分别如下 etc pptpd conf 主配置文件 debug 把所有的debug信息写入系统日志 var log messages option etc ppp options ppt
  • Hadoop是小象——YARN / Split&Block

    了解Hadoop架构 Hadoop可运行于一般的商用服务器上 具有高容错 高可靠性 高扩展性等特点 特别适合写一次 读多次的场景 其架构如下 HDFS 分布式文件存储 可靠性由心跳机制和冗余提供 YARN 分布式资源管理 MapReduce
  • mysql jdbcurl配置_jdbc的URL配置

    Microsoft SQL Server Microsoft SQL Server JDBC Driver 一般用来连接 SQLServer 2000 驱动程序包名 msbase jar mssqlserver jar msutil jar
  • 【金融申请评分卡】目标变量界定

    一 目标变量是什么 目标变量就是假定申请客户的好坏 逻辑回归公式里的Y 先来看下逻辑回归公式 y 11 e z y 1 1 e z
  • c++入门到精通教程 c++11/14/17-王健伟-专题视频课程

    c 入门到精通教程 c 11 14 17 528人已学习 课程介绍 本教程适合那些只有一点点c语言编程知识的新手 也适合那些c 98标准已经掌握的不错但对c 11 14 17新标准基本无所知的c 开发老手 欢迎大家尽早加入学习 请大家从授课
  • 网络流媒体(七)———RTSP

    RTSP协议介绍 RTSP协议的一些分析 一 一些字符串函数的使用 RTSP协议的一些分析 二 printf类似函数 sscanf以及log保存到内存中 printf输入重定位 1 简介 DSP产生的媒体流需要通过网络传送到客户端 如图1
  • python编程遵循哪些规律_Python实操(3):python编程规范

    选择pythoncharm作为Python开发ide也是在网上查了好长时间 这两天了解到visual studio code强大 易用 同时也一直用visual studio做c c 开发 所以决定把以后的开发平台切换到微软系 换平台以后发
  • 前后端分离:SpringBoot项目部署服务器操作步骤详细

    部署后端 SpringBoot到服务器 首先就是对自己项目application yaml进行配置 此处使用过多mysql8 0 spring datasource url jdbc mysql 127 0 0 1 3306 book se
  • 计算机网络笔记and题解

    上次博客就写了一点划分子网和子网掩码相关的计算 然后还要一个重要的五分类编址CIDR 也就是构造超网 无分类编址CIDR Classless Inter Domain Routing 正式名字是无分类域间路由选择 特点 1 CIDR消除了传
  • 秒级数据转化为分钟级数据sql编写

    前言 利用python读取hive 将hive中秒级数据转化为以10分钟为间隔的数据 除时间与设备id外所有字段的值求平均值 代码 连接hive 创建连接通道 并且得到连接通道的钥匙 句柄 conn connect host 地址 port
  • 存储过程解析

    使用存储过程来解决涨工资 涨工资 总裁涨1000 经理涨800 其他人涨400 伪代码 ResultSet rs select empno job from emp While rs next Int eno rs getInt empno