본문 바로가기
Programming/데이터베이스

[MySQL] if문과 중첩 while문으로 테이블에 반복적인 값 입력하기

by 조창대 2022. 10. 4.
반응형

sql로 프로시저 처음 구현하는데 강의장 컴퓨터 mysql 워크밴치에선 되고, 내 노트북 워크밴치에선 프로시저가 저장이 안되는 거 아닌가,, 며칠이나 끄적거리면서 내 노트북에서도 되도록 해결한 김에 써보는 기록.

근데 왜 컴퓨터마다 결과가 다르게 나왔는지는 아직까지 모르겠음. 그놈의 error 1305 -_-

if문 (if i=10, k='a0', k='a00')을 if ~ then ~ 형식으로 풀어써주니까 정상적으로 작동하던데 왜 그런지는 좀 더 연구해봐야겠다.

 


목적.

임의로 만든 sales 테이블에 'a001' ~ 'a010' 이라는 제품 10개의 판매 정보를

제품코드 판매수량 판매금액
a003 1 300
a003 2 600
a003 3 900
a003 4 1200
a004 1 400
a004 2 800
a004 3 1200
a004 4 1600

...

 

 

이런 식으로 넣고 싶었다.

일일히 insert문으로 판매정보를 입력하기도 귀찮고 해서 프로시저를 하나 만들어놓으면 이렇게 다중으로 정보를 입력해야 할 때 한 번에 해결할 수 있겠다 싶었다.

 


고려사항 1.

프로시저 안에 중첩 while문을 사용해서 반복되는 부분을 자동 수행하도록 짰는데,

제품코드를 보면 코드의 숫자 부분 중 끝 숫자가 10 미만이면 앞에 'a00'이 붙고, 10이 넘어가면 'a0'이 붙는다.

그래서 제품코드의 앞부분을 변수로 관리하여 끝 숫자에 따라서 앞에 스펠링, 0의 갯수를 조절하도록 했다.

 

고려사항 2.

a003의 단가는 300원이다.

a004의 단가는 400원이다.

a005의 단가는 500원이다.

...

제품코드의 끝 숫자가 해당 제품 단가의 백의 자리 숫자와 일치한다.

이를 이용해 (제품코드 끝 숫자 * 100) * 판매수량 공식으로 판매금액을 구해줄 것이다.


 

위 사항을 고려하여 먼저 파이썬으로 나타내보면,

1
2
3
4
5
6
7
8
9
= 3; j = 1; k = ''; default_svalues_2 = []
while i<=10:
    if i == 10 : k = 'a0'
    else : k = 'a00'
    while j<=4:
        default_svalues_2.append((k + str(i), '2022-09-22 19:00:00', j, (i*100* j))
        j += 1
    j = 1
    i += 1
cs

이렇게 짤 수 있다. 

i 변수는 제품코드 끝 숫자 부분을, j 변수는 판매정보에 들어갈 판매수량을 담당한다.if 문으로 판별된 k 변수는 내부 while문에서 제품코드의 끝 숫자 부분을 담은 i와 합쳐져, 4글자의 제품코드를 완성

 

판매금액도 고려사항 2 의 공식대로 (i * 100) * j 로 구하도록 했다.

 

 

 

이제 mysql의 insert_sales_0 이라는 프로시저를 생성하고 위 파이썬 코드를 mysql에서 구현해 보았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
delimiter $$ 
drop procedure IF EXISTS insert_sales_0$$
create procedure insert_sales_0()
begin
declare i int default 3/* i를 3으로 초기화 */
declare j int default 1;
declare k varchar(3default 'a00';
 
while (i <= 10
do
if i=10 then
    set k='a0';
end if;
    while(j <= 4
    do
        insert into sales(sCode, sDate, Qty, Amt) values (concat(k,i), '2022-09-22 13:00:00', j, (i*100* j);
        set j = j+1;
    end while;
    set j = 1;
    set i = i+1;
end while;    
end $$
delimiter ;
 
call insert_sales_0;
 
cs

반복문에 필요한 변수는 declare ~ 문을 통해 정의해주었고, k의 디폴트값은 'a00'으로 정의해놓고

만약 i가 10이 넘어갈 경우에만 k에 'a0'이 할당되도록 if문을 짜주었다.

그리고 concat 으로 k와 i를 합쳐주어 제품코드를 완성했다.

 

 

delimiter는 구분자를 의미한다. mysql에서는 구분자를 변경하기 위해 delimiter 명령어를 사용하는데, 프로시저의 끝을 선언할 때의 구분자를 지정한다. 프로시저 내부에 세미콜론(;)이 사용되지 않는다면 사용하지 않아도 된다.

 

 

프로시저를 호출할 땐 call 프로시저 이름; 으로 호출하면 된다.

파이썬과 달랐던 점은 변수를 정의할 때 '='로만 할당하는 게 아니라 declare문을 써서 지정해야 했고,

반복문이나 if문이 끝날 땐 꼭 end while, end if를 마지막에 붙여줘야 한다는 것이었다. 프로시저의 시작과 끝에도 begin과 end를 붙여줘야 했다.

 


call insert_sales_0; 를 실행하면 이렇게 sales 테이블에 데이터들이 이쁘게 들어간다.

 

 

반응형