数据库编程
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协议的数据包在屏蔽底层协议的情况下&#…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...