데이터베이스 저장 프로세스 소개

9648 단어 데이터베이스
저장 프로세스
저장 프로세스는 하나 이상의 SQL 문장의 집합이다. 데이터베이스에 대해 일련의 조작을 할 때 저장 프로세스는 이런 복잡한 조작을 하나의 코드 블록으로 봉하여 중복 사용을 위해 데이터베이스 개발자의 작업량을 크게 줄일 수 있다
저장 프로세스 생성
저장 프로세스를 만드는 기본 문법
CREATE PROCEDURE       ([         ])
[       ]routine_body

저장 프로세스의 매개 변수 목록 문법은 다음과 같다.
([[IN|OUT|INOUT]        ])
  • IN: 매개 변수를 입력하면 이 매개 변수의 값은 저장 프로세스를 호출할 때 지정해야 하며 저장 과정에서 이 매개 변수를 수정한 값은 기본값으로 되돌아갈 수 없음
  • OUT: 출력 매개 변수 이 값은 저장 프로세스 내부에서 변경되고 되돌아올 수 있음
  • INOUT: 입력 출력 매개 변수 호출 시 지정하고 변경 및 반환 가능
  • 저장 프로세스의 특성 값
  • LANGUAGE SQL: 설명 루틴body 부분은 SQL 문장으로 구성된 현재 시스템에서 지원하는 언어입니다. SQL SQL은 LANGUAGE의 유일한 값입니다.
  • [NOT] DETERMINISTIC: 저장 프로세스가 실행된 결과가 확실한지 여부를 가리킨다.기본 NOT DETERMINISTIC(저장 프로세스를 실행할 때마다 같은 입력은 다른 출력을 얻을 수 있음) DETERMINISTIC는 반대
  • {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}: 하위 프로그램의 SQL 문장 사용 제한을 가리킨다.CONTAINS SQL 기본 지정
  • CONTAINS SQL: 서브루틴에 SQL 문구가 있지만 데이터를 읽거나 쓰지 않는 문구가 있음을 나타낸다
  • NO SQL은 서브루틴에 SQL 문이 없음을 나타냅니다
  • READS SQL DATA: 서브루틴에 읽기 및 쓰기 데이터가 포함된 문을 설명합니다
  • MODIFIES SQL DATA는 하위 프로그램이 데이터를 쓰는 문장을 포함하고 있음을 나타낸다
  • SQL SECURITY {DEFINER | INVOKER}: 기본 시스템 지정 DEFINER를 실행할 수 있는 권한을 가리키는 사람
  • DEFINER: 정의자만 실행할 수 있음을 나타냅니다
  • INVOKER는 권한을 가진 호출자가 실행할 수 있음을 나타낸다
  • COMMENT'string': 주석 정보는 저장 프로세스를 설명할 수 있음
  • routime_Body는 SQL 코드의 내용입니다. BEFIN...END로 SQL 코드의 시작과 끝을 나타낼 수 있습니다.
    저장 프로세스 문법 저장 솔루션 만들기
    delimiter 명령을 사용하여 끝 문자를 잠깐 바꿉니다. (바꾼 후에 반드시 바꿉니다.)
    delimiter // 
    
    CREATE PROCEDURE Padf()
    BEGIN
        SELECT * FROM tb_spu;
    END//
    
    delimiter ;
    

    변수의 사용
    변수 정의
    구문
    DECLARE [      ] [    ][DEFAULT    ]
    
  • 변수 이름: 여러 변수를 정의할 수 있지만 다음 유형은 하나만 정의할 수 있습니다
  • 예를 들어 a b 두 변수를 만듭니다. (정의 이름은 나처럼 무의미하게 정의하지 마십시오 = w=) 형식은 INT 기본값이 100입니다.
    DECLARE a,b INT(10)DEFAULT 100
    

    변수 할당
    SET     =10[,    =10,...]
    
  • SET를 사용하여 값을 부여하면 여러 변수를 동시에 부여할 수 있다. 분리
  • 확장: MySQL에서 SELECT...INTO를 통해 하나 이상의 변수에 대한 값 지정
    구문 형식
    SELECT      INTO             
    

    예: 선언 변수 a b 질의에 지정된 레코드가 변수 값으로 지정됨
    DECLARE a,b INT;
    SELECT grade,gender INTO a,b
    FORM student WHERE name='jack';
    

    조건 및 프로세서 정의
    개발 과정에서 우리는 특정한 조건을 처리해야 한다. 이런 조건을 오류와 서브루틴에 연결할 수 있는 일반적인 프로세스 제어 정의 조건은 프로그램 실행 과정에서 발생하는 문제를 미리 정의하는 것이다. 처리 프로그램은 이러한 문제에 부딪혔을 때 취해야 할 처리 방식을 정의하고 저장 과정이 경고나 오류가 발생했을 때 계속 실행될 수 있도록 보장한다.
    조건 정의
    구문
    DECLARE        CONDITION FOR [    ];
    

    조건 유형:
  • SQLSTATE[VALUE]: 길이 5 문자열 유형 오류 코드
  • 정의 수치: 수치 형식의 오류 코드
  • 예를 들어 ERROR1148(42000) 오류 이름을command 로 정의합니다not_allowed
    ##    
    DECLARE command_not_allowed CONDITION FOR SQLSTATE'42000';
    ##    
    DECLARE command_not_allowed CONDITION FOR 1148;
    

    프로세서 정의
    구문
    DECLARE        HANDLER FOR           
    

    오류 처리 방법
  • CONTINUE: 오류가 발생하여 처리하지 않고 계속 실행하는 것을 의미합니다
  • EXIT: 오류가 발생하면 즉시 종료됨
  • UNDO: 오류가 발생하면 이전 작업을 철회하는 것을 의미합니다(MySQL은 당분간 이런 작업을 지원하지 않습니다)
  • 오류 유형
  • SQLSTATE[VALUE]: 5자 문자열 오류
  • 정의 오류 이름: DECLARE CONDITION 정의 오류 조건 이름
  • 을 나타냅니다.
  • SQLWARNING은 01로 시작하는 모든 SQLSTATE 오류 코드와 일치
  • NOT FOUND는 02로 시작하는 모든 SQLSTATE 오류 코드와 일치
  • SQLEXCEPTION은 SQLWARNING 또는 NOT FOUND에 포획되지 않은 모든 SQLSTATE 오류 코드와 일치
  • 수치 유형 오류: 일치 수치 유형 오류 코드
  • 예를 들면 다음과 같습니다.
    ##           CONTINUE        '42s02'   CONTINUE     
    ## NO_SUCH_TABLE
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42s02' SET @info='NO_SUCH_TABLE'
    
    ##        no_such_table     1146     CONTINUE  
    DECLARE no_such_table CONDITION FOR 1146;
    DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='ERROR';
    
    ##       SQLWARNING     01              EXIT       ## ERROR 
    DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR'
    
    ##       NOT FOUND     02              EXIT        ##  NO_SUCH_TABLE
    DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE'
    
    ##       SQLEXCEPTION       NOT FOUND SQLWARNING           EXIT       ERROR
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR'
    
    ##              1146      CONTINUE     NO_SUCH_TABLE
    DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE'
    

    커서 선언
    구문:
    DECLARE      CURSOR FOR select_statement
    
  • select_statement는 SELECT 문장의 내용이 커서를 만드는 데 사용된 결과 집합을 되돌려줍니다
  • 예: cursor 라는 이름을 선언합니다.student 커서
    DECLARE cursor_student CURSOR FOR select s_name,s_gender FROM student;
    

    커서 사용
    커서를 사용하기 전에 먼저 커서를 열어야 합니다.
    구문
    OPEN     ;
    FETCH      INTO var_name[,var_name]...
    
  • var_name 표석은 커서의 SELECT 문장에서 조회한 정보를 이 매개 변수에 저장합니다. 주의해야 할 것은 varname은 커서를 설명하기 전에 정의해야 합니다
  • 예를 들어, 이름이 cursor 인 경우student에서 검색한 정보를 s 에 저장합니다name 및 sgender 중
    FETCH cursor_student INTO s_name,s_gender;
    

    커서 닫기
    커서 사용 후 커서 닫기
    구문
    CLOSE     
    

    프로세스 제어 사용
    프로세스 제어는 여러 SQL 문을 비즈니스 논리에 맞는 코드 블록으로 구분하거나 조합하는 데 사용됩니다.
    MySQL의 프로세스 제어 문장은 IF 문장 CASE 문장 LOOP 문장 WHILE 문장 LEAVE 문장ITERATE 문장 REPEAT 문장과 WHILE 문장을 포함한다
    IF 문
    IF 문구는 어떤 조건이 충족되면 판단한 결과에 따라 TRUE 또는 FALSE에 해당하는 문구를 집행하는 것을 말한다
    구문
    IF      THEN SQL    
       [ELSEIF      THEN SQL    ]
       [ELSE SQL    ]
    END IF
    
  • SQL 문의 목록: 하나 이상의 문 포함
  • 주의해야 할 것은 MySQL에 IF () 함수가 하나 더 있는데, 그가 여기에 기술한 IF 문장과 다르다는 것이다
    예:
    IF val IS NULL
          THEN SELECT 'val is NULL'
          ELSE SELECT 'val is not NULL'
     END IF;
    

    상기 코드에서 val 값이 비어 있는지 판단합니다. 만약 val 값이 비어 있는 출력 문자열'val is NULL'이면 반대로'val is not NULL'을 출력합니다.
    IF 문장과 IF 함수는 모두 NED IF로 IF 문장을 끝내야 한다
    CASE 문
    CASE 문에는 두 가지 구문 형식이 있습니다.
    문법1:
    CASE       
    	WHEN           THEN SQL    
    	[WHEN           THEN SQL    ]...
    	[ELSE SQL    ]
    END CASE
    

    예를 들어 val값이 1인지 2인지 판단하거나 둘 다 같지 않아요.
    CASE val
    	WHEN 1 THEN SELECT 'val is 1';
    	WHEN 2 THEN SELECT 'val is 2';
    	ELSE SELECT 'val is not 1 or 2';
    END CASE;
    

    구문 2:
    CASE
    	WHEN      THEN SQL    
    	[WHEN      THEN SQL    ]
    	[ELSE SQL    ]
    END CASE;
    

    주의해야 할 것은 여기에 설명된 저장 과정에 사용되는 CASE 문구와 절차 제어 함수에 기술된 SQL CASE 표현식의 CASE 문구는 다소 다르다. 저장 과정 중의 CASE 문구는 ELSE NULL 자구가 있을 수 없고 END CASE가 END를 대체하여 중지할 수 없다.
    LOOP 문
    LOOP 내의 문장을 계속 반복해서 실행하면 순환 문장에서 튀어나오는 것을 알 수 있습니다.
    구문
    [loop_label:]LOOP
    	statement_list
    END LOOP[loop_lable]
    
  • loop_label 식별자 효과는 순환을 뛰어넘을 수 있습니다
  • 예를 들면 다음과 같습니다.
    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;
    

    위 코드에서 id 더하기 작업을 반복하지만 id 값이 10보다 크거나 같을 경우 LEAVE 문을 사용하여 순환을 종료합니다.
    LEAVE 문
    LEAVE 문은 태그가 지정된 프로세스 제어 구조를 종료하는 데 사용됩니다.
    구문
    LEAVE    
    

    IFERATE 문
    IFERATE는 IFERATE 문장을 다시 순환하는 것을 의미한다
    ITERATE    
    

    예를 들면 다음과 같습니다.
    CREATE PROCEDURE doiterate()
    BEGIN
    DECLARE p1 INT DEFAULT 0;
    my_loop: LOOP
    	SET p1=p1+1;
    	IF p1<10 THEN IFERATE my_loop;
    	ELSEIF p1>20 THEN LEAVE my_loop;
    	END IF;
    	SELECT 'ip is between 10 and 20';
    END LOOP my_loop;
    END
    

    위 코드에서 p1의 초기 값이 0이면 p1의 값이 10보다 작으면 p1 더하기 1을 반복합니다 만약 p1이 10보다 작으면 20보다 작으면 'ip is between 10 and 20' 을 인쇄하고 p1이 20보다 크면 LEAVE 문장을 실행하고 순환을 종료합니다
    REPEAT 문
    REPEAT 문은 조건부 판단이 있는 루프 프로세스를 생성합니다.
    구문
    [   :]REPEAT
    	SQL    
    UNTIL     
    END REPEAT[   ]
    

    예를 들면 다음과 같습니다.
    DECLARE id INT DEFAULT 0;
    REPEAT
    SET id =id+1;
    UNTIL id>=10;
    END REPEAT;
    

    (소개 안 해도 알아볼 수 있겠지=)
    WHILE 문
    WHILE 문은 판단 조건이 있는 순환 문구로서 REPEAT 문구와 달리 WHILE 문구는 판단 조건에 대해 먼저 판단한다
    구문:
    [   :]WHILE      DO
    	SQL    
    END WHILE[   ]
    

    예를 들면 다음과 같습니다.
    DECLARE i INT DEFAULT 0;
    WHILE i>10 DO
    	SET i=i+1;
    	SELECT 'i Less than 10'
    END WHILE
    

    저장 프로세스의 사용
    위의 학습을 통해 당신은 이미 완전한 저장 과정을 정의할 수 있을 것이라고 믿습니다
    저장 프로세스를 사용하면 프로그램의 실행 효율을 높이고 안전성을 높이며 프로그램의 재사용성과 유지보수성을 강화할 수 있다
    메모리 프로세스 호출
    구문
    CALL sp_name([parameter[,...]])
    
  • sp_name은 저장 프로세스의 이름입니다
  • parameter 저장 프로세스의 매개 변수
  • 스토리지 프로세스 보기
    SHOW STATUS 문의 오류 저장 프로세스 상태 보기
    SHOW {PROCEDURE|FUNCTION} STATUS [LIKE 'pattern']
    

    이 문장은 MySQL의 확장자로서 데이터베이스 이름 형식 창설자 등 하위 프로그램의 특징을 되돌려줍니다
  • PROCEDURE 및 FUNCTION은 각각 스토리지 프로세스 및 함수 보기
  • 를 나타냅니다.
  • LIKE 문은 일치하는 이름을 나타냅니다
  • .
    예컨대
    SHOW PROCEDURE STATUS LIKE 'C%'\G
    

    좋은 웹페이지 즐겨찾기