存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

创建和调用

存储过程就是具有名字的一段代码,用来完成一个特定的功能。
创建的存储过程保存在数据库的数据字典中。

  1. CREATE
  2. [DEFINER = { user | CURRENT_USER }]
  3.  PROCEDURE sp_name ([proc_parameter[,...]])
  4. [characteristic ...] routine_body
  5. proc_parameter:
  6. [ IN | OUT | INOUT ] param_name type
  7. IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  8. OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  9. INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
  10. characteristic:
  11. COMMENT 'string'
  12. | LANGUAGE SQL
  13. | [NOT] DETERMINISTIC
  14. | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  15. | SQL SECURITY { DEFINER | INVOKER }
  16. routine_body:
  17.   Valid SQL routine statement
  18. [begin_label:] BEGIN
  19.   [statement_list]
  20.     ……
  21. END [end_label]

存储过程的查询

  1. select name from mysql.proc
  2. 或者
  3. select routine_name from information_schema.routines
  4. 或者
  5. show procedure status

MYSQL 存储过程中的关键语法

  1. 声明语句结束符,可以自定义:

    1. DELIMITER $$
    2. DELIMITER //
  2. 声明存储过程:
    CREATE PROCEDURE demo_in_parameter(IN p_in int)

  3. 存储过程开始和结束符号:
    BEGIN .... END

  4. 变量赋值:
    SET @p_in=1

  5. 变量定义:
    DECLARE l_int int unsigned default 4000000;

删除存储过程:DROP PROCEDURE IF EXISTS name;
调用存储过程:EXECUTE Procedure_name name

示例

只返回单一记录集的存储过程

默认情况下,delimiter是分号;当有多个语句,且语句中包含有分号时,可以用delimiter,把delimiter后面换成其它符号,如//或$$。此时,delimiter作用就是对整个小段语句做一个简单的封装。

  1. -------------创建名为GetUserAccount的存储过程----------------
  2. DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
  3. create Procedure getnote()
  4. BEGIN
  5. select * from test;
  6. END
  7. $$
  8. DELIMITER ; #将语句的结束符号恢复为分号
  9. -------------执行上面的存储过程----------------
  10. exec GetUserAccount
  11. call GetUserAccount

IN参数

  1. DELIMITER $$
  2. create Procedure getnote1(IN test_id INTEGER)
  3. BEGIN
  4. select * from test where id=test_id;
  5. END
  6. $$
  7. DELIMITER ;