저장 프로 시저
분류
저장된 루틴
기본적으로 일부 실행 가능한 명령문도 캡슐화하지만 호출 방식은 显示调用
. 스토어드 루틴은 스토어드 함수와 스토어드 프로 시저로 나눌 수 있습니다. 이 둘의 차이점은 다음과 같습니다.
저장 기능 | 저장 프로 시저 | |
---|---|---|
반환 문 | 있어야한다 | 당신은 |
반환 값 수 | 1 조각 | > = 1 |
매개 변수 유형 | 에 | in (기본값) out inout |
디스플레이 | 실행 중 선택이 표시되지 않습니다. | 실행 중 선택이 표시됩니다. |
이전 | 표현식 및 SQL 문에서 직접 호출 가능 | 호출을 표시하는 데 CALL 문만 사용할 수 있습니다. |
그 중에서 스토어드 프로 시저에는는 필요하지 않지만 返回值
스토어드 함수에는 返回值
. 또한 쿼리 문을 실행하는 동안 저장 프로 시저에서 생성 된 모든 결과 집합이 모두 클라이언트에 표시됩니다.
저장 기능
-
정의
CREATE FUNCTION 存储函数名称([参数名 数据类型]组成的参数列表) comment ‘函数的注释说明’ RETURNS 返回值类型 BEGIN 函数体内容 -- 函数体中,每条语句都要以分号;结尾 -- 函数体内容可以包含: -- 1. SQL语句,如: -- 2. 变量定义(此时变量的定义用declare,不加@)和赋值 DECLARE 变量名 数据类型 [DEFAULT 默认值]; -- 不声明默认值时,默认值为NULL set 变量名 = 变量/值; -- 3. 流程控制语句 -- 3.1 条件语句 if 布尔表达式 then 处理语句 elseif 布尔表达式 then 处理语句 else 处理语句 end if; -- 3.2 循环语句 -- 方式1 while 布尔表达式 do 循环语句 end while; -- 方式2 repeat 循环语句 until 布尔表达式 end repeat; -- 方式3 循环标记:loop 循环语句 leave 循环标记; -- leave语句一般和判断语句一起用,用来退出循环 end loop 循环标记 END
예:
create function avg_score(s varchar(100)) return double begin declare c int default 1; set c = s; return (select avg(score) from student_score where subject = s) end $
-
이전
사용자 정의 함수는 시스템 내장 함수와 동일한 방식으로 사용됩니다. 직접
函数名()
에
-
전망
-- 查看定义的函数有哪些 SHOW FUNCTION STATUS [LIKE 需要匹配的函数名] -- 查看某个函数的具体定义 SHOW CREATE FUNCTION 函数名
-
지우다
DROP FUNCTION 函数名
저장 프로 시저
-
정의
CREATE PROCEDURE 存储过程名称([参数类型 参数名 数据类型]组成的参数列表) -- 存储过程的参数类型有三种:in out inout -- in:实参可为常量/变量;实参为变量时,只能向外赋值,不能被赋值(即in型参数的值不会被存储过程更改) -- out:实参只能是变量;实参不能向外赋值,只能被赋值 -- inout:实参只能是变量;实参既可向外赋值,又可被赋值 BEGIN 需要执行的语句,可包含内容和存储函数是一样的。 END
예:
create procedure t1_operation(m1_value int, n1_value char(1)) begin select * from t1; insert into t1(m1,n1) values(m1_value,n1_value); select * from t1; end $
-
이전
call 存储过程([参数列表]);
-
전망
-- 查看定义的存储过程有哪些 SHOW PROCEDURE STATUS [LIKE 需要匹配的函数名] -- 查看某个存储过程的详细定义 SHOW CREATE PROCEDURE 存储过程名称
-
지우다
DROP PROCEDURE 存储过程名称
방아쇠
트리거의 기능은 특정 테이블에서 작업 (추가, 삭제 및 수정)이 수행되기 전이나 후에 트리거 작업 自动地
(즉, 서버에서 암시 적으로 호출 됨 )을 수행하는 것 操作所涉及的记录
입니다.
-
정의
-- 竖线"|"分隔的语句表示必须在给定的选项中选取一个值 CREATE TRIGGER 触发器名 {BEFORE|AFTER} { INSERT|DELETE|UPDATE} ON 表名 FOR EACH ROW BEGIN 触发器操作 END
CREATE TRIGGER 触发器名
트리거 이름에 대한 일반적인 이름 지정 규칙은 "b / a"+ "i / d / u"+ "_"+ "테이블 이름"입니다 (예 : bi_t1). 이는 이전 삽입 유형 트리거가 테이블 t1에 대해 설정됨을 의미합니다. .
BEFORE AFTER
INSERT DELETE UPDATE
MySQL은 현재 INSERT, DELETE 및 UPDATE의 세 가지 유형의 문에 대한 트리거 설정 만 지원합니다.
FOR EACH ROW
트리거 범위가
增删改操作涉及的记录
- INSERT의 경우 FOR EACH ROW의 영향을받는 레코드는 삽입 할 새 레코드입니다.
- DELETE 및 UPDATE의 경우 FOR EACH ROW의 영향을받는 레코드는 WHERE 조건을 충족하는 레코드입니다 (문에 WHERE 조건이 없으면 모든 레코드를 의미 함).
BEGIN ... END
트리거가 수행해야하는 작업을 나타냅니다. 그 중에서
不能有输出结果集相关的语句
선택과 같은.또한 트리거는 및를 사용
"new"
하여"old"
존재하지 않고 원래 테이블에 이미 존재하는 레코드를 표시합니다. 그들 중- INSERT 문에 의해 설정된 트리거의
NEW
경우 삽입 될 레코드를 나타내며 사용되지 않습니다OLD
. - DELETE 문에 의해 설정된 트리거의
OLD
경우 삭제 전 레코드를 나타내며 사용되지 않습니다NEW
. - UPDATE 문에 의해 설정된 트리거의 경우
NEW
수정 후 레코드와OLD
수정 전 레코드를 나타냅니다 .
예 :
create trigger bi_ti before insert on t1 for each row begin if new.m1<1 then set new.m1 =1; elseif new.m1>10 then set new.m1 = 10; end if; end $
-
이전
트리거 호출은 테이블이 추가, 삭제 또는 수정 될 때 실행됩니다
自动
. -
전망
-- 查看数据库中有哪些触发器 show triggers -- 查看某个触发器的定义 show create trigger 触发器名;
-
지우다
drop trigger 触发器名;
행사
이벤트는 구현 될 수 있습니다 自动地
(암시 적으로 서버에서 호출입니다), 某个时间点
또는 某隔一段时间
한 번에 특정 명령을 실행합니다.
-
정의
CREATE EVENT 事件名 ON SCHEDULE {AT 某个确定的时间点 | EVERY 期望的时间间隔 [STARTS datetime][END datetime]} DO BEGIN 具体的语句 END
예:
-- 指定某个时间点执行 CREATE EVENT insert_t1 ON SCHEDULE AT '2018-03-10 15:48:54' -- 也可以写成:AT DATE_ADD(NOW(), INTERVAL 2 DAY) DO BEGIN INSERT INTO t1(m1, n1) VALUES(6, 'f'); END -- 指定某个时间间隔执行 CREATE EVENT insert_t1 ON SCHEDULE EVERY 1 HOUR STARTS '2018-03-10 15:48:54' ENDS '2018-03-12 15:48:54' -- 也可以写成:EVERY 1 HOUR DO BEGIN INSERT INTO t1(m1, n1) VALUES(6, 'f'); END
-
이전
이벤트는 해당 시간 설정에 따라 서버에서 자동으로 호출됩니다.
이벤트 자동 호출은 서버에서 켜야합니다.
-- 启动mysql服务器时,开启事件监听 event_scheduler = ON -- 开启mysql服务器后,通过设置mysql服务器的环境变量,开启事件监听 set global event_scheduler = ON
-
전망
-- 查看数据库定义的事件 SHOW EVENTS; -- 查看某个事件具体创建命令 SHOW CREATE EVENT 事件名;
-
지우다
DROP EVENT 事件名;
커서
iterator와 유사하게 标记
결과 수집에 사용 正在访问的某一行记录
되며 초기 상태에서는 결과 집합 의 첫 번째 레코드를 표시하고 사용 후 자동으로 다음 레코드로 이동합니다.
스토어드 함수 및 스토어드 프로 시저에서 커서를 사용할 수있는 경우 스토어드 함수 및 스토어드 프로 시저에서 커서의 생성, 열기, 호출, 닫기가 모두 완료됩니다.
-
창조하다
DECLARE 游标名称 CURSOR FOR 查询语句; -- 注意,创建游标的语句必须放在变量声明的后面
-
켜다
커서를 여는 것은 질의 문을 실행하고 생성 된 커서를 질의 문에서 얻은 결과 집합과 연관시키는 것을 의미합니다.
open 游标名称;
-
이전
지정된 커서에 해당하는 레코드의 각 열 값을 다음
INTO
변수에 차례로 지정하십시오. 할당 후 커서自动移动到下一条记录
의 위치.-- fetch语句一般用在循环语句中 FETCH 游标名 INTO 变量1, 变量2, ... 变量n
-
종료
커서를 닫으면 커서가 차지하는 메모리가 해제됩니다.
close 游标名称;
-
예
CREATE PROCEDURE cursor_demo() BEGIN -- 声明变量 DECLARE m_value INT; DECLARE n_value CHAR(1); DECLARE not_done INT DEFAULT 1; -- 声明游标 DECLARE t1_record_cursor CURSOR FOR SELECT m1, n1 FROM t1; -- 在游标遍历完记录的时候将变量 not_done 的值设置为 0,并且继续执行后边的语句 DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_done = 0; -- 打开游标 OPEN t1_record_cursor; WHILE not_done = 1 DO -- 使用游标 FETCH t1_record_cursor INTO m_value, n_value; SELECT m_value, n_value, not_done; END WHILE; CLOSE t1_record_cursor; END
참조
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483968&idx=1&sn=08a4072e046cc7833b60cc9d66298ec8&scene=19#wechat_redirect 스토리지 프로그램 (2) 스토리지 기능 소개
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483972&idx=1&sn=4b9cc8c88eea19fd726fc61738d7acea&scene=19#wechat_redirect 저장 프로 시저 (3) 저장 프로 시저 소개
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483976&idx=1&sn=f39ffa2f4388f1f6b593bfeb1094c5a4&scene=19#wechat_redirect 저장 프로 시저 (4) 커서 소개
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483980&idx=1&sn=3a3811cf19fadf87f326ad71c3b6f20a&scene=19#wechat_redirect 스토어 프로 시저 (5) 트리거 및 이벤트 소개
https://www.cnblogs.com/aixinyiji/p/11038635.html MYSQL에서 예외 처리