数据库编程
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协议的数据包在屏蔽底层协议的情况下&#…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
