当前位置: 首页 > news >正文

数据库编程

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块分三部分&#xff1a;声明部分、执行部分、异常处理部分&#xff1b; 示例&#xff1a; declare --变量声明 v_sno varchar2(10) : ‘04001’; v_cno varchar2(10) :‘001’; v_grade number : 90; begin --程序入口 insert…...

(docker)进入容器后如何使用本机gpu

首次创建容器&#xff0c;不能直接使用本机gpu 在系统终端进行如下配置&#xff1a; 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation&#xff0c;安装NVIDIA Container Toolkit …...

java基础知识点总结2024版(8万字超详细整理)

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

vue中使用element的i18n语言转换(保姆式教程-保证能用)

话不多说&#xff0c;先看效果:预览地址: https://sandm00.github.io/i18n-switch/#/ 1、项目中需要使用的插件&#xff0c;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. 单例模式 单例模式有两种实现方式&#xff1a; 1.1 饿汉模式&#xff08;Eager Initialization&#xff09;&#xff1a;在类加载时就创建单例实例&#xff0c;无论是否需要使用该实例。 饿汉模式在类加载时就创建单例实例&#xff0c;无论是否需要使用该实例。 饿汉模式…...

css backdrop-filter 实现背景滤镜

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

AR人脸道具SDK解决方案,实现道具与人脸的自然融合

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

Windows安装RabbitMQ教程(附安装包)

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

这个问题无人能解,菜鸟勿进

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

揭秘高效引流获客的艺术:转化技巧大公开

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

【Unity 鼠标输入检测】

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

LeetCode hot100-33-Y

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

C++和Python通信引文道路社评电商大规模行为图结构数据模型

&#x1f3af;要点 &#x1f3af;图论数学逻辑和计算&#xff1a;&#x1f58a;定向网络节点和边 | &#x1f58a;节点的入度 | &#x1f58a;出度和度 | &#x1f58a;源节点 | &#x1f58a;汇节点 | &#x1f58a; 孤立节点 | &#x1f58a;入度分布和出度分布 | &#x1f…...

单片机-点亮第一盏灯

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

C++组合类

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

Linux学习笔记3

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

免费证件照一键换底色

最近星期天在家搞了一个小工具&#xff0c;在这里分享下! 废话不多说看看效果&#xff1a; 效果还不错&#xff0c;需要的可以联系我!!!!!!!!! 别的网上可都是一次五块钱这种。太贵了。。&#xff01;&#xff01;...

使用 FFmpeg 从音视频中提取音频

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

GraphQL在现代Web应用中的应用与优势

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

socket编程 学习笔记 理解

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

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...