数据库编程

数据库编程

文章目录

  • 第一节 存储过程
    • 一、存储过程的基本概念
    • 二、创建存储过程
    • 三、存储过程体
      • 1、局部变量
      • 2、SET语句
      • 3、SELECT...INTO语句
      • 4、流程控制语句
        • (1)IF语句
        • (2)CASE语句
        • (3)循环语句
      • 5、游标
        • (1)声明游标
        • (2)打开游标
        • (3)读取数据
        • (4)关闭游标
    • 四、调用存储过程
    • 五、删除存储过程
  • 第二节 存储函数
    • 一、创建存储函数
    • 二、调用存储函数
    • 三、删除存储函数


第一节 存储过程

一、存储过程的基本概念

​ 存储过程是一组为了完成某项特定功能的SQL语句集,其实质上就是一段存储在数据库中的代码,它可以由声明式的SQL语句(如CREATE、UPDATE和SELECT等语句)和过程式SQL语句(如IF…THEN…ELSE控制结构语句)组成。

使用存储过程的优点:

​ 1、提高运行速度;

​ 2、增强了SQL的功能和灵活性。

​ 3、可以降低网络的通信量

​ 4、减轻了程序编写的工作量;

​ 5、间接实现安全控制功能。

二、创建存储过程

语法格式:

CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body[BEGIN......END]

​ 其中,proc_parameter的参数如下:

[IN | OUT | INOUT] param_name type

​ characteristic特征如下:

LANGUAGE SQL | [NOT] DETERMINISTIC | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER} | COMMENT 'string'

​ DELIMITER语法格式:

DELIMITER $$

​ 修改结束符为$$

说明:因为MySQL玉兴命令中结束符号为分号,编写存储过程中为了避免冲突,修改结束符号。

delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begininsert into pro (pno,pname) values (p_no,p_name);
end $$

三、存储过程体

1、局部变量

​ 在存储过程中可以声明局部变量,它们可以用来存储时结果。要声明局部变量必须使用DECLARE语句。在声明局部变量的同时也可以对其赋一个初始值。
​ DECLARE语法格式如下:

DECLARE var_name[,...] type [DEFAULT value]

​ 说明:var_name为变量名;type为变量类型;

​ DEFAULT子句给变量指定一个默认值,如果不指定默认为NULL的话。

​ 例如:DECLARE sno CHAR(10)

delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begin
declare a int default 0;insert into pro (pno,pname) values (p_no,p_name);
end $$

2、SET语句

​ 要给局部变量赋值可以使用SET语句,SET语句也是SQL本身的一部分。

​ 语法格式为:

SET var_name=expr[,var_name=expr]...
delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begin
declare a int;
set a=10;insert into pro (pno,pname) values (p_no,p_name);
end $$

3、SELECT…INTO语句

​ 使用这个SELECT…INTO语法可以把选定的列值直接存储到变量中。因此,返回的结果只能有一行

​ 语法格式为:

SELECT col_name[,...] INTO var_name[,...] table_expr

​ 说明:col_name是列名,var_name是要赋值的变量名。table_expr是SELECT语句中的FROM子句及后面的部分。

delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begin
declare a int;
select Id into a from pro where pno='001';insert into pro (pno,pname) values (p_no,p_name);
end $$

4、流程控制语句

(1)IF语句

​ IF-THEN-ELSE语句可根据不同的条件执行不同的操作。

​ 语法格式为:

IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list]...[ELSE statement_list] END IF

​ 说明:search_condition是判断的条件,statement_list中包含一个或多个SQL语句。当search_condition的条件为真时,就执行相应的SQL语句。区别IF()函数,不要混淆

delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begin
declare a int;
select Id into a from pro where pno='001';if p_no = '003' thendelete from pro;
end if;insert into pro (pno,pname) values (p_no,p_name);
end $$
(2)CASE语句

​ 说明:一个CASE语句经常可以充当一个IF-THEN-ELSE语句。

形式1
形式2
CASE case_valueWHEN when_value THEN statement_list[WHEN when_value THEN statement_list]...[ELSE statement_list]END CASEcase_value:表达式或者值when_value:与case_value比较CASEWHEN search_condition THEN statement_list[WHEN search_condition THEN statement_list]...[ELSE statement_list]END CASEsearch_condition:指定一个比较表达式
delimiter $$
create procedure pro_add (IN p_no varchar(10),IN p_name varchar(255))
begin
declare a int;
select Id into a from pro where pno='001';if p_no = '003' thendelete from pro;
end if;
case p_nowhen '001' thenwhen '002' thenelseend caseinsert into pro (pno,pname) values (p_no,p_name);
end $$
(3)循环语句

​ MySQL支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句。在存储过程中可以定义0个、1个或多个循环语句。

形式1
形式2
形式3
[begin_label:]WHILEsearch_conditionDOstatement_listEND WHILE[end_label][begin_label:]REPEATstatement_listUNTILsearch_conditionEND REPEAT[end_label][begin_label:]LOOPstatement_listEND LOOP[end_label]

​ 循环语句说明:

​ ① WHILE先判断,REPEAT后判断,WHILE条件为真进行循环,REPEAT条件为真结束循环。

​ ② 在LOOP循环内的语句一直重复至循环被退出,退出时通常伴随着一个LEAVE语句

​ ③ LEAVE语句经常和BEGIN…END或循环一起使用

​ ④ LEAVE label

5、游标

​ 一条SELECT…INTO语句返回的是带有值的一行,这样可以把数据读取到存储过程中。但是常规的SELECT语句返回的是多行数据,如果要处理它需要引入游标这一概念。

​ MySQL支持简单的游标。在MySQL中,游标一定要在存储过程或函数中使用,不能单独在查询中使用。名字要唯一游标本身是执行SELECT检索出来的结果集

(1)声明游标

​ 语法格式:

DECLARE cursor_name CURSOR FOR select_statement

​ 说明:cursor_name是游标的名称,游标名称使用与表名同样的规则。select_statement是一个SELECT语句,返回是一行或多行的数据。

(2)打开游标

​ 声明游标后,要使用游标从中提取数据,就必须先打开游标。在MySQL中,使用OPEN语句打开游标,格式为:

OPEN cursour_name

​ 在程序中,一个游标可以打开多次,由于其他的用户或程序本身已经更新了表,所以每次打开结果可能不同。

(3)读取数据

​ 游标打开后,就可以使用FETCH…INTO语句从中读取数据。

​ 语法格式:

FETCH sursor_name INTO var_name[,var_name]...

​ 说明:FETCH…INTO语句与SELECT…INTO语句具有相同的意义,FETCH语句是将游标指向的一行数据赋给一些变量,子句中变量的数目必须等于声明游标时SELECT子句中列的数目。var_name是存放数据的变量名

(4)关闭游标

​ 游标使用完以后,要及时关闭。关闭游标使用CLOSE语句,格式为:

CLOSE sursour_name

​ 语句参数的含义与OPEN语句中相同。

delimiter $$
create procedure pro_num (OUT ROWS INT)
begin
declare cid varchar(10);
declare FOUND BOOLEAN DEFAULT TRUE;
declare cur_cid CURSOR FOR
select pno from pro;declare continue handler for NOT FOUND;
set FOUND=false;
set ROWS=0;
open cur_cid;
fetch cur_cid into cid;
while FOUND do
set ROWS=ROWS+1;fetch cur_cid into cid;
end while;
close cur_cid;end $$

四、调用存储过程

​ 存储过程创建完后,可以在程序、触发器或者存储过程中被调用,但是都必须使用到CALL语句。
​ 语法格式:

CALL sp_name([parameter[,...]])

说明:sp_name为存储过程的名称,如果要调用某个特定数据库的存储过程,则需要在前面加上该数据库的名称。parameter为调用该存储过程使用的函数,这条语句中的参数个数必须总是等于存储过程的参数个数

mysql> call pro_add('007','产品7');

五、删除存储过程

​ 存储过程创建后需要删除时使用DROP PROCEDURE语句。在此之前,必须确认该存储过程没有任何依赖关系否则会导致其他与之关联的存储过程无法运行。
​ 语法格式为:

DROP PROCEDURE [IF EXISTS] sp_name

说明:sp_name是要删除的存储过程的名称。IF EXISTS子句是MySQL的扩展,如果程序或函数不存在,防止错误。

mysql> drop proceduce pro_add;-- 查看存储过程的定义
mysql> show create procedure pro_num;
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure                                                                                                                                                                     | character_set_client | collation_connection | Database Collation |
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| pro_num   |          | CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_num`(OUT ROWS INT)
begin
declare cid varchar(10);
declare FOUND BOOLEAN DEFAULT TRUE;
declare cur_cid CURSOR FOR
select pno from pro;end | utf8mb4              | utf8mb4_general_ci   | utf8_unicode_ci    |
+-----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.07 sec)mysql> 

第二节 存储函数

一、创建存储函数

​ 创建存储函数使用CREATE FUNCTION语句。要查看数据库中有哪些存储函数,可以使用SHOW FUNCTION STATUS令。
​ CREATE FUNCTION语法格式:

CREATE FUNCTION sp_name([func_parameter[,...]])RETURNS type[characteristic ...] routine_body

​ 说明:存储函数的定义格式和存储过程相差不大。

delimiter $$
create function pro_add(p_no varchar(10))
return varchar(10)
deterministic
begininsert into pro(pno) values(p_no);return (p_no)
end$$

二、调用存储函数

​ 存储函数创建完后,就如同系统提供的内置函数(如VERSION()),所以调用存储函数的方法也差不多,都是使用SELECT关键字。
​ 语法格式为:

SELECT sp_name ([func_parameter[,...]])
select pro add('008');

三、删除存储函数

​ 删除存储函数的方法与删除存储过程的方法基本一样,使用DROP FUNCTION语句。
​ 语法格式为:

DROP FUNCTION [IF EXISTS] sp_name
show function status;
drop function pro_add;
drop function IF EXISTS pro_add;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp iOS离线打包——如何创建App并提交版本审核?

uniapp 如何创建App,并提交版本审核? 文章目录 uniapp 如何创建App,并提交版本审核?登录 appstoreconnect创建AppiOS 预览和截屏应用功能描述技术支持App 审核信息 App 信息内容版权年龄分级 价格与销售范围App 隐私提交审核 登录…

华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统

1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格,满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像,实现应用一键部署,助力客户便捷高效的在…

mybatis-plus控制台打印sql(mybatis-Log)

配置了mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl;但是mybatis执行的sql没有输出 需要检查点: 1、日志级别设置:请确保你的日志级别配置正确。如果日志级别设置得太低,可能导致SQL语句不…

计算机竞赛 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…

【kubernetes】CRI OCI

1 OCI OCI(Open Container Initiative):由Linux基金会主导,主要包含容器镜像规范和容器运行时规范: Image Specification(image-spec)Runtime Specification(runtime-spec)runC image-spec定义了镜像的格式,镜像的格式有以下几…

解决Qt msvc编译器 中文显示乱码问题

第一步:代码文件选择用utf8编码带bom。第二步:在有中文汉字的代码文件顶部加一行(一般是cpp文件) #pragma execution_character_set(“utf-8”) 可以考虑放在head.h中,然后需要的地方就引入head头文件就行,…

【多级缓存】

文章目录 1. JVM进程缓存2. Lua语法3. 实现多级缓存3.1 反向代理流程3.2 OpenResty快速入门 4. 查询Tomcat4.1 发送http请求的API4.2 封装http工具4.3 基于ID负载均衡4.4 流程小结 5. Redis缓存查询5.1 实现Redis查询 6. Nginx本地缓存6.1 本地缓存API6.2 实现本地缓存查询 7. …

算法之数论知识点总结

文章目录 前言【校招笔试】数论知识点整数分块 前言 最近在准备秋招的时候发现,一些公司第一题会出数论相关的题目,这对于没打过acm类竞赛的人来说,基本上是不可能AC的,所以本篇就尽量以最短的篇幅概括遇到的各种问题的结论&…

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…

深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据

1、首先,导入所需的库和模块,包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…

用向量数据库Milvus Cloud 搭建AI聊天机器人

加入大语言模型(LLM) 接着,需要在聊天机器人中加入 LLM。这样,用户就可以和聊天机器人开展对话了。本示例中,我们将使用 OpenAI ChatGPT 背后的模型服务:GPT-3.5。 聊天记录 为了使 LLM 回答更准确,我们需要存储用户和机器人的聊天记录,并在查询时调用这些记录,可以用…

Java练习 day4

一、存在重复元素 II 1、题目链接 点击跳转到题目位置 2、代码 class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer, Integer> mp new HashMap<Integer, Integer>();int n nums.length;for(int i 0; i < n; i){if…

C#WPF框架MvvMLight应用实例

本文实例演示C#WPF框架MvvMLight应用实例。 目录 一、MVVM概述 二、MVVMLight概述 三、使用MVMLight框架 一、MVVM概述 MVVM概述MVVM是Model-View-ViewModel的简写,主要目的是为了解耦视图(View)和模型(Model)。

redis的持久化消息队列

Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能&#xff0c;但它有个缺点就是消息无法…

一键AI高清换脸——基于InsightFace、CodeFormer实现高清换脸与验证换脸后效果能否通过人脸比对、人脸识别算法

前言 1、项目简介 AI换脸是指利用基于深度学习和计算机视觉来替换或合成图像或视频中的人脸。可以将一个人的脸替换为另一个人的脸,或者将一个人的表情合成到另一个人的照片或视频中。算法常常被用在娱乐目上,例如在社交媒体上创建有趣的照片或视频,也有用于电影制作、特效…

Python基础之生成器

&#xff08;一&#xff09;什么是生成器 在python中&#xff0c;想要了解什么是生成器(generator)&#xff0c;首先就需要了解什么是yield关键字。yield表达式只能函数内部或者lambda函数中使用&#xff0c;使用了yield表达式的函数即为生成器函数&#xff0c;而生成器函数返…

全屋灯具选购指南,如何选择合适的灯具。福州中宅装饰,福州装修

灯具装修指南 灯具就像我们家里的星星&#xff0c;在黑暗中带给我们明亮&#xff0c;可是灯具如果选择的不好&#xff0c;这个效果不仅体现不出来&#xff0c;还会让人觉得烦躁。 灯具到底该怎么选呢&#xff1f;装修灯具有哪些注意事项呢&#xff1f;给大家做了一个总结&#…

链式法则(Chain Rule)

定义 链式法则&#xff08;Chain Rule&#xff09;是概率论和统计学中的一个基本原理&#xff0c;用于计算联合概率分布或条件概率分布的乘积。它可以用于分解一个复杂的概率分布为多个较简单的条件概率分布的乘积&#xff0c;从而简化概率分析问题。 链式法则有两种常见的形…

Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战

Map声明、元素访问及遍历 - GO语言从入门到实战 Map 声明的方式 m := map[string]int{"one": 1, "two": 2, "three": 3} //m初始化时就已经设置了3个键值对,所以它的初始长度len(m)是3。m1 := map[string]int{} //m1被初始化为一个空的m…

C++设计模式-抽象工厂(Abstract Factory)

目录 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-抽象工厂&#xff08;Abstract Factory&#xff09; 一、意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们…