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

目录

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

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;

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

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

相关文章

LangChain框架详解

LangChain框架详解 LangChain是一个基于语言模型开发应用程序的强大框架&#xff0c;旨在帮助开发人员简化与大模型交互、数据检索以及将不同功能模块串联起来以完成复杂任务的过程。它提供了一套丰富的工具、组件和接口&#xff0c;使开发人员能够轻松构建上下文感知和具备逻…

Qt:19.浮动窗口/子窗口(子窗口介绍、代码方式创建子窗口、设置子窗口标题、为子窗口添加控件、设置子窗口停靠位置)

目录 1.子窗口介绍&#xff1a; 2.代码方式创建子窗口&#xff1a; 3.设置子窗口标题&#xff1a; 4.为子窗口添加控件&#xff1a; 5.设置子窗口停靠位置。 1.子窗口介绍&#xff1a; 在 Qt 中&#xff0c;可以创建和管理子窗口&#xff08;子窗口体&#xff09;以实现多窗…

线程安全(二)synchronized 的底层实现原理、锁升级

目录 一、基础使用1.1 不加锁的代码实现1.2 加锁的代码实现二、实现原理2.1 synchronized 简介2.2 对象监控器(Monitor)2.3 加锁过程第一步:判断 Owner 指向第二步:进入 EntryList 阻塞第三步:主动进入 WaitSet 等待三、锁升级3.1 对象的内存结构3.2 Mark Word 对象头3.3 …

python的简单爬取

需要的第三方模块 requests winr打开命令行输入cmd 简单爬取的基本格式&#xff08;爬取百度logo为例&#xff09; import requests url"http://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" resprequests.get(url)#回应 #保存到本地 with open(&…

地址翻译过程(TLB-->页表-->Cache-->主存-->外存)

目录 1.地址结构 2.查找快表或页表&#xff1a;从虚拟地址--->物理地址 3.通过物理地址访问数据 设某系统满足以下条件&#xff1a; •有一个TLB与一个data Cache •存储器以字节为编址单位 •虚拟地址 14位 •物理地址 12位 •页面大小为 64B •TLB 为四路组相联&#x…

嵌入式工程师从0开始,到底该学什么,怎么学?

作为嵌入式工程师&#xff0c;从零开始学习需要掌握以下几个关键方面。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可以免费获得。 基…

【高中数学/指数函数、对数函数、正弦函数】求 y=2^x+x,y=log2_x+x,y=2*sinX+x 的零点位置大小关系

【问题】 已知函数f(x)2^xx,g(x)log2_xx,h(x)2*sinXx 的零点分别是a,b,c,则a、b、c的大小顺序是&#xff1f; 【解答】 粗览三个函数&#xff0c;h(x)2*sinXx的零点是最好解决的&#xff0c;明显x0时h(x)0&#xff0c;因此c在原点的位置&#xff1b; 对于f(x)2^xx&#xff…

【C++BFS】690. 员工的重要性

本文涉及知识点 CBFS算法 LeetCode690. 员工的重要性 你有一个保存员工信息的数据结构&#xff0c;它包含了员工唯一的 id &#xff0c;重要度和直系下属的 id 。 给定一个员工数组 employees&#xff0c;其中&#xff1a; employees[i].id 是第 i 个员工的 ID。 employees[…

怎样在 C 语言中实现堆排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

人类大脑的计算与机器的类脑计算

人类大脑的计算基本原理涉及到神经元的基本工作方式、神经网络的结构和连接模式、信息传递的方式、学习和记忆的机制等多个层面的复杂互动&#xff0c;这些原理的深入理解不仅有助于神经科学的发展&#xff0c;还为人工智能领域的发展提供了重要的启示和指导。人类大脑计算基本…

按下快门前的算法——对焦

对焦算法可以分为测距式&#xff0c;相位式&#xff0c;反差式。 其中测距式是通过激光&#xff0c;&#xff08;TOF&#xff0c;Time of Flight&#xff09;等主动式地得知物距&#xff0c;然后对焦。更常用的是后两者。 反差式CDAF&#xff08;Contrast Detection Auto Foc…

Lingo学习(二)——线性规划基础、矩阵工厂

一、线性规划基础 &#xff08;一&#xff09;方法 ① 一个线性规划中只含一个目标函数。(两个以上是多目标线性规划,Lingo无法直接解) ② 求目标函数的最大值或最小值分别用max …或min …来表示。 ③ 以!开头,以;结束的语句是注释语句; ④ 线性规划和非线性规划的本质…

Node.js如何在Windows安装?

文章目录 主要特点&#xff1a;使用场景&#xff1a;安装方法验证是否安装成功 Node.js 是一个开源、跨平台的JavaScript运行环境&#xff0c;由Ryan Dahl于2009年创建。它允许开发者在服务器端运行JavaScript代码。Node.js 基于Chrome V8 JavaScript引擎构建&#xff0c;其设计…

mobx学习笔记

mobx介绍 mobx是一个功能强大&#xff0c;上手容易的状态管理工具。MobX背后的哲学很简单:任何源自应用状态的东西都应该自动地获得。利用getter和setter来收集组件的数据依赖关系&#xff0c;从而在数据发生变化的时候精确知道哪些组件需要重绘。 mobx和redux的区别 mobx更…

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

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

【排序算法】计数排序

目录 一.基本思想 二.缺陷及优化 三.代码实现 四.特性总结 1.可以排序负数 2.适合范围集中的整数 3.时间复杂度&#xff1a;O(Nrange) 4.空间复杂度&#xff1a;O(range) 5.稳定性&#xff1a;稳定 一.基本思想 根据待排序数组a创建一个新的数组count&#xff0c;该数组…

无人机之遥控器保养

一、使用存放 1、避免让遥控器受到强烈的震动或从高处跌落&#xff0c;以免影响内部结构的精度&#xff1b; 2、遥控器在使用完后&#xff0c;需要将天线收拢&#xff0c;避免折断&#xff0c;养成定期检查天线的习惯&#xff1b; 3、定期检查遥控器按键有无裂纹、畸变、松旷…

代码随想录算法训练营Day36||动态规划part04

494.目标和&#xff1a;本题的方法主要用来解决------装满容量为x的背包&#xff0c;有几种方法。 可以先理解二维数组的思路&#xff1a;感觉b站一个评论写得很清晰&#xff0c;借用一下。 这题最难理解的地方在于如何初始化数组&#xff0c;为什么dp[0]1&#xff1b;我试图自…

Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)

2024.07.11 测试有效 最近需要用一下 opencv 处理图像&#xff0c;简单配置了一下Cmake下的 opencv 库。 没有编译 opencv &#xff0c;也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…

商品分类左右联动

1、先看效果 2、以hooks方法处理&#xff0c;方便复制使用&#xff0c;见代码 Good.vue文件 <script setup lang"ts" name"goods">import {onMounted, ref, nextTick} from "vue";import useProductScroll from "/utils/hooks/useP…