mysql存储过程(2018.09.29学习笔记)

-- 查询数据库中的存储过程和函数

SELECT `name` FROM mysql.proc WHERE db = 'xx' AND `type` = 'PROCEDURE'   //存储过程
SELECT `name` FROM mysql.proc WHERE db = 'xx' AND `type` = 'FUNCTION'   //函数

SHOW PROCEDURE STATUS; //存储过程
SHOW FUNCTION STATUS;     //函数

-- 查看存储过程或函数的创建代码

SHOW CREATE PROCEDURE proc_name;
SHOW CREATE FUNCTION func_name;

-- 查看视图

SELECT * FROM information_schema.VIEWS   //视图
SELECT * FROM information_schema.TABLES   //表

-- 查看触发器

SHOW TRIGGERS [FROM db_name] [LIKE expr]
SELECT * FROM TRIGGERS T WHERE trigger_name=”mytrigger” \G



-- 创建存储过程

DELIMITER //
CREATE PROCEDURE proc()
BEGIN
SELECT * FROM sc;
END //

DELIMITER ;

CALL proc();

DELIMITER //
CREATE PROCEDURE countproc(OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM sc;
END //

DELIMITER ;

-- 调用存储过程
CALL countproc(@param1);

-- 查询执行结果
SELECT @param1;

-- 存储过程信息的查看

SHOW PROCEDURE STATUS;

-- 删除存储过程
DROP PROCEDURE countproc;

-- 创建存储函数
DELIMITER //
CREATE FUNCTION nameByzip()
RETURNS CHAR(50)
RETURN (SELECT sname FROM student WHERE sid = 01 );
//

-- 查询存储函数
SELECT nameByzip();

-- 存储函数信息的查看
SHOW FUNCTION STATUS;

-- 定义变量
DECLARE myparam1 INT DEFAULT 100;

-- 为变量赋值
DECLARE var1, var2, var3 INT;
SET var1 = 1,var2 = 2;
SET var3 = var1 + var2;

-- 为查询变量赋值
DECLARE stu_name CHAR(50);
DECLARE stu_id INT;

SELECT sname, sid INTO stu_name, stu_id
FROM student WHERE sid = 02;

-- 定义条件
// 方法一:使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';
// 方法二:使用mysql_error_code
DECLARE command_not_allowed CONDITION FOR 1148;

-- 定义处理程序
DECLARE handler_type HANDLER FOR condition_value

CREATE TABLE test.t(s1 INT PRIMARY KEY);

DELIMITER //

CREATE PROCEDURE handlerdemo()
 BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
  SET @X = 1;
  INSERT INTO test.t VALUES(1);
  SET @x = 2;
  INSERT INTO test.t VALUES(1);
  SET @x = 3;
END;
//

/*调用存储过程*/
CALL handlerdemo();

/*查看调用过程结果*/
SELECT @x;

-- 声明光标
DECLARE cousor_stu CURSOR FOR SELECT sid, sname FROM student;

-- 打开光标
OPEN cursor_stu;

-- 使用光标
FETCH cursor_stu INTO stu_id, stu_name;

-- 关闭光标
CLOSE cursor_stu;


-- if语句
IF @val IS NULL
 THEN SELECT 'val is null';
 ELSE SELECT 'val is not null';
END IF;


-- case语句
-- 格式1:
CASE val
 WHERE 1 THEN SELECT 'val is 1';
 WHERE 2 THEN SELECT 'val is 2';
 ELSE SELECT 'val is not 1 or 2';
END CASE;

-- 格式2:
CASE 
 WHERE val IS NULL THEN SELECT 'val is null';
 WHERE val < 0 THEN SELECT 'val is less than 0';
 WHERE val > 0 THEN SELECT 'val is greater than 0';
 ELSE SELECT 'val is 0';
END CASE;

-- loop语句
DECLARE id INT DEFAULT 0;

add_loop:LOOP
 SET id = id + 1;
  IF id >= 10 THEN LEAVE add_loop;
  END IF;
END LOOP add_loop;

-- leave语句
LEAVE lable;

add_num:LOOP
 SET @count = @count + 1;
 IF @count = 50 THEN LEAVE add_num;
END LOOP add_num;

-- iterate语句
ITERATE lable;

CREATE PROCEDURE doiterate()
BEGIN 
DECLARE p1 INT DEFAULT 0;
my_loop:LOOP
 SET p1 = p1 + 1;
 IF p1 < 10 THEN ITERATE my_loop;
 ELSEIF p1 > 20 THEN LEAVE my_loop;
 END IF;
 SELECT 'p1 is between 10 and 20';
END LOOP my_loop;
END 

-- repeat语句
DECLARE id INT DEFAULT 0;
REPEAT
 SET id = id + 1;
 UNTIL id >= 10
END REPEAT;

-- while语句
DECLARE i INT DEFAULT 0;
WHILE i < 10 DO 
 SET i = i + 1;
END WHILE;


-- 调用存储过程用 call
CALL xxxx();

-- 调用存储函数用 select
SELECT xxxx();


-- 修改存储过程和函数
ALTER {PROCEDURE | FUNCTION) sp_name [characteristic...]

sp_name 存储过程或函数名称
characteristic 参数指定的函数特性:

CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句. 
NO SQL表示子程序中不包含SQL语句。
READS SQL DATA表示子程序中包含读数据的语句。
MODIFIES SQL DATA表示子程序中包含写数据的语句。
SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行。
DEFINER表示只有定义者自己才能够执行。
INVOKER表示调用者可以执行。
COMMENT 'string'表示注释信息。

-- 例子 将countpro的读写权限改为modifies sql data,并指明调用者可以执行
ALTER PROCEDURE countpro
MODIFIES SQL DATA
SQL SECURITY INVOKER;

-- 删除存储过程和函数
DROP {PROCEDURE | FUNCTION) [IF EXISTS] sp_name

-- 例子
DROP PROCEDURE countproc;
DROP FUNCTION countproc;

本文链接:https://blog.csdn.net/oneeyear/article/details/82902276

猜你喜欢

转载自blog.csdn.net/oneeyear/article/details/82902276
今日推荐