存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
存储过程就是具有名字的一段代码,用来完成一个特定的功能。
创建的存储过程保存在数据库的数据字典中。
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
select name from mysql.proc
或者
select routine_name from information_schema.routines
或者
show procedure status
声明语句结束符,可以自定义:
DELIMITER $$
或
DELIMITER //
声明存储过程:CREATE PROCEDURE demo_in_parameter(IN p_in int)
存储过程开始和结束符号:BEGIN .... END
变量赋值:SET @p_in=1
变量定义:DECLARE l_int int unsigned default 4000000;
删除存储过程:DROP PROCEDURE IF EXISTS name;
调用存储过程:EXECUTE Procedure_name name
默认情况下,delimiter是分号;当有多个语句,且语句中包含有分号时,可以用delimiter,把delimiter后面换成其它符号,如//或$$。此时,delimiter作用就是对整个小段语句做一个简单的封装。
-------------创建名为GetUserAccount的存储过程----------------
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create Procedure getnote()
BEGIN
select * from test;
END
$$
DELIMITER ; #将语句的结束符号恢复为分号
-------------执行上面的存储过程----------------
exec GetUserAccount
call GetUserAccount
DELIMITER $$
create Procedure getnote1(IN test_id INTEGER)
BEGIN
select * from test where id=test_id;
END
$$
DELIMITER ;