간단하게 실무에 사용 할 수 있게 요약만 적었습니다. 

1) 기존 DB 에서 원하는 값만 따로 Table 생성 및 자료 구겨넣기 

      CREATE TABLE member2 TYPE=innodb AS 
      SELECT * FROM member WHERE joindate BETWEEN '1999-01-01' AND '2006-12-31'; 

2) PROCEDURE 

  2-1) Mysql 에서 PROCEDURE 부르는 방법 : call 함수명('인자') 

  2-2) 사용법 샘플 

            CREATE PROCEDURE bengi_exam1() 
            BEGIN 
              --  변수 선언 
              DECLARE bgtotal INTEGER;  
              
              --  회원테이블에서 벤지라는 글자가 들어간 사람의 총수을 구해서 
              --  bgtotal 변수에 저장 
              SELECT COUNT(upk) INTO bgtotal FROM member 
              WHERE uname LIKE '%벤지%'; 
            
              --  총수 RETURN  
              SELECT bgtotal; 
            END 

            
3) FUNCTION 

  3-1) Mysql 에서 FUNCTION 부르는 방법 : select function명('인자') 

  3-2) 사용법 샘플 
  
          --  datetime 형의 bdate 인자에 계산을 원하는 값 전달 
          CREATE FUNCTION userage ( bdate datetime ) returns int(11) 
          BEGIN 
                  --  변수 선언          
                  DECLARE var_age INT; 
                  --  나이를 구한다 
                  SET var_age = date_format( now(),'%Y' ) - date_format( bdate,'%Y' );                  
                  -- 값을 RETURN 한다 
                  RETURN(var_age); 
          END; 

          
4) PROCEDURE 에서 FUNCTION CALL 
          
  4-1) 사용법 샘플 
  
            CREATE PROCEDURE bengi_exam2() 
            BEGIN 
              -- 변수 선언 
              DECLARE bgage INTEGER;  
              DECLARE membdate DATETIME;  
              
              -- 회원테이블에서 bengi라는 글자가 들어간 사람의 생년월일 구한다 
              SELECT bdate INTO membdate FROM member 
              WHERE uname = 'bengi'; 
            
              -- Function 에서 결과값을 받아 저장한다 (3-1 에 정의된것 사용) 
              set bgage = userage(membdate);  
            
              -- 총수 RETURN  
              SELECT bgtotal; 
            END


----------------------------------------------------------------------------------------- 기초 설명
MySQL에서는 내장 프로시저,
즉, DB에 저장된 함수를 사용자가 불러다 쓰는 것이죠.
그래서 이를 Stored, "저장된", "내장된" 이름으로 쓰는 것입니다.

이런 내장 프로시저를 만드는데는 몇가지 알아야 할 사항이 있는데,
첫번째가 "delimiter"라는 존재입니다.

이 delimiter는 구분자, 즉, 명령어 단락 구역을 만들 수 있게 도와주는 넘입니다.

SQL 구문은 ';' 문자로 끝나게 됩니다.
근데 프로시저 안에서 한줄 끝날때 마다 ;를 다 넣어주면, 어디가 쿼리문이고 어디가 프로시저 문인지를 헛갈리게 됩니다. 따라서 "여기서 여기 까지가 프로시저야" 라는 걸 알려주기 위해서 delimiter를 씁니다.

DELIMITER $$

이렇게 하여서 ';'을 "$$"로 바꾸어 주게 되는데요.
이렇게 하면, 프로시저를 꾸며줄 때 한줄이 끝났을 때 ';'를 써줘도 함수가 끝나지 않았다는 것을 인식 시켜줄 수 있습니다.

그리고 프로시저를 다 꾸미고 나면, 다시 "$$" 를 ';'로 바꾸어줍니다.

DELIMITER ;


두번째로는 파라미터, "인자 값들의 종류" 입니다.

총 3가지(IN, OUT, INOUT)게 있게 되는데요.

1. IN
IN 파라미터는 "읽기 전용" 이라는 것입니다. 프로서저를 호출할 때 건네주게 되면, 이를 프로시저 안에서 값을 가져다 쓸뿐 바꿀 수 없다는 것이죠.

2. OUT
OUT 파라미터는 "값을 변경 할 수 있는" 속성을 가진 파라미터 입니다.
흔히들 이 파라미터는 프로시저 내부에서 일을 처리한 뒤, 값을 돌려줄때 많이 씁니다.

3. INOUT
INOUT 파라미터는 IN의 속성과 OUT의 속성을 다 가지고 있습니다.
프로시저 호출자로 부터 값을 전달 받아 이를 고쳐서 다시 돌려줄때 사용하게 되는 것이죠.

세번째로는 프로시저의 시작과 끝입니다.
프로시저는 BEGIN 으로 시작해서 END로 끝나게 됩니다.

따라서,
CREATE PROCEDURE testproc()
BEGIN
 ....
END

이런 형태로 만드셔야 합니다.

이제 기본적인 사항들은 끝난듯 싶습니다. 더 필요한 이야기는 다음에 다루도록 하겠습니다~!




MySQL Procedure 만들면서 주의해야 할 사항!

주로 MS-SQL에서 작업을 하다, mysql에서 처음으로 stored procedure(이하 sp)를 만들면서, 5분이면 될 것을 수십분은 걸린 것 같다 --;; 에러가 정확한 위치를 알려주질 않는다. 아래의 정리한 내용은 MS-SQL에 익숙하고 mysql을 사용해 보지 않은 분이 보면 무자게 도움이 될 것 같다.

- IF문을 쓸 때 END IF문이 있어야 하며, END IF문 뒤에는 ;를 붙여야 한다.

   ex> IF (test IS NULL) THEN
            SELSET 'ok';
         END IF;

- auto increment값을 얻어올 때는 LAST_INSERT_ID()을 이용한다.

ex> SET serverId = LAST_INSERT_ID();

- CREATE PROCEDURE문 전에 delimeter문을 이용해 delimeter를 ';'가 아닌 다른 걸로 변경하고 뒤에 다시변경할 것

 ex> delimiter //               # delimeter를 //로 변경
         CREATE PROCEDURE xxx
                  .....
                  .....
         END;
        //                      # 실제 한 command가 종료됨을 의미
delimeter ;                     # 다시 ;로 변경

----------------------------------------------------------------------------------------- 예제 1
CREATE PROCEDURE `IB`.`newsCategoryDelete`(
    in in_cat_no int
)
begin
    /* sql exception 처리 */
    declare exit handler for sqlexception, sqlwarning
    begin
        rollback;
        select false;
    end;

    start transaction;

    select news_info_hash from news_category_list_tb where news_category_hash=md5(in_cat_no);

    if found_rows() = 0 then
        delete from news_category_tb where hash=md5(in_cat_no);
    else 
        select false;
    end if;

    commit;
    select true;

end
----------------------------------------------------------------------------------------- 예제 2
CREATE PROCEDURE `IB`.`newsDelete`(
    in in_year int,
    in in_no int,
    in in_act_id varchar(20),
    in in_req_user varchar(100),
    in in_comment varchar(255)
)
begin

    declare target_hash char(32);
    declare target_cnt int;
    declare target_del_date int;


    /* sql exception 처리 */
    declare exit handler for sqlexception, sqlwarning
    begin
        rollback;
        select false;
    end;

    select md5(concat(in_year,'_',in_no)) into target_hash;
    select unix_timestamp() into target_del_date;
    select count(hash) from news_info_tb where hash=target_hash and delete_yn = 'N' into target_cnt;
    
    start transaction; --트랜잭션 시작

    if target_cnt = 1 then

        update IB.news_info_tb set delete_yn='Y', del_date=target_del_date where hash=target_hash;
        insert into IB.news_delete_tb(hash, del_date, act_id, req_user, comment) values (target_hash, target_del_date, in_act_id, in_req_user, in_comment);
        commit;

        select true;
    else
        select false;
    end if;
end