MySQL存储过程之函数及元数据

1.创建函数

 1 CREATE FUNCTION factorial (n DECIMAL(3,0))      
 2     RETURNS DECIMAL(20,0)
 3     DETERMINISTIC
 4 BEGIN  
 5     DECLARE factorial DECIMAL(20,0) DEFAULT 1;
 6     DECLARE counter DECIMAL(3,0);
 7     SET counter = n;  
 8     factorial_loop: REPEAT
 9         SET factorial = factorial * counter;
10         SET counter = counter - 1;
11         UNTIL counter = 1
12     END REPEAT;
13     RETURN factorial;
14 END // 

  函数跟过程很相似,唯一需要指出的语法上的不同:创建函数后必须有RETURN语句指定返回值类型并返回相应类型的值.下面是函数使用的例子:

1 INSERT INTO t VALUES (factorial(pi)) //
2 SELECT s1, factorial (s1) FROM t //
3 UPDATE t SET s1 = factorial(s1)  WHERE factorial(s1) < 5 //

  注意在函数中访问表,这使得函数不如存储过程强大,以下是不能出现在函数中的限制:

ALTER ‘CACHE INDEX‘ CALL COMMIT CREATE DELETE
DROP ‘FLUSH PRIVILEGES‘ GRANT INSERT KILL
LOCK OPTIMIZE REPAIR REPLACE REVOKE
ROLLBACK SAVEPOINT ‘SELECT FROM table‘
‘SET system variable‘ ‘SET TRANSACTION‘
SHOW ‘START TRANSACTION‘ TRUNCATE UPDATE

  以下指令是可以出现在函数中的:

‘BEGIN END‘
DECLARE
IF
ITERATE
LOOP
REPEAT
RETURN
‘SET declared variable‘
WHILE 

2. Metadata元数据

  我们创建的过程或函数,都会保存在MySQL数据库中.如果要查看MySQL实际上保存了什么信息,有以下四种方法,分别是两个SHOW和两个SELECT语句:

  1) Show: mysql> show create procedure p6//

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

| Procedure | sql_mode |            Create Procedure                                              |

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

|      p6      |                | CREATE PROCEDURE `db5`.`p6`(out p | int) set p = -5 |

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

  这同SHOW CREATE TABLE及其他类似MySQL语句一样.它并不返回你创建过程时设定的返回值,但大部分情况下已经够用了.

  2) Show: mysql> SHOW PROCEDURE STATUS LIKE ‘p6‘//  第二种获得无数据信息的方法是执行SHOW PROCEDURE STATUS,这种方法可以返回更多信息的细节.

  3) SELECT from mysql.proc: SELECT * FROM mysql.proc WHERE name = ‘p6‘//  这种方法提供的信息是最多的.

  4) SELECT from information_schema:

1 mysql    > SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM  INFORMATION_SCHEMA.COLUMNS
2         -> WHERE TABLE_NAME = ‘ROUTINES‘;// 

  这是被推荐的方式,因为其他方式可能会出现错误:

  1) 其他DBMS如SQL Server 2000,使用information_schema,只有MySQL才有SHOW方式.

  2) 我们访问mysql.proc的权限是没有保证的,但有访问information_schema视图的权限,每个用户都有隐式的对当局者迷information_schema数据库的SELECT权限.

  3) SELECT功能很多,可以计算表达式,分组,排序,产生可以获取信息的结果集.而这些功能SHOW没有.

  下面是使用该方法的例子,首先使用SELECT information_schema来显示information_schema例程中有哪些列:

1 mysql    > SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM  INFORMATION_SCHEMA.COLUMNS
2         -> WHERE TABLE_NAME = ‘ROUTINES‘;// 

  执行以上指令后会输出结果如下:

TABLE_NAME COLUMN_NAME COLUMN_TYPE
ROUTINES SPECIFIC_NAME  varchar(64)
ROUTINES ROUTINE_CATALOG longtext
ROUTINES ROUTINE_SCHEMA varchar(64)
ROUTINES ROUTINE_NAME varchar(64)
ROUTINES ROUTINE_TYPE varchar(9)
ROUTINES DTD_IDENTIFIER varchar(64)
ROUTINES ROUTINE_BODY varchar(8)
ROUTINES ROUTINE_DEFINITION longtext
ROUTINES EXTERNAL_NAME varchar(64)
ROUTINES EXTERNAL_LANGUAGE varchar(64)
ROUTINES PARAMETER_STYLE varchar(8)
ROUTINES IS_DETERMINISTIC varchar(3)
ROUTINES SQL_DATA_ACCESS varchar(64)
ROUTINES SQL_PATH varchar(64)
ROUTINES SECURITY_TYPE varchar(7)
ROUTINES CREATED varbinary(19)
ROUTINES LAST_ALTERED varbinary(19)
ROUTINES SQL_MODE longtext
ROUTINES ROUTINE_COMMENT varchar(64)
ROUTINES DEFINER varchar(77)

  知道了上面的表结构,就可以查询我们想要得到的信息,如下代码可查看数据库db6中定义的存储过程:

1 mysql    > SELECT COUNT(*) FROM INFORMATION_SCHEMA.ROUTINES
2         -> WHERE ROUTINE_SCHEMA = ‘db6‘;//    

ROUTINE_DEFINITION列的访问控制

  在INFORMATION_SCHEMA中的ROUTINE_DEFINITION列是由过程或函数组成过程体获得的,因可能存在敏感信息而只对过程创建者可见.

  CURRENT_USER<>INFORMATIN_SCHEMA.ROUTINES.DEFINER:如果对它使用SELECT的用户不是创建它的用户,则MySQL将返回null值,而不是ROUTINE_DEFINITION列.

SHOW PROCEDURE STATUS中的辅助子句

  既然已列出INFORMATION_SCHEMA.ROUTINES中的列,就可以回去解释SHOW PROCEDURE STATUS的新细节:语法是: SHOW PROCEDURE STATUS [WHERE condition]; .特别注意的部分是:在WHERE子句中你必须使用INFORMATION_SCHEMA列的名字,结果显示的是SHOW PROCEDURE STATUS字段的名字.例如:

1 mysql> SHOW PROCEDURE STATUS WHERE Db = ‘p‘;
2 /*ERROR 1054 (42S22): Unknown column ‘Db‘ in ‘where clause‘*/
3 mysql> SHOW PROCEDURE STATUS WHERE ROUTINE_NAME = ‘p‘; 
时间: 2024-10-28 13:32:01

MySQL存储过程之函数及元数据的相关文章

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySql存储过程、函数

存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输.一.存储过程1.1.基本语法 CREATE PROCEDURE sp_name ([proc_parameter[,...]])     [characteristic ...] routine_body Sp_name:存储过程的名称,

7 MySQL存储过程和函数

目录: 1. 存储过程和函数概述2. 准备工作3. 存储过程操作4. 创建带参存储过程5. 查看存储过程 1. 存储过程和函数概述 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 存储过程和函数都是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输. 存储过程和函数的区别在于函数必须有返回值,而存储过程没有,存储过程的参

九、MySQL存储过程和函数

存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理. 9.1.创建存储过程和函数 存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别是CREATE PROCEDURE和CREATE FUNCTION.使用CALL语句来调用存储过程,只能用输出变量返回值.函数可以从语句外调用( 即通过引用函数名),也能返回标量值.存储过程也能调用其他存储过程. 创建存储过程 创建存储过程,需要使用CREATE PROCEDURE语句,基本语法为: CREAT

MySql存储过程与函数

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来运行已经定义好的SQL语句.存储过程和函数能够避免开发者反复的编写同样的SQL语句.而且,存储过程和函数是在MySQLserver中存储和运行的.能够降低client和server端的传输数据. 一.存储过程 1.1.基本的语法 CREATE PROCEDURE sp_name ([proc_param

mysql存储过程和函数的操作

MySQL在5.0版本开始有存储过程功能: 存储过程和函数是事先经过编译并存储在数据库中的一条SQL语句集合: 存储过程和函数的区别:函数必须有返回值,存储过程则没有: 1.1 创建存储过程语法形式 delimiter $$ create procedure procedure_name ([procedure_paramter,]) [characteristic...] routine_body $$ delimter ; 注:procedure_paramter为参数,可有可无,形式为:

mysql 存储过程,函数,触发器

存储过程和函数 mysql> HELP CREATE PROCEDURE; Name: 'CREATE PROCEDURE' Description: Syntax: CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUN

MYSQL存储过程,函数,光标

存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 其中,sp_name参数是存储过程的名称:proc_parameter表示存储过程的参数列表: characteristic参数指定存储过程的特性:routine_body参数是SQL代码的内容,可以用BEGIN-END来标志SQL代码的开始和结束. proc_paramete

12.Mysql存储过程和函数

12.存储过程和函数12.1 什么是存储过程和函数存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输,有利于提高数据的处理效率.存储过程和函数的区别: 函数必须有返回值,而存储过程没有: 存储过程的参数类型可以是IN.OUT.INOUT,而函数的参数类型只能是IN: 函数一般通过select语句调用,存储过程通过call命令调用: 函数中只能进行select操作,存储过程中可进行select\ins