38、MySQL-操作存储过程和函数

一、调用存储过程和函数
     调用存储过程格式:
      CALL 存储过程名 (参数)
     
           — 调用存储过程
mysql> CALL sp_demo1();
+----+-----------+------+---------+--------+-------+------+
| id | username | age | salary | sex | depId | pId |
+----+-----------+------+---------+--------+-------+------+
| 1 | 张三 | 21 | 5432.12 | 男 | 1 | 1 |
| 2 | 李四 | 32 | 6432.00 | 男 | 2 | 2 |
| 3 | 王五 | 26 | 5932.92 | 女 | 3 | 3 |
| 4 | 赵六 | 32 | 6232.14 | 男 | 4 | 4 |
| 5 | Mr Adword | 55 | 9432.99 | 男 | 4 | 5 |
| 6 | 田七 | 19 | 4932.92 | 保密 | 1 | 3 |
| 7 | 孙八 | 62 | 9932.14 | 男 | 2 | 4 |
| 8 | Mr lili | 45 | 9132.99 | 女 | 1 | 5 |
+----+-----------+------+---------+--------+-------+------+
— 使用@临时变量,保存输出结果
mysql> CALL age_from_employee(3,@userAge);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT @userAGE;
+----------+
| @userAGE |
+----------+
| 26 |
+----------+
     
— 调用存储函数,和调用系统函数的方式一样
mysql> SELECT username_from_employee(6);
+---------------------------+
| username_from_employee(6) |
+---------------------------+
| 田七 |
+---------------------------+


二、查看创建好的存储过程和函数
1、查看存储过程/函数状态
      SHOW PROCEDURE STATUS LIKE ‘存储过程名'
      SHOW FUNCTION STATUS LIKE ‘函数名'
mysql> SHOW PROCEDURE STATUS LIKE 'age_from_employee'\G;
*************************** 1. row ***************************
Db: learndb1
Name: age_from_employee
Type: PROCEDURE
Definer: root@localhost
Modified: 2015-03-08 14:14:51
Created: 2015-03-08 14:14:51
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.01 sec)

mysql> SHOW FUNCTION STATUS LIKE 'username_from_employee'\G;
*************************** 1. row ***************************
Db: learndb1
Name: username_from_employee
Type: FUNCTION
Definer: root@localhost
Modified: 2015-03-08 14:24:26
Created: 2015-03-08 14:24:26
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.01 sec)
2、查看存储过程/函数详细语法
     SHOW CREATE PROCEDURE ‘存储过程名'
     SHOW CREATE FUNCTION ‘函数名'
mysql> SHOW CREATE PROCEDURE age_from_employee\G;
*************************** 1. row ***************************
Procedure: age_from_employee
sql_mode: NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `age_from_employee`(IN user_id INT,OUT user_age INT)
READS SQL DATA
BEGIN
SELECT age INTO user_age FROM employee WHERE id=user_id;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci

mysql> SHOW CREATE FUNCTION username_from_employee\G;
*************************** 1. row ***************************
Function: username_from_employee
sql_mode: NO_ENGINE_SUBSTITUTION
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `username_from_employee`(user_id INT) RETURNS varchar(20) CHARSET utf8 COLLATE utf8_unicode_ci
BEGIN
RETURN(SELECT username FROM employee WHERE id=user_id);
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci
1 row in set (0.00 sec)

     存储过程和函数也存放在 information_schema数据库的 ROUTINES数据表中

mysql> USE information_schema;
mysql> SELECT * from ROUTINES \G;
*************************** 1. row ***************************
SPECIFIC_NAME: age_from_employee
ROUTINE_CATALOG: def
ROUTINE_SCHEMA: learndb1
ROUTINE_NAME: age_from_employee
ROUTINE_TYPE: PROCEDURE
DATA_TYPE:
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
DTD_IDENTIFIER: NULL
ROUTINE_BODY: SQL
ROUTINE_DEFINITION: BEGIN
SELECT age INTO user_age FROM employee WHERE id=user_id;
END
EXTERNAL_NAME: NULL
EXTERNAL_LANGUAGE: NULL
PARAMETER_STYLE: SQL
IS_DETERMINISTIC: NO
SQL_DATA_ACCESS: READS SQL DATA
SQL_PATH: NULL
SECURITY_TYPE: DEFINER
CREATED: 2015-03-08 14:14:51
LAST_ALTERED: 2015-03-08 14:14:51
SQL_MODE: NO_ENGINE_SUBSTITUTION
ROUTINE_COMMENT:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_unicode_ci
*************************** 2. row ***************************
SPECIFIC_NAME: sp_demo1
ROUTINE_CATALOG: def
ROUTINE_SCHEMA: learndb1
ROUTINE_NAME: sp_demo1
ROUTINE_TYPE: PROCEDURE
DATA_TYPE:
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
DTD_IDENTIFIER: NULL
ROUTINE_BODY: SQL
ROUTINE_DEFINITION: BEGIN
SELECT * FROM employee;
END
EXTERNAL_NAME: NULL
EXTERNAL_LANGUAGE: NULL
PARAMETER_STYLE: SQL
IS_DETERMINISTIC: NO
SQL_DATA_ACCESS: CONTAINS SQL
SQL_PATH: NULL
SECURITY_TYPE: DEFINER
CREATED: 2015-03-08 14:07:27
LAST_ALTERED: 2015-03-08 14:07:27
SQL_MODE: NO_ENGINE_SUBSTITUTION
ROUTINE_COMMENT:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_unicode_ci
*************************** 3. row ***************************
SPECIFIC_NAME: username_from_employee
ROUTINE_CATALOG: def
ROUTINE_SCHEMA: learndb1
ROUTINE_NAME: username_from_employee
ROUTINE_TYPE: FUNCTION
DATA_TYPE: varchar
CHARACTER_MAXIMUM_LENGTH: 20
CHARACTER_OCTET_LENGTH: 60
NUMERIC_PRECISION: NULL
NUMERIC_SCALE: NULL
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: utf8
COLLATION_NAME: utf8_unicode_ci
DTD_IDENTIFIER: varchar(20)
ROUTINE_BODY: SQL
ROUTINE_DEFINITION: BEGIN
RETURN(SELECT username FROM employee WHERE id=user_id);
END
EXTERNAL_NAME: NULL
EXTERNAL_LANGUAGE: NULL
PARAMETER_STYLE: SQL
IS_DETERMINISTIC: NO
SQL_DATA_ACCESS: CONTAINS SQL
SQL_PATH: NULL
SECURITY_TYPE: DEFINER
CREATED: 2015-03-08 14:24:26
LAST_ALTERED: 2015-03-08 14:24:26
SQL_MODE: NO_ENGINE_SUBSTITUTION
ROUTINE_COMMENT:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_unicode_ci
3 rows in set (0.01 sec)

三、修改创建好的存储过程和函数
      ALTER  PROCEDURE ‘存储过程名’ 。。。
     ALTER  FUNCTION ‘存储过程名’ 。。。

-- 添加注释
mysql> ALTER FUNCTION username_from_employee COMMENT '通过用户id查找用户名';
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW CREATE FUNCTION username_from_employee\G;
*************************** 1. row ***************************
Function: username_from_employee
sql_mode: NO_ENGINE_SUBSTITUTION
Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `username_from_employee`(user_id INT) RETURNS varchar(20) CHARSET utf8 COLLATE utf8_unicode_ci
COMMENT '通过用户id查找用户名'
BEGIN
RETURN(SELECT username FROM employee WHERE id=user_id);
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_unicode_ci

四、删除存储过程和函数
     DROP PROCEDURE ‘存储过程名’;
     DROP FUNCTION ‘存储过程名’ ;

mysql> DROP PROCEDURE sp_demo1;
mysql> SHOW CREATE FUNCTION sp_demo1;
ERROR 1305 (42000): FUNCTION sp_demo1 does not exist

猜你喜欢

转载自blog.csdn.net/li460998973/article/details/44173691