学习大数据DAY14 PLSQL基础语法3

news2024/9/26 5:16:45

目录

二重循环 三种循环随便嵌套

exit continue return

作业

数据提取

游标

隐式游标

显示游标

动态游标

游标使用流程

游标属性

游标配合循环使用示例

作业2

参数游标

current of 语句

作业3


PLSQL基础语法(三)

二重循环 三种循环随便嵌套

begin

for n in 1..10

loop

dbms_output.put_line(n);

for j in 1..5

loop

dbms_output.put('*');

end loop;

dbms_output.put_line(null);

end loop;

end ; 

exit continue return

1.EXIT:只能用于循环中,并且只是退出本次循环,继续执行下一条外层循环数据

2.RETURN:可以用于循环和非循环中:退出整个BEGIN...END,且不往下执行

3.CONTINUE:退出本次循环,直接进入下一次循环

--一重循环

begin

for i in 1 .. 10

loop

if i=1 then

continue;

end if;

if i=8 then

dbms_output.put('发财咯');

exit;

end if;

dbms_output.put_line(i);

end loop;

dbms_output.put_line('');

end;

--二重循环

begin

for i in 1 .. 5

loop

if i=3 then continue;

end if;

if i=4 then exit;

end if;

dbms_output.put_line(i);

for j in 1..5

loop

if j=3 then

continue;

end if;

if j=4 then

--exit;

return;

end if;

dbms_output.put_line(j);

end loop;

end loop;

end;

作业

--1、99乘法表

declare

a number(10);

b number(10);

begin

  for a in 1 .. 9

    loop

      for b in 1 .. a

        loop

          dbms_output.put(b||'*'||a||'='||(a*b)||' '); 

          end loop;

          dbms_output.put_line(null); 

      end loop;

  end;

--2、拼接一个直角三角形

begin

  for i in 1 .. 9

    loop

      for j in 1 .. 2*i-1

        loop

          dbms_output.put('*'); 

          end loop;

          dbms_output.put_line(null); 

      end loop;

  end;

--3、上个练习基础上拼接一个等腰三角形

begin

  for i in 1 .. 9

    loop

      for j in 1 .. (8+i)

        loop

          if j between 9-i+1 and 9+i-1

            then

            dbms_output.put('*');

            else

            dbms_output.put(' ');  

            end if;

          end loop;

          dbms_output.put_line(null); 

      end loop;

  end;

--4、上个练习基础上拼接一个菱形

begin

  for i in 1 .. 9

    loop

      for j in 1 .. (8+i)

        loop

          if j between 9-i+1 and 9+i-1

            then

            dbms_output.put('*');

            else

            dbms_output.put(' ');  

            end if;

          end loop;

          dbms_output.put_line(null); 

      end loop;

    for k in 1 .. 8

      loop

        for m in 1 .. 17-k

          loop

            if m between 1+k and 17-k

              then

                dbms_output.put('*');

                else

                  dbms_output.put(' ');  

                  end if;

            end loop;

            dbms_output.put_line(null); 

        end loop;

  end;

  

/*5、打印输出100至200之间的全部素数,输出素数并统计共有多少个素数。

注:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身

外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;

否则称为合数。*/

declare

PrimeCount number(10):=0;

begin

  for i in 100 .. 200

    loop

      for j in 2 .. floor(i/2)

        loop

        if mod(i,j)=0

          then exit;

          end if;

        if j=floor(i/2)

          then

            dbms_output.put_line(i); 

            PrimeCount:=PrimeCount+1;

            end if;

            end loop;

      end loop;

      dbms_output.put_line('共有'||PrimeCount||'个素数'); 

  end;

数据提取

游标

游标是一种从表中检索数据并进行操作的灵活手段,游标主要用在服务器上,处理由客户端发送给服务端的sql语句,或是批处理、存储过程、触发器中的数据处理请求。游标的优点在于它可以定位到结果集中的某一行,并可以对该行数据执行特定操作。作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式仍然无法实现某些查询的时候用游标来实现。

隐式游标

通过一个简单直接的select...into 语句提取一行数据,并放在一个局部变量中。

显示游标

在声明单元declare中明确的声明一个查询。这样我们就可以在一个或者多个程序中打开游标并从中提取数据,可以得到隐式游标所没有的空值颗粒。

动态游标

使用游标变量(用ref cursor 类型声明),我们可以把指向一个查询结果集的指针从一个程序传递到另一个程序,从而提供了另一层灵活性。任何程序只需要访问这个变量,就可以打开游标提取数据.

游标使用流程

声明游标

cursor 游标名称 is sql语句;

打开游标

open 游标名称;

提取数据

fetch 游标名称 into 记录名;

关闭游标

close 游标名称;

--提取dept部门编号和部门名称

declare

cursor cur_dept is select * from dept;

v_dept cur_dept%rowtype;

begin

open cur_dept;

fetch cur_dept into v_dept;

dbms_output.put_line(v_dept.deptno||v_dept.dname);

fetch cur_dept into v_dept;

dbms_output.put_line(v_dept.deptno||v_dept.dname);

fetch cur_dept into v_dept;

dbms_output.put_line(v_dept.deptno||v_dept.dname);

fetch cur_dept into v_dept;

dbms_output.put_line(v_dept.deptno||v_dept.dname);

close cur_dept;

end; 


游标属性

游标配合循环使用示例

declare

cursor cur_dept is select * from dept; --声明游标

v_dept cur_dept%rowtype; --声明游标变量

begin

open cur_dept; --打开游标

if cur_dept%isopen then

loop --开始循环

fetch cur_dept into v_dept; --抓取

exit when cur_dept%notfound; --循环边界

dbms_output.put_line(cur_dept%rowcount||'--'||v_dept.deptno||v_dept.dname); --打印

end loop;

close cur_dept; --关闭游标

end if;

end;

--while循环

declare

cursor cur_dept is select * from dept; --声明游标

v_dept cur_dept%rowtype; --声明游标变量

begin

open cur_dept; --打开游标

fetch cur_dept into v_dept; --抓取

while cur_dept%found

loop --开始循环

dbms_output.put_line(v_dept.deptno||v_dept.dname); --打印

fetch cur_dept into v_dept;

end loop;

close cur_dept; --关闭游标

end; 

--for 会自动打开关闭游标

declare

cursor cur_dept is select * from dept ; --声明游标

begin

for v_dept in cur_dept

loop --开始循环

dbms_output.put_line(cur_dept%rowcount||'--'||v_dept.deptno||v_dept.dname); --打印

end loop;

end;

作业2

-1、提取emp表的姓名和工资,显示游标序号,使用两种循环完成游标遍历输出 while for

--方法一

declare

cursor enamesal is select * from emp;

v_emp emp%rowtype;

begin

  open enamesal;

  fetch enamesal into v_emp;

  while enamesal%found

    loop

      dbms_output.put_line(v_emp.ename||' '||v_emp.sal||' '||enamesal%rowcount);

      fetch enamesal into v_emp;

      end loop;

   close enamesal; 

  end;

--方法二(超好用)

declare

cursor enamesal is select * from emp;

begin

  for i in enamesal

    loop

      dbms_output.put_line(i.ename||' '||i.sal||' '||enamesal%rowcount); 

      end loop;

  end;

--2、上题基础上对员工表2-4条数据输出,for循环实现

declare

cursor enamesal is select * from emp; 

begin

  for i in enamesal

    loop

      if enamesal%rowcount between 2 and 4

        then

        dbms_output.put_line(i.ename||' '||i.sal||' '||enamesal%rowcount); 

        end if;

      end loop;

  end;

参数游标

cursor 游标名称(参数名称 in 参数数据类型 :=默认值 ) is sql语句

open 游标名称(参数)

只有open需要加参数,其他直接使用游标名称

--简单输入

declare

cursor cur_emp is select * from emp where deptno=&部门编号;

begin

for v_emp in cur_emp

loop

dbms_output.put_line(v_emp.ename);

end loop;

end; 

--传入参数for循环

declare

cursor cur_emp(deptin number :=20) is select * from emp where deptno=deptin;

dno number(4);

begin

select max(deptno) into dno from emp;

for v_emp in cur_emp(dno)

loop

dbms_output.put_line(v_emp.ename||v_emp.deptno);

end loop;

end;

--传入参数while循环

declare

cursor cur_emp(deptin number :=20) is select * from emp where deptno=deptin;

v_emp cur_emp%rowtype;

dno number(4);

begin

select max(deptno) into dno from emp;

open cur_emp(dno);

fetch cur_emp into v_emp;

while cur_emp%found

loop

dbms_output.put_line(v_emp.ename||v_emp.deptno);

fetch cur_emp into v_emp;

end loop;

close cur_emp;

end; 

--二重循环传入参数for循环

declare

cursor cur_dept is select * from dept ;

cursor cur_emp(deptin number) is select * from emp where deptno=deptin;

begin

for v_dept in cur_dept

loop

dbms_output.put_line(v_dept.deptno||'---'||v_dept.dname);

for v_emp in cur_emp(v_dept.deptno)

loop

dbms_output.put_line(' '||v_emp.ename||'-'||v_emp.job||'-'||v_emp.sal);

end loop;

end loop;

end;

--二重循环传入参数while循环

declare

cursor cur_dept is select * from dept ;

cursor cur_emp(deptin number) is select * from emp where deptno=deptin;

v_emp cur_emp%rowtype;

begin

for v_dept in cur_dept

loop

dbms_output.put_line(v_dept.deptno||'---'||v_dept.dname);

open cur_emp(v_dept.deptno);

fetch cur_emp into v_emp;

while cur_emp%found

loop

dbms_output.put_line(' '||v_emp.ename||'-'||v_emp.job||'-'||v_emp.sal);

fetch cur_emp into v_emp;

end loop;

close cur_emp;

end loop;

end; 

current of 语句

通过where current of 语句进行数据更新或删除就可以直接修改最后取出的数据行,而不用再写判断条件了。该语法无法和returning 语句一起使用。

update 表名 set 列名= where current of 游标名;

示例

declare

cursor cur_emp is select * from emp where deptno='20' and sal<5000 for update;

begin

for  v_emp in cur_emp

loop

--update emp set sal=8000 where deptno='20' and sal<5000;

update emp set sal=8000 where current of cur_emp;

end loop;

end;

作业3

--1、寻找每个sc表中分数大于平均分数的考试的信息,显示学生编号,课程编号,分数

select sno,cno,score

from sc

where score>(

select avg(score) from sc

);

--2、使用游标获取每个老师所教授课程的课程名称以及平均成绩,二重循环实现

declare

cursor v_teacher is select tno,tname

from teacher;

cursor v_course(tt teacher.tno%type) is select cname,nvl2(avg(score),to_char(avg(score)),'没有成绩')  avgsc

from course left join sc on course.cno=sc.cno where tno=tt

group by cname;

begin

  for i in v_teacher

    loop

      dbms_output.put_line(i.tno||'--'||i.tname);

      for j in v_course(i.tno)

        loop

            dbms_output.put_line('     '||j.cname||'---'||j.avgsc); 

          end loop;

      end loop;

end;

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

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

相关文章

threadLocal详细认识(使用场景与局限性)与样例测试

Threadlocal的介绍与使用 1&#xff0c;是什么&#xff1f; ThreadLocal 是 Java 提供的一个工具类&#xff0c;用于在多线程环境中为每个线程提供独立的变量副本。它是 Java 标准库中的一部分&#xff0c;提供了线程局部存储的功能&#xff0c;这意味着每个线程都有自己独立…

【安全设备】APT攻击预警平台

一、什么是APT 高级持续性威胁&#xff08;APT&#xff09;是一种高度复杂和长期的网络攻击&#xff0c;旨在通过持续监视和访问特定目标来窃取敏感信息或进行其他恶意活动。这种攻击结合了多种先进的技术手段和社会工程学方法&#xff0c;以极高的隐蔽性实现长期潜伏和信息窃…

2 文件

2 文件 1、文件系统1.1 文件系统的逻辑结构1.2 文件的访问流程 2、文件类型3、文件的打开与关闭4、文件的内核结构5、文件的读写4.1 顺序与随机读写4.2 文件描述符的复制4.3 访问测试4.4 修改文件大小 5、文件锁5.1 读写冲突5.2 文件锁5.3 文件锁的内核结构 6、文件的元数据7、…

MTK Camera 冷启动、前后摄切换性能优化分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、背景二、问题分解三、工具分析四、 traceView教程五、surface create优化六、systrace的教程七、优化方案八、前后切换速度优化九、优化方案十、热…

旷野之间4 - 100 个 Kubernetes 面试问题及答案

100 个 Kubernetes 面试问题及答案 Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes 是一个开源容器编排平台&#xff0c;可自动部署、扩展和管理容器化应用程序。 什么是容器&#xff1f; 容器是一个轻量级、独立的、可执行软件包&#xff0c;其中包含运行应用…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由撤销)

6、路由撤销 ISIS路由协议的路由信息是封装在LSP报文中的TLV中的&#xff0c;但是它对撤销路由的处理和OSPF的处理方式类似。 在ISIS中撤销一条路由实则是将接口下的ISIS关闭&#xff1a; 撤销内部路由&#xff1a; 在ISIS中路由信息是由IP接口TLV和IP内部可达性TLV共同来描…

游戏AI的创造思路-技术基础-决策树(2)

上一篇写了决策树的基础概念和一些简单例子&#xff0c;本篇将着重在实际案例上进行说明 目录 8. 决策树应用的实际例子 8.1. 方法和过程 8.1.1. 定义行为 8.1.2. 确定属性 8.1.3. 构建决策树 8.1.4. 实施行为 8.1.5. 实时更新 8.2. Python代码 8. 决策树应用的实际例子…

hudi数据湖万字全方位教程+应用示例

1、时间轴&#xff08;TimeLine&#xff09; Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08;timeline&#xff09;&#xff0c;这有助于提供表的即时视图 一个instant由以下三个部分组成&#xff1a; 1&#xff09;…

YOLOv10改进 | Conv篇 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)

一、本文介绍 本文给大家带来的改进机制是RCS-YOLO提出的RCS-OSA模块&#xff0c;其全称是"Reduced Channel Spatial Object Attention"&#xff0c;意即"减少通道的空间对象注意力"。这个模块的主要功能是通过减少特征图的通道数量&#xff0c;同时关注空…

Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法

一直都是通过OkHttp远程服务端进行数据交互&#xff0c;突发奇想能不能也通过OkHttp在局域网的情况下对两个安卓设备或者手机进行数据交互呢&#xff1f; 这样一方安卓设备要当做服务端与另一个安卓设备通过OkHttp进行数据交互即可 当然还可以通过 socket 和 ServerSocket 通…

IC后端设计中的shrink系数设置方法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 在一些成熟的工艺节点通过shrink的方式(光照过程中缩小特征尺寸比例)得到了半节点,比如40nm从45nm shrink得到,28nm从32nm shrink得到,由于半节点的性能更优异,成本又低,漏电等不利因素也可以…

旷野之间5 - AI基础代理决策的范式转变

介绍 让我们来谈谈最近在人工智能领域引起轰动的一件事——基础代理及其彻底改变我们所知的决策的潜力。现在,我知道你可能会想,“另一天,又一个人工智能突破,乏味无趣。”但相信我,这是一个改变游戏规则的突破,值得你关注。 如果您一直在关注人工智能和人工智能代理的…

JupyterNotebook中导出当前环境,并存储为requirements.txt

​使用Anaconda管理Python环境时&#xff0c;可以轻松地导出环境配置&#xff0c;以便在其他机器或环境中重新创建相同的环境。可以通过生成一个environment.yml文件实现的&#xff0c;该文件包含了环境中安装的所有包及其版本。但是&#xff0c;常常在一些课程中JupyterNotebo…

synchronized关键字详解(全面分析)

目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结&#xff1a; 3、synchronized底层原理&am…

记录些Redis题集(1)

为什么Redis要有淘汰机制&#xff1f; 淘汰机制的存在是必要的&#xff0c;因为Redis是一种基于内存的数据库&#xff0c;所有数据都存储在内存中。然而&#xff0c;内存资源是有限的。在Redis的配置文件redis.conf中&#xff0c;有一个关键的配置项&#xff1a; # maxmemory…

vue3<script setup>自定义指令

main.ts // 自定义指令 app.directive(color,(el,binding) > {el.style.color binding.value })这段代码定义了一个名为color的自定义指令&#xff0c;并将其注册到Vue应用实例app上。自定义指令接收两个参数&#xff1a;el和binding。el是绑定指令的元素&#xff0c;而bi…

240711_昇思学习打卡-Day23-LSTM+CRF序列标注(2)

240711_昇思学习打卡-Day23-LSTMCRF序列标注&#xff08;2&#xff09; 今天记录LSTMCRF序列标注的第二部分。仅作简单记录 Score计算 首先计算正确标签序列所对应的得分&#xff0c;这里需要注意&#xff0c;除了转移概率矩阵&#x1d40f;外&#xff0c;还需要维护两个大小…

解决鸿蒙开发中克隆项目无法签名问题

文章目录 问题描述问题分析解决方案 问题描述 在一个风和日丽的早晨&#xff0c;这是我学习鸿蒙开发的第四天&#xff0c;把文档过了一遍的我准备看看别人的项目学习一下&#xff0c;于是就用git去clone了一个大佬的开源项目&#xff0c;在签名的时候遇到了问题&#xff1a; h…

Codeforces Round 957 (Div. 3)(A~E题解)

这次比赛只能用抽象来形容&#xff0c;前五道题都没有什么算法&#xff0c;都是思维加模拟都能过&#xff0c;然后第四题卡住了&#xff0c;第五题不知道为什么做出来的人那么少&#xff0c;就是纯暴力就能过&#xff0c;但是没抓住上分的机会&#xff0c;有些可惜&#xff0c;…

Pytorch(笔记8神经网络nn)

1、nn.Module torch.nn是专门为深度学习而设计的模块。torch.nn的核心数据结构是Module&#xff0c;它是一个抽象的概念&#xff0c;既可以表示神经网络中的某个层&#xff08;layer&#xff09;&#xff0c;也可以表示一个包含很多层的神经网络。在实际使用中&#xff0c;最常…