mysql存儲過程與函數------創建存儲過程與函數

創建過程和創建函數的語法

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;
發佈了32 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章