wpf mysql存储过程_MySQL存储过程的创建及调用

# SQL语句:先编译后执行

存储过程(Stored Procedure):

一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点(为什么要用存储过程?):

①将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用

②批量处理:SQL+循环,减少流量,也就是“跑批”

③统一接口,确保数据的安全

相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少。

一、存储过程的创建和调用

>存储过程就是具有名字的一段代码,用来完成一个特定的功能。

>创建的存储过程保存在数据库的数据字典中。

1、创建存储过程

CREATE

[DEFINER = { user | CURRENT_USER }]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body

proc_parameter:

[ IN | OUT | INOUT ] param_name type

characteristic:

COMMENT 'string'

| LANGUAGE SQL

| [NOT] DETERMINISTIC

| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

routine_body:

Valid SQL routine statement

[begin_label:] BEGIN

[statement_list]

……

END [end_label]

#创建数据库,备份数据表用于示例操作

mysql> create database db1;

mysql> use db1;

mysql> create table PLAYERS as select * from TENNIS.PLAYERS;

mysql> create table MATCHES as select * from TENNIS.MATCHES;

示例:创建一个存储过程,删除给定球员参加的所有比赛

mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)

mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)

-> BEGIN

->   DELETE FROM MATCHES

-> WHERE playerno = p_playerno;

-> END$$

Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;  #将语句的结束符号恢复为分号

解析:

默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀;

在定义过程时,使用DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个$$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。

2、调用存储过程:call sp_name[(传参)];

mysql> select * from MATCHES;

+---------+--------+----------+-----+------+

| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |

+---------+--------+----------+-----+------+

| 1 | 1 | 6 | 3 | 1 |

| 7 | 1 | 57 | 3 | 0 |

| 8 | 1 | 8 | 0 | 3 |

| 9 | 2 | 27 | 3 | 2 |

| 11 | 2 | 112 | 2 | 3 |

+---------+--------+----------+-----+------+

5 rows in set (0.00 sec)

mysql> call delete_matches(57);

Query OK, 1 row affected (0.03 sec)

mysql> select * from MATCHES;

+---------+--------+----------+-----+------+

| MATCHNO | TEAMNO | PLAYERNO | WON | LOST |

+---------+--------+----------+-----+------+

| 1 | 1 | 6 | 3 | 1 |

| 8 | 1 | 8 | 0 | 3 |

| 9 | 2 | 27 | 3 | 2 |

| 11 | 2 | 112 | 2 | 3 |

+---------+--------+----------+-----+------+

4 rows in set (0.00 sec)

解析:

在存储过程中设置了需要传参的变量p_playerno,调用存储过程的时候,通过传参将57赋值给p_playerno,然后进行存储过程里的SQL操作。

3、存储过程体

>存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等

>过程体格式:以begin开始,以end结束(可嵌套)

BEGIN

BEGIN

BEGIN

statements;

END

END

END

注意:每个嵌套块及其中的每条语句,必须以分号结束,表示过程体结束的begin-end块(又叫做复合语句compound statement),则不需要分号。

4、为语句块贴标签

[begin_label:] BEGIN

[statement_list]

END [end_label]

例如:

label1: BEGIN

label2: BEGIN

label3: BEGIN

statements;

END label3 ;

END label2;

END label1

标签有两个作用:

①增强代码的可读性

②在某些语句(例如:leave和iterate语句),需要用到标签

二、存储过程的参数

存储过程可以有0个或多个参数,用于存储过程的定义。

3种参数类型:

IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

1、in输入参数

mysql> delimiter $$

mysql> create procedure in_param(in p_in int)

-> begin

->   select p_in;

->   set p_in=2;

-> select P_in;

-> end$$

mysql> delimiter ;

mysql> set @p_in=1;

mysql> call in_param(@p_in);

+------+

| p_in |

+------+

| 1 |

+------+

+------+

| P_in |

+------+

| 2 |

+------+

mysql> select @p_in;

+-------+

| @p_in |

+-------+

| 1 |

+-------+

#以上可以看出,p_in在存储过程中被修改,但并不影响@p_id的值,因为前者为局部变量、后者为全局变量。

2、out输出参数

mysql> delimiter //

mysql> create procedure out_param(out p_out int)

-> begin

-> select p_out;

-> set p_out=2;

-> select p_out;

-> end

-> //

mysql> delimiter ;

mysql> set @p_out=1;

mysql> call out_param(@p_out);

+-------+

| p_out |

+-------+

| NULL |

+-------+

#因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null

+-------+

| p_out |

+-------+

| 2 |

+-------+

mysql> select @p_out;

+--------+

| @p_out |

+--------+

| 2 |

+--------+

#调用了out_param存储过程,输出参数,改变了p_out变量的值

3、inout输入参数

mysql> delimiter $$

mysql> create procedure inout_param(inout p_inout int)

-> begin

-> select p_inout;

-> set p_inout=2;

-> select p_inout;

-> end

-> $$

mysql> delimiter ;

mysql> set @p_inout=1;

mysql> call inout_param(@p_inout);

+---------+

| p_inout |

+---------+

| 1 |

+---------+

+---------+

| p_inout |

+---------+

| 2 |

+---------+

mysql> select @p_inout;

+----------+

| @p_inout |

+----------+

| 2 |

+----------+

#调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量

注意:

①如果过程没有参数,也必须在过程名后面写上小括号

例:CREATE PROCEDURE sp_name ([proc_parameter[,…]]) ……

②确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理

墙裂建议:

>输入值使用in参数;

>返回值使用out参数;

>inout参数就尽量的少用。

作者:GeaoZhang

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

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

相关文章

mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描

索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用。我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果。首先说明,关联的字段都已…

python123测验7程序题答案_Python语言程序设计 Python123 测验7: 文件和数据格式化(编程题)...

版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/weixin_42067082/article/details/97661863文本的平均列数描述:打印输出附件文件的平均列数…

mysql 多个密码登录_mysql 多实例登录密码测试

最近在做mysql 多实例的时候,采用不同的方式登录mysql数据库,发现mysql -uroot -p -h 127.0.0.1 -P3308 ,登录时居然不要密码就可以登录,吓得我一身汗,经过检查终于找到原因记录下来,给小白们参考。[rootmy…

设置MySQL排序方式_设置MySQL设置字符集和排序方式

1. 编辑/etc/my.cnf文件, 在"[client]"下添加"default-character-setutf8"2. 编辑/etc/my.cnf文件, 在"[mysqld]"下添加"default-character-setutf8"3. 重新启动mysql服务# sudo /etc/init.d/mysqld restart* 查看系统字符集和排序方式…

redhat5.4 安装mysql_Linux redhat 5.4上安装MYDNS

Linux redhat 5.4上安装MYDNS一、1,MYDNS 的简介:MyDNS是一个UNIX平台下的免费DNS服务器端软件。它被设计成直接从数据库中读取DNS记录软件,并且修改记录后也可时时生效。在MyDNS上,你可随心所欲地增加你自己的次级域名的同时建站…

mysql 5.7 flashback_Flashback for MySQL 5.7

实现原理flashback的概念最早出现于Oracle数据库,用于快速恢复用户的误操作。flashback for MySQL用于恢复由DML语句引起的误操作,目前不支持DDL语句。例如下面的语句:DELETE FROM XXX;UPDATE XXX SET YYYZZZ;若没有flashback功能&#xff0c…

给mysql数据库设计编码_MYSQL数据库编码原理

很多站长可能与织梦CMS小编一样,觉得MYSQL数据库即熟悉又神秘。熟悉是因为我们每天都会用到MYSQL进行安装织梦程序,陌生是因为mysql经常与linux联系,是基于linux系统的下的应用,而我们平常使用的都是windows主机系统。织梦CMS就基…

Java2精要_java知识精要(一)

一、java数组 (疯狂java讲义 第4.5 ~ 4.6章节)1) 声明形式:type[] arrayName; 推荐方式type arrayName[];2) 初始化:方式一:type[] arrayName;arrayName new type[] {element1, element2, element3, ...}方式二:type[] arrayName…

java的反射机制是什么_JAVA反射机制

一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。二、哪里用到反射机制 有些时候,我们用过一些知识&#xf…

java dot画图_小O的图案 (Java代码)(最简单的解法)

解题思路:注意事项:参考代码:import java.util.Scanner;public class C1788 {public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNext()) {F(sc.nextInt());}sc.close();}private static void F(int n){System.out.println(n);int len…

java inireader_java读取配置文件 Java中如何设置读取ini配置文件?

Java读取配置文件的几种方法以及路径问题看透,心静,锁份幽静,将自己填埋在那里,任窗外灯红酒绿,草长莺飞,让那颗疲惫的心,静静地栖息在流水盈盈里,抛却尘世累累。java 怎么读取web j…

java unsafe park_Java魔法类——Unsafe应用解析

前言Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java…

mysql中group by的排序问题_Mysql之group by 和order by 一起用时的排序问题

业务需求,需要查询表里不同分类下的order最大的记录。查看表中的记录:SELECT id,tid,order, FROM_UNIXTIME(yestime) FROM tfenWHERE tid IN(7512, 7514)ORDER BY order DESC ;结果如下:排序的sql语句:SELECT id,tid,order, FROM_…

java actionscript_ActionScript(对比Java)学习笔记二

27.ActionScript中的组件对象: 类似于Java中的Swing组件对象,ActionScript提供了很多组件!!(可以自行查看官网提供的组件列表学习,也可擦看已经拥有的flex3componentexplorer.pdf文档)!!(一) 容器类组件对象:这里列举了几种常见的容器组件!&a…

计算机视觉基础(12)——图像恢复

前言 我们将学习图像恢复相关知识。主要有图像恢复的定义、评价标准和实现图像恢复的方法。图像恢复任务包括图像去噪、去模糊、图像超分辨率、图像修复等;评价标准有峰值信噪比和结构相似性;图像超分辨的方法有传统方法和基于深度学习的方法&#xff1a…

java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法

前言在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作。这个神器…

java中的equals拿什么鞋的_java.中equals的使用

下面在Cat类里面重写这个继承下来的equals()方法:class Cat {int color, weight, height;public Cat(int color, int weight, int height) {this.color color;this.weight weight;this.height height;}/*** 这里是重写相等从Object类继承下来的equals()方法&…

java 弹出软键盘_Android开发之弹出软键盘工具类简单示例

本文实例讲述了Android开发之弹出软键盘工具类。分享给大家供大家参考,具体如下:package com.maobang.imsdk.util;import android.content.Context;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;import java.uti…

百度编辑器图片上传 java_百度编辑器粘贴图片自动上传到服务器(Java版)

ChromeIE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能。但是无法处理多张图片。而且转换成BASE64后是作为内容…

matlab解方java_Java:调用window的matlab遇到的问题和解决方案

描述容易报错的问题和可能原因1.java.lang.NullPointerException解决途径:window和linux的文件路径不同,window分隔符是\\,linux是/2.Exception in thread “main” java.lang.ExceptionInInitializerError解决途径:matlab生成的j…