[COMMENT]

매일 최소 한개 이상씩은 프로시저를 만들어 보기로 했는데, 다른 일로 빠뜨려 먹는 날들이 생기고 있다..

최대한 의식해서 빠짐없이 간단한 프로시저라도 짜는 연습을 해야지 



[예제 2] 입력받은 매개변수 값에 따라서 변화하는 값 테이블에 입력하기 



■만드려는 프로시저 결과 예시 


 LNO

LINE 

 1

 2

** 

 3

*** 

**** 



1. 프로시저 생성하기 


DELIMITER //


DROP PROCEDURE IF EXISTS sp_start;

CREATE PROCEDURE sp_start(IN endvar INT)


BEGIN


DECLARE i INT;

DECLARE lineval VARCHAR(20);


DROP TABLE IF exists star;

create table star(LNO INT, LINE varchar(20));

SET i = 1;

while i <= endvar DO            #입력받은 매개변수 값 만큼 반복

select REPEAT('*',i) into lineval;             # 입력되어야할 문자와 반복횟수를 select ~ into 절을 이용하여 변수로 지정

insert into star values(i, lineval) ;           

commit;

SET i = i + 1;

END WHILE;

   #SELECT * FROM star; # 결과 확인 하고 싶을 경우 추가하기 


END //


DELIMITER ;



2. 프로시저 구동 및 결과 확인


CALL sp_start(5);             # 프로시저 호출 : 입력 매개변수로 5를 전달


select * from star;






※ 출처


MySQL로 배우는 데이터베이스 개론 : https://opentutorials.org/course/1578/8986  


[COMMENT]

빠른 업무적응을 위해서 최소 하루에 한개 이상씩 프로시저를 생성하는 연습을 할 예정이다..

프로시저 생성을 못할 경우에는 퇴근후 공부한 내용에 대해 포스팅을 진행할 생각인데, 

공부시간보다 포스팅 시간이 더 길어져서.. 잘 될지 모르겠다.. 



MYSQL 프로시저 매개변수와 동적쿼리 예제_1


1. 조회용 테이블 생성


create table GET_DATA(getData varchar(20));



2. 동적쿼리 테스트용 프로시저 생성 


DELIMITER //


CREATE  PROCEDURE `SP_DYN`(

IN TBL_NAME varchar(255))


BEGIN

 

DECLARE _STATEMENT VARCHAR(2500);

  

    SET _STATEMENT = CONCAT('SELECT * ');

 

    SET _STATEMENT = CONCAT(_STATEMENT, ' FROM ',TBL_NAME,' WHERE 1=1 ');

 

 

    SET _STATEMENT = CONCAT(_STATEMENT);       

 

    SET @STATEMENT = _STATEMENT;

 

    PREPARE DYNQUERY FROM @STATEMENT;

 

    EXECUTE DYNQUERY;

 

    DEALLOCATE PREPARE DYNQUERY;

 

 

END //


DELIMITER ;




간단하지만 응용 가능성을 가진 코드이다 


보통 SET _SATATMENT 부분을 지우고 select * from table 같은 일반 쿼리를 실행해도 문제없이 돌아간다


하지만 문자열로 저장을 하게해서 매개변수로 테이블명을 넘겨주는 구조인것이다


매개변수에따라 동적인 쿼리를 구현할수있다는게 프로시저의 또다른 장점이다 



3. 프로시저 실행 결과 


CALL SP_DYN('GET_DATA');   # 테이블명(GET_DATA)를 매개변수로 입력하여 프로시저 호출


※ 출처


Mysql-Procedure프로시저-개념과-예제 : http://epthffh.tistory.com/entry/Mysql-Procedure프로시저-개념과-예제 [물고기 개발자의 블로그]




[comment] 

업무 번외로 받은 첫번째 과제..! 

특정 구분자로 이어져서 들어오는 데이터를 분리하여 테이블에 입력하는 프로시저 작성하기.

만들고 나니 간단한 프로시저인데.. 업무 하루를 꼬박 날렸다..

책에서 접한 기본적인 프로시저 테스트만 해본 상태라서.. 직접 짜보려니 어려웠다 ㅠ_ㅠ



특정 구분자로 합쳐진 데이터 분리하기 (구분자로 이어진 데이터 분리)

1. 요청예시 및 구상

a,b,c,d,... 

a|b|cde||f,... 

c$f$gg$e$...


위와 같이 다양한 형태 구분자로 합쳐져 있는 데이터 분리하기.


- 작업 구상

1) 데이터의 총 개수 구하기 -> 구분자 +1 만큼 데이터의 총 개수

2) 전체 데이터의 개수만큼 while문 이용하여 데이터 추출  



2. 테이블 생성 : 얻게 되는 데이터를 입력할 테이블

create table GET_DATA(getData varchar(20));


3. 총 데이터 개수 구하기 (구분자가 1bytes일 때)

SELECT CAST((LENGTH('a|b|cde||f')-LENGTH(REPLACE('a|b|cde||f','|','')) +1 ) as unsigned);


# LENGTH('a|b|cde||f') -- 입력받은 데이터의 전체 bytes

# LENGTH(REPLACE('a|b|cde||f','|','')  -- 입력받은 구분자(IN_DELI)를 제외한 데이터의 bytes = 구분자 개수 


+ 함수설명



4. 프로시저 생성 

DELIMITER //        


CREATE PROCEDURE SP_GET_DATA(

IN IN_DATA VARCHAR(30),  # 구분자로 이어진 데이터

IN IN_DELI VARCHAR(2),

IN IN_TB_NAME VARCHAR(30)

)

BEGIN 

   DECLARE POS INT;    # 데이터 총 개수

   DECLARE i INT default 1;    # 데이터 순번 

   DECLARE OUT_DATA VARCHAR(20);    # 얻어진 각 데이터

# 총 데이터의 사이즈에서 구분자를 제외한 길이 

SELECT CAST((LENGTH(IN_DATA)-LENGTH(REPLACE(IN_DATA,IN_DELI,'')) +1 ) as unsigned) into POS;

while i <= POS DO

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(IN_DATA,IN_DELI,i),IN_DELI,-1) into OUT_DATA;

SET @_SQL = CONCAT("insert into ", IN_TB_NAME," values('", OUT_DATA,"');");

PREPARE myquery FROM @_SQL;

EXECUTE myquery;

commit;

set i = i + 1;

END while;

END //


5. 프로시저 실행

CALL SP_GET_DATA('a|b|cde||f','|','GET_DATA');  # 구분자로 이어진 데이터, 구분자, 테이블명을 입력하여 프로시저 호출 

SELECT * FROM GET_DATA;                         # 결과확인 


결과



+ Recent posts