創建過程和創建函數的語法
CREATE PROCEDURE and CREATE FUNCTION Syntax
先給出測試用表
//測試用表
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=215 DEFAULT CHARSET=utf8;
//官方文檔
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement
上面就是官方給出的存儲過程和自定義函數的語法模板。
創建存儲過程的例子:
//創建存儲過程simpleproc
CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM t_user;
END;
- simpleproc 該存儲過程的名字
- OUT param1 INT, param1是參數,out表示param1是輸出變量, int表示param1的數據類型
- begin與end之間是執行的語句
創建完成之後,就可以調用該存儲過程
//調用存儲過程
CALL simpleproc(@a);
SELECT @a;
創建函數的例子:
CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
RETURN CONCAT('Hello ',s,'!');
- hello是該函數的名字
- s是參數的名字,CHAR(20)指定參數的數據類型和最大長度
- RETURNS CHAR(50)指定返回值的數據類型和最大長度
- CONCAT(‘Hello ‘,s,’!’);即將”Hello “, s, “!”拼接後返回
調用該函數
SELECT hello('world');
下面給出幾個創建不同類型的存儲過程的例子
1.帶IN參數
//IN參數的
DROP PROCEDURE IF EXISTS sp_in;
CREATE PROCEDURE sp_insert(IN param CHAR(20))
BEGIN
INSERT INTO t_user(id, name) VALUES (NULL, param);
END;
調用代碼:
CALL sp_in('小小');
2.OUT參數
DROP PROCEDURE IF EXISTS sp_out;
CREATE PROCEDURE sp_out(OUT param CHAR(20))
BEGIN
SELECT `name` INTO param FROM t_user LIMIT 1;
END;
調用代碼:
SET @p = '';
CALL sp_out(@p);
SELECT @p;
3.INOUT參數
DROP PROCEDURE IF EXISTS sp_inout;
CREATE PROCEDURE sp_inout(INOUT param CHAR(20))
BEGIN
SELECT `name` INTO param FROM t_user WHERE id = param;
END;
調用代碼:
SET @p = '1';
CALL sp_out(@p);
SELECT @p;
4.其他(多參數)
//多IN參數的創建
DROP PROCEDURE IF EXISTS sp_moreParam1;
CREATE PROCEDURE sp_moreParam1(IN param1 INT,param2 CHAR(20))
BEGIN
INSERT INTO t_user VALUES (param1, param2);
END;
//調用
SET @id = 100;
SET @pp = '小明';
CALL sp_moreParam(@id, @pp);
//IN參數和OUT參數
//創建
DROP PROCEDURE IF EXISTS sp_moreParam2;
CREATE PROCEDURE sp_moreParam2(IN param1 INT, OUT param2 CHAR(20))
BEGIN
SELECT `name` INTO param2 FROM t_user WHERE id = param1;
END;
//調用
SET @id = 100;
SET @pp = '';
CALL sp_moreParam2(@id, @pp);
SELECT @pp;