> 데이터 베이스 > MySQL 튜토리얼 > mysql 저장 프로시저_MySQL의 예외 처리 분석

mysql 저장 프로시저_MySQL의 예외 처리 분석

WBOY
풀어 주다: 2016-10-09 08:33:37
원래의
964명이 탐색했습니다.

예외 캡처 유형 및 처리 방법 정의:

  DECLARE handler_action HANDLER 
    FOR condition_value [, condition_value] ... 
    statement 
   
  handler_action: 
    CONTINUE 
   | EXIT 
   | UNDO 
   
  condition_value: 
    mysql_error_code 
   | SQLSTATE [VALUE] sqlstate_value 
   | condition_name 
   | SQLWARNING 
   | NOT FOUND 
   | SQLEXCEPTION  

로그인 후 복사

여기서 몇 가지 참고할 사항이 있습니다.

a.condition_value [, Condition_value], 이는 여러 상황을 포함할 수 있음을 보여줍니다(대괄호는 선택 사항을 나타냄). 즉, 여러 상황을 대상으로 핸들러를 정의할 수 있음 . 상황에 따라 해당 작업을 수행합니다. 또한, 조건_값에는 위에 나열된 6가지 값이 포함될 수 있습니다.

1. mysql_error_code는 mysql의 에러 코드를 의미하며, mysql 자체적으로 정의한 값이다.

2. SQLSTATE [VALUE] sqlstate_value는 오류 코드와 유사한 5자의 문자열입니다. 핵심은 ANSI SQL, ODBC 등의 표준에서 인용된다는 점입니다. . , 자체적으로 사용하기 위해 mysql에서 완전히 정의한 위의 error_code와 달리 더 표준화되어 있습니다. 이는 첫 번째 것과 유사하며 mysql 데이터베이스 오류 코드 및 정보를 참조할 수도 있습니다.

3. Condition_name은 DECLARE...CONDITION 문을 사용하여 정의한 조건 이름입니다. 자체적으로 Condition_name을 정의하는 방법을 소개하겠습니다.

4. SQLWARNING, 오류: 1311 SQLSTATE: 01000 (ER_SP_UNINIT_VAR)과 같이 SQLTATE의 문자열이 '01'로 시작하는 오류를 나타냅니다.

5. 찾을 수 없음, 오류: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
와 같이 SQLTATE의 문자열이 '02'로 시작하는 오류를 나타냅니다.

6. SQLSTATE의 문자열이 '00', '01' 또는 '02'로 시작하지 않는 오류를 나타내는 SQLEXCEPTION 여기서 '00'으로 시작하는 SQLSTATE는 실제로 오류가 아닌 성공적인 실행을 나타냅니다. 나머지 두 개는 위의 4번과 5번의 두 가지 상황입니다.

위 6가지 상황은 실제로 두 가지 범주로 나눌 수 있습니다.

첫 번째 유형은 1, 2, 3의 세 가지 방법을 포함하여 지정된 오류 상황을 처리하는 상대적으로 명확한 처리입니다.

다른 유형은 해당 유형의 오류를 처리하는 것으로, 세 가지 방법 4, 5, 6을 포함하여 특정 오류 그룹을 처리하는 것입니다. 이는 조건_값을 도입합니다. 주목해야 할 또 다른 점은 MySQL에는 기본적으로 자체 오류 처리 메커니즘이 있다는 것입니다(즉, 오류 처리 방법(핸들러)을 정의하지 않았습니다).

1. SQL WARNING 및 NOT FOUND를 처리하는 방법은 오류를 무시하고 계속 실행하는 것이므로 커서 예제에서 반복 조건으로 판단된 값에 대해 no_more_products=1 핸들러를 만들지 않으면 루프가 계속해서 켜집니다.

2. SQLEXCEPTION의 경우 기본 처리 방식은 오류 발생 시 종료하는 것입니다.

b.문, 이는 비교적 간단합니다. 특정 조건/오류가 발생하면 실행하려는 문은 SET var = value만큼 간단할 수 있습니다. 복잡한 여러 줄 문일 수도 있습니다. 여러 줄이 있는 경우 BEGIN ..... END를 사용할 수 있습니다. 여기에 문이 포함됩니다(이는 Delphi의 상황과 같습니다. 저장 프로시저도 여러 줄입니다. BEGIN .... END)도 마찬가지입니다.

c, handler_action, 이는 CONTINUE, EXIT, UNDO(계속, 종료 및 취소를 의미함)를 포함하여 위 명령문을 실행한 후 수행하려는 작업을 나타냅니다( Not 현재 지원됩니다). 실제로 위에서 언급한 두 가지 작업이 있는데 CONTINUE는 SQLWARNING 및 NOT FOUND의 기본 처리 방법이고 EXIT는 SQLEXCEPTION의 기본 처리 방법입니다.

또 다른:

condition_name: 명명된 조건
MySQL 오류 코드 또는 SQLSTATE 코드의 가독성이 너무 낮아 명명 조건이 도입되었습니다.

구문:

  DECLARE condition_name CONDITION FOR condition_value 
   
  condition_value: 
    SQLSTATE [VALUE] sqlstate_value 
   | mysql_error_code  


로그인 후 복사

용도:

  # original 
  DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements; 
   
  # changed 
  DECLARE foreign_key_error CONDITION FOR 1216; 
  DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;
로그인 후 복사

예:

  CREATE PROCEDURE sp_add_location 
    (in_location  VARCHAR(30), 
     in_address1  VARCHAR(30), 
     in_address2  VARCHAR(30), 
     zipcode    VARCHAR(10), 
     OUT out_status VARCHAR(30)) 
  BEGIN 
    DECLARE CONTINUE HANDLER 
      FOR 1062 
      SET out_status='Duplicate Entry'; 
   
    SET out_status='OK'; 
    INSERT INTO locations 
      (location,address1,address2,zipcode) 
    VALUES 
      (in_location,in_address1,in_address2,zipcode); 
  END; 
로그인 후 복사

이상은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되길 바라며, 많은 응원 부탁드립니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿