**1.存储过程**
delimiter $
drop procedure if exists p1
create procedure p1(idn varchar(30))
begin
select name from t1
where id = idn;
end;
delimiter ;
**2.函数**
delimiter $
drop function if exists f1
create function f1(name varchar(100))
begin
declare str varchar(50) default '';
set @names = name;
set str = concat("create table",@names,"(id int,name varchar(20));");
return str;
end $
delimiter ;
/*
MySQL定义变量的分类:
1.局部变量
mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块;
其作用域仅限于该语句块;
局部变量的设置方式
declare var_name [, var_name]... data_type [ DEFAULT value ] ;
set语句语法形式set var_name=expr [, var_name=expr]...; set语句既可以用于
局部变量的赋值,也可以用于用户变量的申明并赋值
declare c int default 0;
set c=a+b;
select c as C;
或者用select …. into…形式赋值
select into 语句句式:select col_name[,...] into var_name[,...] table_expr
[where...];
在调用存储过程时,以declare声明的变量都会被初始化为null
2.用户变量
mysql用户变量,mysql中用户变量不用提前申明,在用的时候直接用“@变量名”使用就可以了;
其作用域为当前连接;
定义用户变量有以下两种方式:
用户变量的变量名的形式为@varname的形式
名字必须以@开头
set @num=1; 或set @num:=1;
select @num:=1; 或 select @num:=字段名 from 表名 where … ;
如果这个查询返回多个值的话,那@name变量的值就是最后一条记录的
password字段的值;
用户变量可以作用于当前整个连接,但当当前连接断开后,其所定义的用户变
量都会消失;
**注意**:对用户变量赋值有两种方式,一种是直接用”=”号,另一种是用”:=”
号。其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当
使用select语句对用户变量进行赋值时,只能使用”:=”方式,因为在select语句
中,”=”号被看作是比较操作符 ;set语句还可以设置会话变量和全局变量;
3.系统变量 -->系统变量又分为全局变量与会话变量
全局变量在MySQL启动的时候由服务器自动将它们初始化为默认
值,这些默认值可以通过更改my.ini这个文件来更改;
会话变量在每次建立一个新的连接的时候,由MySQL来初始化;
MySQL会将当前所有全局变量的值复制一份。来做为会话变量;
也就是说,如果在建立会话以后,没有手动更改过会话变量与全局
变量的值,那所有这些变量的值都是一样的;
全局变量与会话变量的区别就在于,对全局变量的修改会影响到整
个服务器,但是对会话变量的修改,只会影响到当前的会话(也
就是当前的数据库连接);
有些系统变量的值是可以利用语句来动态进行更改的,但是有些系
统变量的值却是只读的;对于那些可以更改的系统变量,我们可以
利用set语句进行更改;
不过要想更改全局变量的值,需要拥有super权限 ;
系统变量在变量名前面有两个@;
{
3.1. 会话变量
mysql会话变量,服务器为每个连接的客户端维护一系列会话变量;
其作用域仅限于当前连接,即每个连接中的会话变量是独立的;
set session varname = value;
set @@session.varname = value;
set var_name = value;
查看所有的会话变量
show session variables;
查看一个会话变量
select @@var_name;
select @@session.var_name;
show session variables like "%var%";
session可以用local来代替
3.2.全局变量
mysql全局变量,全局变量影响服务器整体操作;
当服务启动时,它将所有全局变量初始化为默认值;
要想更改全局变量,必须具有super权限;
其作用域为server的整个生命周期;
set global var_name = value;
set @@global.var_name = value;
查看所有的全局变量
show global variables;
要想查看一个全局变量,有如下两种方式:
select @@global.var_name;
show global variables like “%var%”;
// 若不指定关键字global、local、session,则默认使用session
}
**注意**:在调用存储过程时,以declare声明的变量(**局部变量**)都会被初始
化为null;
而以@开头的变量(**会话变量**)则不会被再初始化,在一个会话内,只须初始
化一次,之后在会话内每次对变量值的更改都只是对计算结果的保存,就相当
于是这个会话内的全局变量;
set和declare的区别:
set 不需要声明类型,declare必须指定类型;
set 位置可以任意, declare 必须在复合语句的开头,在任何其它语句之前;
存储过程的调用 call procedure_name(parameters);
当调用带**out参数**的存储过程时,可以定义一个用户变量作为该参数的实参;
函数调用 select function_name(parameters);
mysql的concat函数拼接字符串时,如果有一个字符串为空,则结果为空;
系统变量不能以**select into**的形式赋值;
元数据:描述数据属性(property)的信息,亦可称为描述数据的数据;
*/