SNOWFLAKES DRAWING PAPER

[SQL] MYSQL :: cursor & insert error check example 본문

개발/Oracle/SQL/ERD

[SQL] MYSQL :: cursor & insert error check example

눈송2 2009. 4. 18. 13:05

cursor & insert error check example

 

 

소스 설명 : cursor와 삽입시 에러 체크를 이용한

              staTest1(table)에 있는 값을 staTest2(table)로 옮기는 예제

 

----------------------------------------------------------------------------------

Drop procedure if exists sp_rt_sta_set_Test ;

 

DELIMITER |
CREATE PROCEDURE sp_rt_sta_set_Test()
BEGIN

 

DECLARE stID int unsigned;
DECLARE stName varchar(20);
DECLARE stValue varchar(20);

DECLARE done int default 0;
DECLARE sta_Temp int default 0;

 

/* insert시 에러 체크 변수 선언*/
DECLARE errorCode int default 0;

 

/* 중복된 값입력 등으로 인한 이중키 오류 일 경우 */

DECLARE duplicate_key CONDITION FOR SQLSTATE '23000' ;

 

DECLARE Cursor cursor for

 select st_id_pk, st_name, st_value from staTest1;

/* fetch next할때 마지막 여부를 알려주는 handler 변수(done) */
DECLARE continue handler for sqlstate '02000' set done = 1;


/* insert시 에러 체크 */
DECLARE CONTINUE HANDLER for duplicate_key set errorCode = -1 ;

 

/* 에러 체크 시작!(when insert) */
START TRANSACTION ;

 

/* 위의 SQL문 실행 */
open Cursor;

 

 /* 반복 시작*/
 repeat
 
 fetch Cursor into stID, stName, stValue;  
 
  /* 커서가 마지막이 아니라면.. */
  if not done then
     BEGIN   
      insert into staTest2(st2_id_pk, st2_name, st2_value) values (stID, stName, stValue);


     /* why?삽입하는 과정에서 done 파일 끝까지 도달하는지 체크하는 변수를 1로 만들어 버림. */
     set done = 0;
    END ;
 end if;

 

 until done end repeat; /* 반복 끝 */
 
 close Cursor;

 

/* 에러발생시 이전까지의 작업 취소 */

 if (errorCode < 0) then
            ROLLBACK;

/* 성공시 지금까지의 작업 실행 */
        else    
            COMMIT ;

/* 삽입 성공 여부 에러코드 return */
     select errorCode;
end if;

 

END |
DELIMITER ;

-------------------------------------------------------------------

 





'개발 > Oracle/SQL/ERD' 카테고리의 다른 글

[SQL] mysql event  (0) 2009.04.18
[SQL] Mysql - ErrCode  (0) 2009.04.18
[SQL] MySQL Trigger  (0) 2009.04.18
[SQL] mysqldump  (0) 2009.04.18
[SQL] MYSQL :: show table status  (0) 2009.04.18
Comments