存储过程解析

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(使用前将#替换为@)

存储过程解析 的相关文章

  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • 使用 Greasemonkey 时存储数据

    使用 Greasemonkey 时是否有存储大量数据的好方法GM setValue只是没有削减它 那么这里有一些选项 设置服务器来保存数据 对于用户 并使用 xhr 来 创建 编辑 删除数据 谷歌应用程序 发动机 GAE http code
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 如何在 PostgreSQL 中将数据库从一台服务器移动到另一台服务器?

    我正在尝试将数据库从旧服务器移动到新服务器 任何帮助 将不胜感激 Just pipe http www postgresql org docs current interactive migration html从旧服务器转储到新服务器 p
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀“N”?

    如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀 N 例如 给定这个变量 declare Query1 nvarchar max 我可以这样分配它 set Query1 N 但是如果我想使用怎么办
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • fetchsize和batchsize对Spark的影响

    我想通过以下方式控制 RDB 的读写速度Spark直接 但标题已经透露的相关参数似乎不起作用 我可以得出这样的结论吗fetchsize and batchsize我的测试方法不起作用 或者它们确实会影响阅读和写作方面 因为测量结果基于规模是
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com

随机推荐

  • 小白入门脑电信号

    是个脑电信号研究小白 今年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