mysql_stored 루틴 (저장 함수 저장 프로 시저 트리거 이벤트 커서)

저장 프로 시저

분류

여기에 사진 설명 삽입

저장된 루틴

기본적으로 일부 실행 가능한 명령문도 캡슐화하지만 호출 방식은 显示调用. 스토어드 루틴은 스토어드 함수와 스토어드 프로 시저로 나눌 수 있습니다. 이 둘의 차이점은 다음과 같습니다.

저장 기능 저장 프로 시저
반환 문 있어야한다 당신은
반환 값 수 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에서 예외 처리

추천

출처blog.csdn.net/u013617791/article/details/104854495