PLSQL Day2

--8.编写一个程序,键盘输入学号,查询出对应学生姓名和所学科目数量:

declare
  no scott.student.sno%type := '&学号';
  name scott.student.sname%type;
  cnt number;
begin
  select s.sname,count(sc.cno)
  into name,cnt
  from student s left join sc 
  on s.sno = sc.sno
  where s.sno = no
  group by s.sname;
  dbms_output.put_line('姓名 '||name||': 选课数 '||cnt);
end;
--9.编写一个 PL/SQL 程序块,键盘输入员工编号,
--以计算某个雇员的年薪(假设每个月的提成固定):
declare
  no number := &员工编号;
  name char(20);
  year_sal number;
begin
  select empno,sum(sal+nvl(comm,0))*12 
  into no,year_sal
  from scott.emp
  where empno = no
  group by empno;
  dbms_output.put_line('员工编号'||no||': 年薪'||year_sal);
end;

select * from emp;


------------------------------------if - end if------------------------------------------
declare
  --声名一个变量用来存放从键盘输入的值
  v_str varchar2(20);
begin
  --从键盘输入一个颜色字符串存入变量v_str
  v_str := '&请输入一个颜色';
  --判断输入的颜色是否为red,如果是red输出它是红色,
  --如果不是输入其它颜色
  if v_str = 'red' then
    dbms_output.put_line('它是红色');
  end if;
  if v_str != 'red' then
    dbms_output.put_line('其它颜色');
  end if;
end;

------------------------------loop 先循环再判断------------------------------------------------

declare
  --声名一个变量,用来存放一个数字
  v_n number(10);  --可以在此处直接赋值
begin
  --给循环变量赋值为1 
  v_n := 1;
  --循环语句
  loop
  --循环体执行的plsql语句
    dbms_output.put_line(v_n);
  --退出循环条件
    exit when v_n = 5;
  --改变循环变量的值,保证循环不会死循环(循环控制语句)
    v_n := v_n+1;
  end loop;
end;

------------------------------while 先循环再判断------------------------------------------------

declare
  --声名一个变量,来控制循环
  v_n number(10);
begin
  --给循环变量赋值
  v_n := 1;
  --while循环语句
  while v_n < 6 loop
    --循环体语句(打印数字)
    dbms_output.put_line(v_n);
    --循环控制语句
    v_n := v_n+1;
  end loop;
end


------------------------------GOTO语句------------------------------------------------

declare
begin
  for i in 1..9 loop
    dbms_output.put_line(i);
    if i=5 then 
      goto here;
    end if;
  end loop;
    <<here>>
    dbms_output.put_line('来玩啊');
end;
------------------------------
begin  
        dbms_output.put_line('hello1');
        goto mylabel;
        dbms_output.put_line('hello2');
        dbms_output.put_line('hello3');
        <<mylabel>>
        dbms_output.put_line('hello4');
        dbms_output.put_line('hello5');
end;

------------------------------------------------------------------------------

--1.键盘接受两个值,打印比较大的值:
declare
  v1 number := &v1;
  v2 number := &v2;
begin
  if v1 > v2 
  then dbms_output.put_line(v1);
  elsif v1 < v2
  then dbms_output.put_line(v2);
  else
  dbms_output.put_line(v1||'='||v2);
  end if;
end;

--2.键盘接受三个值,并按照从小到大依次从控制台输出:

declare
  v1 number := &v1;
  v2 number := &v2;
  v3 number := &v3;
begin
  if v1 > v2 and v2 > v3 
  then dbms_output.put_line(v3 ||'<'||v2 ||'<'||v1);
  elsif v1 > v2 and v2 < v3 and v1 < v3
  then dbms_output.put_line(v2 ||'<'||v1 ||'<'||v3);
  elsif v1 > v2 and v2 < v3 and v1 > v3
  then dbms_output.put_line(v2 ||'<'||v3 ||'<'||v1);
  elsif v1 < v2 and v2 < v3 
  then dbms_output.put_line(v1 ||'<'||v2 ||'<'||v3);
  elsif v1 < v2 and v2 > v3 and v1 > v3 
  then dbms_output.put_line(v3 ||'<'||v1 ||'<'||v2);
  elsif v1 < v2 and v3 < v2 and v1 < v3 
  then dbms_output.put_line(v1 ||'<'||v3 ||'<'||v2);
  end if;
end;

-- 方法二 优解
declare
  a number;
  b number;
  c number;
  x number;
begin
  a := &输入第一个值;
  b := &输入第二个值;
  c := &输入第三个值;
  if a > b then
    x := a;
    a := b;
    b := x;
  end if;
  if a > c then
    x := a;
    a := c;
    c := x;
  end if;
  if b > c then
    x := b;
    b := c;
    c := x;
  end if;
  dbms_output.put_line(a||','||b||','||c);
end;


--3.判断一个年份是不是闰年:

  --公历年份是4的倍数,且不是100的倍数的,为闰年

  --公历年份是整百数的,必须是400的倍数,才是闰年
  
declare
  year number := &输入一个年份; 
begin
  if mod(year,4) = 0 and mod(year,100)<>0
    then   dbms_output.put_line(year||'是闰年');
  elsif mod(year,400) = 0
    then dbms_output.put_line(year||'是闰年');
  else
    dbms_output.put_line(year||'不是闰年');
  end if;    
end;

--4.体质指数(BMI)=体重(kg)÷身高^2(m)

  偏瘦  <= 18.4

  正常  18.5 ~ 23.9

  过重  24.0 ~ 27.9

  肥胖  >= 28.0

  现要求输入体重和身高,求出体质指数所在范围:
  
declare
  height number:=&"身高(m)";
  weight number:=&"体重(kg)";
  BMI number := weight / power(height,2);
begin
  case when BMI<= 18.4
       then dbms_output.put_line('偏瘦');
       when BMI between 18.5 and 23.9
       then dbms_output.put_line('正常');
       when BMI between 24.0 and 27.9
       then dbms_output.put_line('过重');
       else dbms_output.put_line('肥胖');
  end case;
end;

--5.输入一个数,判断是奇数还是偶数:
declare
  n number := &输入一个数字; 
begin
  if mod(n,2) = 0 
    then dbms_output.put_line('偶数');
  else
    dbms_output.put_line('奇数');
  end if;    
end;

--6.输入一个数,判断这个数的平方根是否大于这个数除以2的值:
declare
  n number := &输入一个数字; 
begin
  if sqrt(n) > n/2
    then dbms_output.put_line('这个数的平方根大于这个数除以2的值');
  else
    dbms_output.put_line('这个数的平方根不大于这个数除以2的值');
  end if;    
end;

--7.读入一个整数,表示一个人的年龄。

  如果小于6 岁,则输出“儿童”;

  6 岁到13 岁,输出“少儿”;

  14 岁到18 岁,输出“青少年”;

  19 岁到35 岁,输出“青年”;

  36 岁到50 岁,输出“中年”;

  50 岁以上输出“中老年”。

declare
  age number := &age;
begin
  case when age<6
       then dbms_output.put_line('儿童');
       when age between 6 and 13
       then dbms_output.put_line('少儿');
       when age between 14 and 18
       then dbms_output.put_line('青少年');
       when age between 19 and 35
       then dbms_output.put_line('青年');
       when age between 36 and 50
       then dbms_output.put_line('中年');
       else dbms_output.put_line('中老年');
  end case;
end;


--8.输入一个员工号,修改该员工的工资,如果该员工为10号部门,则工资加100元;
--若为20号部门,则工资加200元;若为30号部门,则工资加300元,否则增加500元:

select * from emp;
select * from emp_bak;
declare
  no number:=&员工号;
  dno number;
  e_sal number;
begin
  select deptno 
  into dno
  from emp
  where empno = no;
  if dno = 10
  then e_sal := 100 ;
  elsif dno = 20
  then e_sal := 200;
  elsif dno = 30
  then e_sal := 300;
  else e_sal := 500;
  end if;
  update emp_bak set sal = sal+e_sal where empno = no;
end;


--9.根据输入的员工号,修改该员工工资,如果该员工工资低于1000元,则工资加200元,
--如果工资在1000~2000元之间,则工资加150元,如果工资在2000~3000元之间,则工资加100元,否则增加50元:
select * from emp;
select * from emp_bak;
declare
  no number:=&员工号;
  e_sal number;
  money number;
begin
  select sal 
  into e_sal
  from emp
  where empno = no;
  if e_sal < 1000
  then money := 200;
  elsif e_sal between 1000 and 2000
  then money := 150;
  elsif e_sal between 2000 and 3000
  then money := 100;
  else money := 50;
  end if;
  update emp_bak set sal = sal + money where empno = no;
end;

/*(网易数据分析实习卷)好评率是会员对平台评价的重要指标。
现在需要统计2018年1月1日到2018年1月31日,用户'小明'提交的母婴类目"花王"品牌的好评率
(好评率=“好评”评价量/总评价量):

用户评价详情表:a
字段:id(评价id,主键),create_time(评价创建时间,格式'2017-01-01'), user_name(用户名称),goods_id(商品id,外键) ,
sub_time(评价提交时间,格式'2017-01-01 23:10:32'),sat_name(好评率类型,包含:“好评”、“中评”、“差评”)

商品详情表:b
字段:good_id(商品id,主键),bu_name(商品类目), brand_name(品牌名称)。
--没有数据,纯写逻辑
*/
select sum(decode(a.sat_name,'好评',1,0))/count(*)
from a join b on a.goods_id = b.good_id
where b.bu_name = '母婴' and brand_name = '花王' and user_name = '小明'
and a.sub_time between to_date('2018-01-01','yyyy-MM-dd') and to_date('2018-01-31','yyyy-MM-dd');

--10.编写一个 PL/SQL 程序块,根据员工scott入职的时间修改发放奖金列,大于等于6年则奖金为2000,小于6年的奖金是1500:
select * from emp;
select * from emp_bak;
declare
  entrydate date;
begin
  select hiredate
  into entrydate
  from emp_bak
  where ename = 'SCOTT';
  if months_between(sysdate,entrydate)>=6
    then update emp_bak set comm = 2000 where ename = 'SCOTT';
    else
    update emp_bak set comm = 1500 where ename = 'SCOTT';
    end if;
end;
--11.编写一个 PL/SQL 程序块,查询scott相应的工资级别并显示所在部门名称,薪水,和所在的工资级别:
declare
  e_sal number;
  e_grade number;
  e_dname char(10);
begin
  select d.dname,e.sal,s.grade
  into e_dname,e_sal,e_grade
  from emp e join dept d 
  on e.deptno = d.deptno
  join salgrade s 
  on e.sal between s.losal and s.hisal
  where ename = 'SCOTT';
  dbms_output.put_line(e_dname||'  '||e_sal||'  '||e_grade);
end;

--1.编写一个程序块,将emp表中雇员名全部显示出来:
begin
  for x in (select * from emp) loop
     dbms_output.put_line(x.ename);
     end loop;
end;

--2.编写一个程序块,将emp表中工资前5人的名字显示出来:
begin
  for x in ( select * from ( select e.*,row_number()over(order by e.sal desc) r from emp e) where r < 6) loop
    dbms_output.put_line(x.ename);
  end loop;
end;

--3.编写一个PL/SQL程序块,从emp表中对名字以‘A’或‘S’开始的所有雇员按他们基本薪水的10%给他们加薪:
begin
  for e in (select * from emp where ename like 'A%' or ename like 'S%') loop
    update emp_bak set sal = sal + sal*0.1 where ename = e.ename;
  end loop;
end;


--4.显示1-100之间的所有奇数(三种循环方式):
-- loop
declare
  i number := 1;
begin
  loop
    if mod(i,2) = 1
    then dbms_output.put_line(i);
    end if;
    i := i+1;
    exit when i > 100;
  end loop;        
end;

-- while
declare
  i number := 1;
begin
  while i <= 100 loop
    if mod(i,2) = 1
    then dbms_output.put_line(i);
    end if;
    i := i+1;
  end loop;        
end;
-- for
begin
  for i in 1..100 loop
    if mod(i,2) = 1
    then dbms_output.put_line(i);
    end if;
  end loop; 
end;

--5.将雇员表中的所有小于3000的工资增加400,并统计出增加工资的人数及增加的工资数量:
select * from emp;
select* from emp_bak;
declare
  n number := 0; -- 人数
  i_a number := 0; -- 工资
begin
  for e in (select * from emp where sal < 3000) loop
    n := n+1;
    i_a := i_a + 400;
    update emp_bak set sal = sal + 400 where empno = e.empno;
  end loop;
  dbms_output.put_line('增加工资的人数: '||n||',增加的工资数量为: '||i_a);
end;

--6.利用三种循环求1到100的偶数和:
-- loop
declare
  i number := 1;
  s number := 0;
begin
  loop
    if mod(i,2) = 0
    then s := s + i;
    end if;
    i := i + 1;
    exit when i > 100;
  end loop;
  dbms_output.put_line(s);
end;

-- while
declare
  i number := 1;
  s number := 0;
begin
  while i <= 100 loop
    if mod(i,2) = 0
    then s := s + i;
    end if;
    i := i + 1;
  end loop;
  dbms_output.put_line(s);
end;

-- for
declare
  s number := 0;
begin
  for i in 1..100 loop
    if mod(i,2) = 0
    then s := s + i;
    end if;
  end loop;
  dbms_output.put_line(s);
end;


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学建模论文写作文档word

目录 1. 摘要写法1.1 确定题目与方法1.2 编写开头段落1.3 填写问题一1.4 重复步骤3填写其他问题1.5 编写结尾段落1.6 编写关键词 2. 问题重述2.1 问题背景2.2 问题提出 3. 问题分析4. 问题X模型的建立与求解5. 模型的分析5.1 灵敏度分析5.2 误差分析&#xff08;主要用于预测类…

linux基础—目录和文件操作

1&#xff0c;列出目录和文件的详细信息 ls: ls -l ls -lt 2&#xff0c;认识文件 第一列 左边的一组排序中&#xff0c;第一个字符是文件的类型&#xff0c;后面9个字符是文件的权限。 第一个字符主要有3种情况&#xff1a; d表示目录、-表示文件&#xff0c;l表示链接 第…

【回溯算法经典题目解析】

1. 什么是回溯算法 回溯算法是⼀种经典的递归算法&#xff0c;通常用于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从一个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态⽆法前进时&#xff0c;回退到前⼀个状态&am…

背包问题转换

如何转换成背包问题呢&#xff0c;我们可以把每个质数当成一个重量 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;#define int long long int record[1005]; void fun() {//record[2] 1;for (int i 2; i < 1000; i) {if (!record[…

JDBC和数据库连接池

1 JDBC概述 1.1 数据持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多通过各种关系数…

鸿蒙语言基础类库:【@ohos.url (URL字符串解析)】

URL字符串解析 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

第一百四十九节 Java数据类型教程 - Java子字符串、字符串转换

Java数据类型教程 - Java子字符串 获取子字符串 我们可以使用substring()方法来获取字符串的子部分。 我们可以将开始索引作为参数&#xff0c;并返回一个从开始索引开始到字符串结尾的子串。 我们还可以将开始索引和结束索引作为参数。 它返回从开始索引开始的子字符串和小…

使用预加载库优化 PostgreSQL 函数#postgresql认证

在 POSTGRESQL 中执行函数和过程 为了理解 PostgreSQL 的工作原理&#xff0c;我们首先要看一个简单的函数调用。下一个清单显示了一些简单的PostGIS代码&#xff1a; PgSQL test# timing Timing is on. test# SELECT * FROM hans.points WHERE id 1;id │ …

【工具分享】零零信安攻击面管理平台

文章目录 00SEC-ASM™功能介绍功能演示 最近闲来无事&#xff0c;到处网上冲浪&#xff0c;无意间发现了长亭云图攻击面管理平台&#xff0c;无奈需要授权才能使用&#xff0c;于是就找到了平替&#xff1a;零零信安攻击面管理平台。 长亭云图攻击面管理平台&#xff1a;https:…

代码随想录-Day50

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

【TB作品】51单片机 Proteus仿真 00013红外proteus仿真循迹避障小车

实验报告&#xff1a;智能小车系统设计与实现 一、背景介绍 本实验旨在设计并实现一个基于STC89C52单片机控制的智能小车系统。该系统通过超声波传感器进行避障&#xff0c;通过红外接收器实现远程控制&#xff0c;同时具备循迹功能。整个系统的核心是单片机&#xff0c;它通…

初识c++(命名空间,缺省参数,函数重载)

一、命名空间 1、namespace的意义 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全 局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名 冲突…

python对象

类 我们目前所学习的对象都是Python内置的对象但是内置对象并不能满足所有的需求&#xff0c;所以我们在开发中经常需要自定义一些对象类&#xff0c;简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象类就是对象的图纸&#xff01;我们也称对象是类的实例&#…

caeses软件许可优化解决方案

Caeses软件介绍 CAESES是一款十分很不错的三维建模仿真的软件。它功能很大、优化效率高、可以自动化优化、分析工具快速 CAESES拥有多种不同的试验设计及单目标、多目标优化算法&#xff0c;能够根据仿真计算评估的结果。软件可以帮助用户轻松的打造出自各种船舶、汽车、航空航…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

1-3分钟爆款视频素材在哪找啊?这9个热门爆款素材网站分享给你

在如今快节奏的时代&#xff0c;短视频已成为吸引观众注意力的黄金手段。然而&#xff0c;要制作出1-3分钟的爆款视频&#xff0c;除了创意和剪辑技巧外&#xff0c;选择合适的素材至关重要。那么&#xff0c;哪里可以找到那些能让你的视频脱颖而出的爆款素材呢&#xff1f;不用…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-1.引言

今年早些时候&#xff0c;2月份举办的全球计算机存储顶会USENIX FAST 2024&#xff0c;最佳论文来自阿里云&#xff0c;论文名称《What’s the Story in EBS Glory: Evolutions and Lessons in Building Cloud Block Store》 &#xff0c;论文详尽地探讨了阿里云在过去十年中开…

ASAN排查程序中内存问题使用总结

简介 谷歌有一系列Sanitizer工具&#xff0c;可用于排查程序中内存相关的问题。常用的Sanitizer工具包括&#xff1a; Address Sanitizer&#xff08;ASan&#xff09;&#xff1a;用于检测内存使用错误。Leak Sanitizer&#xff08;LSan&#xff09;&#xff1a;用于检测内存…

YOLOv9:一个关注信息丢失问题的目标检测

本文来自公众号“AI大道理” 当前的深度学习方法关注的是如何设计最合适的目标函数&#xff0c;使模型的预测结果最接近地面的真实情况。同时&#xff0c;必须设计一个适当的体系结构&#xff0c;以方便获取足够的预测信息。 现有方法忽略了一个事实&#xff0c;即输入数据在逐…