mysql——定义——存储过程和函数——概念

Wesley13
• 阅读 587
存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当作一个整体存储在服务器中



一、创建存储过程


语法格式:

create procedure sp_name ( [ proc_parameter[……] ] )

   [ characteristic…… ] routine_body


sp_name:存储过程的名称;

proc_parameter:存储过程的参数列表;

characteristic:指定存储过程的特性;

routine_body:是SQL代码的内容。


注意:可以用begin……end来标志SQL代码的开始和结束。

-------------------------------------------------------------------------

proc_parameter:存储过程的参数列表;

proc_parameter中的每一个参数由3个部分组成。这3部分分别是  输入输出类型、参数名称、参数类型。


形式如下:


[ IN | OUT | INOUT ]  param_name type


IN:表示输出参数;

OUT:表示输出参数;

INOUT:表示既可以是输入,也可以是输出;



param_name:表示存储过程的参数名称;


type:指定存储过程的参数类型,该类型可以是mysql数据库的任意数据类型;

------------------------------------------------------------------------
------------------------------------------------------------------------

characteristic:指定存储过程的特性;


characteristic参数有多个取值。说明如下:



LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统的默认的语言;


+++++++++++++++++++


[ NOT ] DETERMINISTIC:指明存储过程的执行结果是否是确定的。


        DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。


        NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。


        默认情况下,结果是非确定的,


++++++++++++++++++++++++


{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATE }:指明子程序使用SQL语句的限制。


CONTAINS SQL:表示子程序包含SQL语句,但不包含读或写数据的语句;

NO SQL:表示子程序中不包含SQL语句;

READS SQL DATA:表示子程序中包含读数据的语句;

MODIFIES SQL DATE:表示子程序中包含写数据的语句。


默认情况下:系统会自定为:CONTAINS SQL


+++++++++++++++++++


SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。

DEFINER:表示只有定义者自己才能执行;

INVOKER:表示调用者可以执行;


默认情况下,系统指定的权限是DEFINER

++++++++++++++++++++++++++++++++++++++++++

COMMENT'string':注释信息



------------------------------------------------------------------------
------------------------------------------------------------------------



注意:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是如果存储过程中没有使用SQL语句;

      最好设置为NO SQL。而且,存储过程中,最好在COMMENT部分对存储过程进行简单注释。

===========================================================================================
===========================================================================================
===========================================================================================

举例:


create procedure num_from_employee( IN emp_id INT,OUT count_num INT )

reads sql date

begin

       select count(*) into count_num from employee where d_id = emp_id;

end



具体执行程序:

delimiter&&

create procedure num_from_employee( IN emp_id INT,OUT count_num INT )

READS SQL DATA

begin

       select count(*) into count_num from employee where d_id = emp_id;

end &&

delimiter ;




二 创建存储函数

语法格式:

create function sp_name ( [func_parameter[,……]] )

returns type

[ characteristic……] routine_body



sp_name:存储函数的名称;


func_parameter:存储函数的参数列表;


returns type:指定返回值的类型;


characteristic:指定存储函数的特性,该参数的取值和存储过程的取值一样的;


routine_body:是SQL代码的内容,可以用BEGIN……END来标志SQL代码的开始和结束。



=================================================================================

举例:

create function name_from_employee ( emp_id int )

returns varchar(20)

begin

     return ( select name from employee where num = emp_id );

end


具体执行程序:

delimiter &&

create function name_from_employee ( emp_id int )

returns varchar(20)

begin

     return ( select name from employee where num = emp_id );

end &&

delimiter;PS:注意:MYSql中默认的语句结束符号为分号 ;  存储过程中的SQL语句需要分号来结束。为了避免冲突,首先用DELIMITER&& 将mysql的结束符号设置为&&,最后再改过来。       存储函数也是一样。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这