数据库编程
PL/SQL程序
1.PL/SOL程序块
整个PL/SQL块分三部分:声明部分、执行部分、异常处理部分;
示例:
declare --变量声明
v_sno varchar2(10) := ‘04001’;
v_cno varchar2(10) :=‘001’;
v_grade number := 90;
begin --程序入口
insert into sc values (v_sno,v_cno,v_grade);
commit; //insert update和delete的提交步骤
end;
2.特殊类型
%type :已声明的变量和前边给出的变量类型相同,若前边变量类型改变,该声明变量自动改变
declare
n sc.sno%type;
m sc.cno%type;
x sc.grade%type;
y x%type;
%rowtype : 返回一个记录类型,其数据类型和数据库表的数据结构相一致。
declare
a1 sc%rowtype;
begin
select *
into a1
from sc
where sno=‘04001’ and cno=‘003’ ;
end; //a1--一个类似于sc的数据结构;
3.运算符
一般运算符
:= 赋值号 => 关系号(一般用于给形参赋值) .. 范围运算符 || 字符连接符
关系运算符
<> != ~= ^= 不等于
4.控制语句
①顺序语句:
goto语句:无条件跳转到指定的标号
null语句:说明“不用做任何事情”的意思,相当于一个占位符
②条件语句:
if 语句
if <布尔表达式> then
pl/sql 和 sql语句
elsif < 其它布尔表达式> then
其它语句
elsif < 其它布尔表达式> then
其它语句
else
其它语句
end if;
③循环语句:
loop…end loop语句
while语句
for循环语句
loop
要执行的语句;
whexiten <条件语句>
end loop;
while <布尔表达式> loop
要执行的语句;
end loop;
if-else示例:
declare n sc.sno%type; m sc.cno%type; x sc.grade%type;
beginselect sno,cno,grade into n,m,xfrom scwhere sno='105698' and cno='2092508'; //对一个学生的一门科目进行成绩评级输出if x<60 thendbms_output.put_line(n||','||m||','||x||','||'不及格');elsif x>=60 and x<80 thendbms_output.put_line(n||','||m||','||x||','||'及格');elsif x>=80 and x<90 thendbms_output.put_line(n||','||m||','||x||','||'良好');elsedbms_output.put_line(n||','||m||','||x||','||'优秀');end if;exceptionwhen no_data_found then dbms_output.put_line('没有查询结果');
end;
for循环示例:
beginfor x in 1..10 loopdbms_output.put_line('x 的当前值为:'||x);end loop;
end;
游标
1.声明游标
cursor <游标名>[(<游标参数>[, <游标参数>]…)]
is <查询语句>;
游标参数只能为输入参数,其格式为:
parameter_name [in] datatype [{:= | default} expression]
2. 打开游标
open <游标名> [ ( [ <参数名> => ] <实参> [,…n] ) ];
3. 提取游标
fetch <游标名> into {variable_list | record_variable };
4.游标关闭
当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用fetch 语句取其中数据。
close <游标名>;
代码改进
declare n sc.sno%type; m sc.cno%type; x sc.grade%type;cursor c1 is //游标声明select sno,cno,grade from scwhere sno='04002' ; //存在同一个人的多个课程信息和成绩
beginopen c1; //游标打开loop //循环fetch c1 into n,m,x; //游标提取exit when c1%notfound; 跳出循环的条件if x<60 thendbms_output.put_line(n||','||m||','||x||','||'不及格');elsif x>=60 and x<80 thendbms_output.put_line(n||','||m||','||x||','||'及格');elsif x>=80 and x<90 thendbms_output.put_line(n||','||m||','||x||','||'良好');elsedbms_output.put_line(n||','||m||','||x||','||'优秀');end if;end loop;close c1;
end; ……
游标属性
%found:布尔型属性 游标刚打开,指针指向第一行元组之前时,值为null; 游标指针指向查询结果集时,值为true; 其它,值为false。
%notfound:布尔型属性,与%found相反。
%isopen:布尔型属性,当游标已打开时返回 true。
%rowcount:数字型属性,返回已从游标中读取的记录数 。
存储过程
1.创建存储过程
create [or replace] procedure <过程名>
[(<参数名> <参数类型> <数据类型>[default <默认值>][,…n])]
{ is | as }
[<变量声明> ]
begin <过程体>
end[过程名];
注:参数类型:
in:输入参数,参数在执行时被赋值,将值传入到过程体。
out:输出参数,参数在过程中将被赋值,可以传给过程体的外部。
in out:输入输出参数,既可以向过程体传值,也可以在过程体中赋值。
2. 调用存储过程
begin
<过程名>[([<参数名>=>]<实参>[,…n])];
end;
示例1:
创建存储过程,查询信息学院学生的考试成绩,列出学生的姓名、课程名和成绩,将查询结果在过程体中输出
//过程块
create or replace procedure p_select_xx
isv_sname student.sname%type; v_cname course.cname%type; v_grade sc.grade%type;cursor c1 is select sname, cname,grade from student,sc,coursewhere student.sno = sc.sno and course.cno = sc.cno and scollege = '信息工程学院';
beginopen c1;loopfetch c1 into v_sname,v_cname,v_grade;exit when c1%notfound;dbms_output.put_line(v_sname||','||v_cname||','||v_grade);end loop;close c1;
end;//调用过程块
beginp_select_xx;
end;
示例2:
创建存储过程,查询指定学院学生的考试成绩,列出学生的姓名、课程名和成绩,将查询结果在过程体中输出
create or replace procedure p_select_xy(v_college in student.scollege%type)
isv_sname studnet.sname%type; v_cname course.cname%type; v_grade sc.grade%type;cursor c1 is select sname, cname,grade from student,sc,coursewhere student.sno = sc.sno and course.cno = sc.cno and scollege = v_college;
beginopen c1;loopfetch c1 into v_sname,v_cname,v_grade;exit when c1%notfound;dbms_output.put_line(v_sname||','||v_cname||','||v_grade);end loop;close c1;
end;
//调用
beginp_select_xy(&输入学院名称); //调用程序会显示要求输入学院名称,注意在输入时加单引号!!!
end;
示例3:
创建存储过程,统计指定课程的平均成绩和选课人数,将统计结果用输出参数返回给调用的主程序。
create or replace procedure p1
(v_cno in sc.cno%type,avg_grade out number, total out number) is
beginselect avg(grade),count(sno)into avg_grade,total //2个输出参数from scwhere cno=v_cno;
end ;//调用
declarea1 varchar2(10):='001’;a2 number;a3 number;
beginp1(a1,a2,a3);//或者
/*p1(avg_grade=>a2,total=>a3,v_cno=>a1);*/dbms_output.put_line(a2||',’||a3);
end;
3. 删除存储过程
drop proceurde <存储过程名>
存储过程小结
在创建存储过程中,需要考虑参数的种类和个数;
另外,当过程体中有查询语句时,如果查询结果为多行元组,需要游标;当查询结果为一行元组,则不需要游标,直接使用into语句即可;
触发器
触发器是用户定义在表上的一类由事件驱动的特殊的存储过程,当某个Oracle事件发生时系统自动地运行,所以运行触发器就叫触发。
存储过程通过其他程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行,即触发器是当某个事件发生时自动地隐式运行。
触发器不能接收参数。
1.创建触发器语法格式
create [or replace] trigger <触发器名称>
{before | after | instead of} <触发事件>
//触发事件--insert、update、delete、create、alter、drop等
on {<表名>|<视图名>}
[for each row] [when <触发条件>] //for each row行级触发器
declare
[变量声明;]
begin
<触发动作体>
end;
2.修饰符
:new修饰符,如果激活触发器的语句为Insert,Update,被插入的数据与被更新后的数据在触发体中由:new引用。
:old修饰符,如果激活触发器的语句为Delete,Update,被删除的数据与被更新前的数据在触发体中由:old引用。
示例: 创建触发器实现如下约束:当修改S表中学生学号时,级联更新相应的选课信息。
create or replace trigger tri_update_cascade
after update
on s
for each row
begin
update sc
set sno=:new.sno
where sno=:old.sno;
end tri_update_cascade;
创建触发器实现:当在教师工资表中插入元组或者修改工资表时,要求教授的工资不得低于4000元,如果低于4000元,自动改为4000元。
create or replace trigger zdxg_sal
after insert on sal_teach
for each row
declare
-- local variables here begin
if :new.job='教授' and :new.sal<4000 then
update sal_teach
set sal=4000
where eno=:new.eno;
end if;
end zdxg_sal; 错误
//原因:如果是后触发,触发体中不能对触发器所在的表做修改和查询操作。
create or replace trigger zdxg_sal
before insert or update on sal_teach
for each row
declare
-- local variables here
begin
if :new.job='教授' and :new.sal<4000 then
:new.sal:=4000;
end if; end zdxg_sal;
3.删除触发器
语法格式: drop trigger <触发器名>;
4.总结
行级触发器:当DML语句对每一行数据进行操作时都会引起该触发器的运行。
语句级触发器:无论DML语句影响多少行数据,它所引起的触发器都仅执行一次。
替换触发器:定义在视图之上的触发器。
用户事件触发器:与DDL操作或用户登录、退出数据库等事件相关的触发器。
系统事件触发器:在Oracle数据库系统的事件中触发的触发器,如Oracle实例的启动与关闭。
①一个表上同一时间、同一事件、同一类型的触发器只能有一个;
②在触发器的执行部分只能用DML语句(select, insert, update, delete),不能使用DDL语句(create, alter, drop);
③在触发语句中不能包含事务控制语句(commit, rollback, savepoint)。在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。//存储过程可以包括;
相关文章:

数据库编程
PL/SQL程序 1.PL/SOL程序块 整个PL/SQL块分三部分:声明部分、执行部分、异常处理部分; 示例: declare --变量声明 v_sno varchar2(10) : ‘04001’; v_cno varchar2(10) :‘001’; v_grade number : 90; begin --程序入口 insert…...

(docker)进入容器后如何使用本机gpu
首次创建容器,不能直接使用本机gpu 在系统终端进行如下配置: 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation,安装NVIDIA Container Toolkit …...

java基础知识点总结2024版(8万字超详细整理)
java基础知识点总结2024版(超详细整理) 这里写目录标题 java基础知识点总结2024版(超详细整理)java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…...

vue中使用element的i18n语言转换(保姆式教程-保证能用)
话不多说,先看效果:预览地址: https://sandm00.github.io/i18n-switch/#/ 1、项目中需要使用的插件,vue2或vue3、element、vue-i18n、js-cookie、vuex我是在vue2中使用 npm i element-ui -S npm i js-cookie -S npm i vue-i18n8.28.2 //因为我项目使用…...

01 设计模式--单例模式
1. 单例模式 单例模式有两种实现方式: 1.1 饿汉模式(Eager Initialization):在类加载时就创建单例实例,无论是否需要使用该实例。 饿汉模式在类加载时就创建单例实例,无论是否需要使用该实例。 饿汉模式…...

css backdrop-filter 实现背景滤镜
官方给出的定义是:backdrop-filter属性允许您将图形效果(如模糊或颜色偏移)应用于元素后面的区域。因为它适用于元素后面的所有内容,所以要查看元素或其背景的效果,需要透明或部分透明。 大致分为以下10种:…...

AR人脸道具SDK解决方案,实现道具与人脸的自然融合
AR人脸道具SDK解决方案,实现道具与人脸的自然融合美摄科技以其卓越的技术实力和创新能力,为企业带来了全新的AR人脸道具SDK解决方案。这一解决方案将为企业打开全新的市场机会,为用户带来前所未有的互动体验。 颠覆传统,开启AR人…...

Windows安装RabbitMQ教程(附安装包)
需要两个安装包 Erlang 安装包: https://download.csdn.net/download/Brevity6/89274663 (自己从官网下载也可以) RabbitMQ Windows 安装包: https://download.csdn.net/download/Brevity6/89274667 (自己从官网下载也可以) Erlang安装 Erlang安装傻瓜式下一…...

这个问题无人能解,菜鸟勿进
前言 这是陈旧已久的草稿2021-06-23 23:25:12 现在2024-5-12 21:53:46,发布到[逻辑题]专栏中。 一、问题 1.描述: 在我的世界中建个红石电路 2.需求: 五个灯A、B、C、D、E、F 五个开关a、b、c、d、e、f、总开关 3.要求: 总开关…...

揭秘高效引流获客的艺术:转化技巧大公开
在数字化营销的海洋中,每个企业都如同一艘努力航行的船,而流量便是推动船只前行的风帆。如何有效吸引并获取潜在客户,即所谓的“引流获客”,已成为企业市场营销策略中不可或缺的一环。本文将详细探讨几种实用且高效的引流获客技巧…...

【Unity 鼠标输入检测】
Unity 鼠标输入检测 Unity提供了多种方法来检测和处理鼠标输入,允许开发者在游戏中实现对鼠标移动、点击和滚轮滚动的响应。以下是一些基本的鼠标输入检测方法: 1. Input.mousePosition 这个属性返回当前鼠标指针的屏幕坐标。坐标是以像素为单位的&…...

LeetCode hot100-33-Y
148. 排序链表 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 这题能通过但是投机取巧了,一般应该不能这样做,直接把节点里的值拿出来,排序后再更新每个节点的值。 /*** Definition for singly-linked list.* p…...

C++和Python通信引文道路社评电商大规模行为图结构数据模型
🎯要点 🎯图论数学逻辑和计算:🖊定向网络节点和边 | 🖊节点的入度 | 🖊出度和度 | 🖊源节点 | 🖊汇节点 | 🖊 孤立节点 | 🖊入度分布和出度分布 | …...

单片机-点亮第一盏灯
原理图 需求:点亮或是熄灭LED 通过控制 P5.3引脚输出高电平时,LED灯就点亮,输出低电平时LED灯就熄灭 1.项目创建 新建项目 配置开发板信息 当前位STC芯片的开发板,选择STC MCU Database 搜素具体芯片型号,进行配置…...

C++组合类
类的数据成员不但可以是基本类型,也可以是其它类的对象。 组合类就是指一个类包含其他类的对象作为该类的数据成员。 当组合类创建对象时,其中包含的各个数据成员对象应首先被创建。因此,在创建类的对象时,既要对本类的基本…...

Linux学习笔记3
建立最小linux系统【续】 书接上文,上一篇我们分析了rcS和ifconfig-eth0文件,接下来我们继续讲下去 passwd文件 之后在init.d的上一级目录etc下建立passwd文件,内容如下 root::0:0:root:/:/bin/sh bin:*:1:1:bin:/bin:daemon:*:2:2:daemo…...

免费证件照一键换底色
最近星期天在家搞了一个小工具,在这里分享下! 废话不多说看看效果: 效果还不错,需要的可以联系我!!!!!!!!! 别的网上可都是一次五块钱这种。太贵了。。!!...

使用 FFmpeg 从音视频中提取音频
有时候我们需要从视频文件中提取音频,并保存为一个单独的音频文件,我们可以借助 FFmpeg 来完成这个工作。 一、提取音频,保存为 mp3 文件: 要使用 FFmpeg 从音视频文件中提取音频,并将 ACC 编码的音频转换为 MP3 格式࿰…...

GraphQL在现代Web应用中的应用与优势
GraphQL是一种现代的API查询语言,它在现代Web应用中得到了广泛的应用,因为它提供了一种高效、灵活且强大的方式来获取数据 GraphQL基础快速应用示例: 1. 后端设置(使用graphql-yoga) 首先,我们需要创建一…...

socket编程 学习笔记 理解
在使用socket(也就是套接字)编程的时候,其实是工作于应用层和传输层之间 如果使用的是基于TCP的socket,那每个数据包的发送的过程大致为: 数据通过socket套接字构造符合TCP协议的数据包在屏蔽底层协议的情况下&#…...

SC-Lego-LOAM建图与ndt_localization的实车实现
参考:https://blog.csdn.net/weixin_44303829/article/details/121524380 https://github.com/AbangLZU/SC-LeGO-LOAM.git https://github.com/AbangLZU/ndt_localizer.git 将建图和定位分别使用lego-loam和ndt来进行,实车上的效果非常不错,…...

vs code中如何使用git
由于本地代码有了一些储备,所以想通过网址托管形式,之前一直使用了github,但是鉴于一直被墙,无法登录账号,所以选择了国内的gitee来作为托管网站。 gitee的网址:Gitee - 基于 Git 的代码托管和研发协作平台…...

Vue项目中如何通过配置修改项目名称
Vue项目中如何通过配置修改项目名称 前言 部分vue项目中为了不直接修改 index.html 文件而使用 config 配置文件进行修改,好处就是项目配置比较集中好管理、可实现动态化修改。 具体配置和使用 项目中 index.html 配置标题名,可以看到 <title>…...

ThinkPHP5.1 创建控制器类
在ThinkPHP中,控制器是MVC模式中的核心组件之一,负责接收用户请求并处理相应的业务逻辑。在本篇技术博客中,我们将深入探讨ThinkPHP5.1中的控制器操作,包括创建控制器、路由绑定、请求参数获取等方面的知识点。 1.创建控制器 在T…...

完全背包问题(c++)
完全背包问题 当前有 N 种物品,第 i 种物品的体积是 ci,价值是 wi。 每种物品的数量都是无限的,可以选择任意数量放入背包。 现有容量为 V 的背包,请你放入若干物品,使总体积不超过 V,并且总价值尽可…...

综合性练习(验证码案例)
目录 一、需求 二、准备工作 三、约定前后端交互接口 1、需求分析 2、接口定义 四、Hutool工具介绍 1、引入依赖 2、测试使用Hutool生成验证码 五、实现服务器端代码 代码解读: 六、调整前端页面代码 七、运行测试 随着安全性的要求越来越高,…...

实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能
前言 Chrome作为主力浏览器,支持相当丰富的第三方扩展,其实浏览器本身也内置了大量实用的命令。许多实用的功能并没有直接显示在Chrome的菜单上。在这篇文章中,我们将介绍几个实用的chrome:// commands。 通过下面整理的 Chrome 命令&#x…...

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)
免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…...

CSS-盒子模型
盒子模型的重要组成部分 内容区域content:width , height 内边距:内边框和内容区域的距离Padding边框线:Border外边距:Margin Border (边框线) 属性:Border 属性值:边框线粗细px 线条样式 颜色(不区分…...

WPF之页的使用
1,Page介绍。 Page直接从FrameworkElement中派生出来,WIndow从ContentControl中派生。 [Localizability(LocalizationCategory.Ignore)]public class Window : ContentControl, IWindowService{....} [ContentProperty("Content")]public class Page : Fr…...