8. MySQL 저장 프로세스

3389 단어
저장 프로세스
저장 프로세스는 SQL 문장 집합으로 저장 프로세스를 주동적으로 호출할 때 내부의 SQL 문장은 논리에 따라 실행된다.
1. 저장 프로세스 생성
매개 변수 저장 프로세스 없음
--      
delimiter //
create procedure p1()
BEGIN
    select * from t1;
END//
delimiter ;

--       
call p1()

스토리지 프로세스의 경우 다음 세 가지 유형의 매개 변수를 수신할 수 있습니다.
  • in은 입력 매개 변수에만 사용
  • out은 반환값에만 사용
  • inout은 전송할 수도 있고 반환값으로 사용할 수도 있다
  • 매개 변수가 있는 저장 프로세스
    --       
    delimiter \\
    create procedure p1(
        in i1 int,
        in i2 int,
        inout i3 int,
        out r1 int
    )
    BEGIN
        DECLARE temp1 int;
        DECLARE temp2 int default 0;
        
        set temp1 = 1;
    
        set r1 = i1 + i2 + temp1 + temp2;
    
        set i3 = i3 + 100;
    
    end\\
    delimiter ;
    
    --       
    set @t1 =4;
    set @t2 = 0;
    CALL p1 (1, 2 ,@t1, @t2);
    SELECT @t1,@t2;
    

    주의: out inout은 저장 프로세스를 실행하기 전에 설명을 해야 합니다
    1. 결과집
    delimiter //
    create procedure p1()
    begin
        select * from v1;
    end //
    delimiter ;
    

    2. 결과 세트 + out 값
    delimiter //
    create procedure p2(
        in n1 int,
        inout n3 int,
        out n2 int,
    )
    begin
        declare temp1 int ;
        declare temp2 int default 0;
    
        select * from v1;
        set n2 = n1 + 100;
        set n3 = n3 + n1 + 100;
    end //
    delimiter ;
    

    3. 사물
    delimiter \\
    create PROCEDURE p1(
    --   ,            0, error   1, warning   2
        OUT p_return_code tinyint
    )
    BEGIN 
    --              
      DECLARE exit handler for sqlexception 
      BEGIN 
        -- ERROR 
        set p_return_code = 1; 
        rollback; 
      END; 
     
      DECLARE exit handler for sqlwarning 
      BEGIN 
        -- WARNING 
        set p_return_code = 2; 
        rollback; 
      END; 
    -- sql      
      START TRANSACTION; 
        DELETE from tb1;
        insert into tb2(name)values('seven');
      COMMIT; 
     
      -- SUCCESS 
      set p_return_code = 0; 
     
      END\\
    delimiter ;
    

    유표
    delimiter //
    create procedure p3()
    begin 
        declare ssid int; --      1  
        declare ssname varchar(50); --      2  
        DECLARE done INT DEFAULT FALSE;
    
    --     
        DECLARE my_cursor CURSOR FOR select sid,sname from student;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        
        open my_cursor;
            xxoo: LOOP
                fetch my_cursor into ssid,ssname;
                if done then 
                    leave xxoo;
                END IF;
                insert into teacher(tname) values(ssname);
            end loop xxoo;
        close my_cursor;
    end  //
    delimter ;
    

    동적 실행 SQL(SQL 주입 방지)
    delimiter \\
    CREATE PROCEDURE p4 (
        in nid int
    )
    BEGIN
        PREPARE prod FROM 'select * from student where sid > ?';
        EXECUTE prod USING @nid;
        DEALLOCATE prepare prod; 
    END\\
    delimiter ;
    

    2. 저장 프로세스 삭제
    drop procedure proc_name;
    

    3. 저장 프로세스 실행
    --    
    call proc_name()
    
    --    , in
    call proc_name(1,2)
    
    --    , in,out,inout
    set @t1=0;
    set @t2=3;
    call proc_name(1,2,@t1,@t2)
    

    pymysql 실행 저장 프로세스
    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    #       
    cursor.callproc('p1', args=(1, 22, 3, 4))
    #           
    cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
    result = cursor.fetchall()
    
    conn.commit()
    cursor.close()
    conn.close()
    
    
    print(result)
    

    좋은 웹페이지 즐겨찾기