💡조건문
PL/SQL 조건문은 Java의 조건문과 비슷한 점이 많다.
if문
DECLARE
vnum NUMBER := 10;
BEGIN
IF vnum > 0 THEN
dbms_output.put_line('양수');
END IF;
END;
if else문
DECLARE
vnum NUMBER := 10;
BEGIN
IF vnum > 0 THEN
dbms_output.put_line('양수');
ELSE
dbms_output.put_line('음수');
END IF;
END;
다중 if문
DECLARE
vnum NUMBER := 10;
BEGIN
IF vnum > 0 THEN
dbms_output.put_line('양수');
ELSIF vnum < 0 THEN
dbms_output.put_line('음수');
ELSE
dbms_output.put_line('0');
END IF;
END;
if문의 활용
DECLARE
vnum tblInsa.num%TYPE;
vbasicpay tblInsa.basicpay%TYPE;
vjikwi tblInsa.jikwi%TYPE;
vbonus NUMBER;
BEGIN
SELECT num, basicpay, jikwi INTO vnum, vbasicpay, vjikwi
FROM tblInsa WHERE num = 1040;
IF vjikwi = '과장' OR vjikwi = '부장' THEN
vbonus := vbasicpay * 1.5;
ELSIF vjikwi IN ('사원', '대리') THEN
vbonus := vbasicpay * 2;
END IF;
INSERT INTO tblBonus (seq, num, bonus)
VALUES ((SELECT nvl(max(seq), 0) + 1 FROM tblBonus), vnum, vbonus);
END;
SELECT * FROM tblBonus b
INNER JOIN tblInsa i
ON i.num = b.num;
- a. 과장/부장 > basicpay * 1.5
- b. 대리/사원 > basicpay * 2
직원을 1명 선택(num)하고 차등하여 보너스를 지급하는 소스코드이다.
테이블을 출력해보니 값이 제대로 들어간 것을 확인할 수 있다.
case문
ANSI-SQL의 case문과 거의 유사하다.
DECLARE
vcontinent tblCountry.continent%TYPE;
vresult VARCHAR2(30);
BEGIN
SELECT continent INTO vcontinent FROM tblCountry WHERE name = '영국';
--IF문
IF vcontinent = 'AS' THEN vresult := '아시아';
ELSIF vcontinent = 'EU' THEN vresult := '유럽';
ELSIF vcontinent = 'AF' THEN vresult := '아프리카';
ELSE vresult := '기타';
END IF;
dbms_output.put_line(vresult);
--CASE문
CASE
WHEN vcontinent = 'AS' THEN vresult := '아시아';
WHEN vcontinent = 'EU' THEN vresult := '유럽';
WHEN vcontinent = 'AF' THEN vresult := '아프리카';
ELSE vresult := '기타';
END CASE;
dbms_output.put_line(vresult);
END;
case문은 if문과 다르게 when 키워드로 값을 비교한다.
--CASE문
CASE vcontinent
WHEN 'AS' THEN vresult := '아시아';
WHEN 'EU' THEN vresult := '유럽';
WHEN 'AF' THEN vresult := '아프리카';
ELSE vresult := '기타';
END CASE;
case문은 값을 제시하면 특정 결과를 돌려주는 방식으로 사용할 수도 있다.
💡반복문
loop문
DECLARE
vnum NUMBER := 1;
BEGIN
LOOP
dbms_output.put_line(vnum);
vnum := vnum + 1;
EXIT WHEN vnum > 10;
END LOOP;
END;
loop문은 단순 반복을 한다.
자바에서는 반복문을 빠져나갈 때 break를 사용했다.
Oracle에서는 반복문을 빠져나갈 때 exit를 사용하며, exit 뒤에 조건을 줄 수 있다.
exit 조건에 만족하면 반복문을 빠져나간다.
무한 루프
BEGIN
LOOP
--ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
dbms_output.put_line('infinite loop');
END LOOP;
END;
출력 버퍼가 1MB를 넘어갈 경우 오류가 발생한다.
loop문의 활용
'항목1', '항목2', '항목3', ... '항목1000'과 같이 데이터를 1000건 추가하는 코드를 반복문으로 작성해 보도록 하자.
CREATE TABLE tblLoop (
seq NUMBER PRIMARY KEY,
DATA varchar2(100) NOT NULL
);
CREATE SEQUENCE seqLoop;
DECLARE
vnum NUMBER := 1;
BEGIN
LOOP
INSERT INTO tblLoop VALUES (seqLoop.nextVal, '항목' || vnum);
vnum := vnum + 1;
EXIT WHEN vnum > 1000;
END LOOP;
END;
항목이 1000건 잘 들어갔다!
for loop문
자바의 for문과 같이 횟수를 반복한다.
loop를 기반으로 한다.
for (int n : list){
}
for (int n in list){
}
for loop문은 향상된 for문(foreach문, for in)과 비슷한 느낌이다.
BEGIN
FOR i IN 1..10 LOOP
dbms_output.put_line(i);
END LOOP;
END;
구구단 만들기
복합키 만들기
CREATE TABLE tblGugudan(
dan NUMBER NOT NULL,
num NUMBER NOT NULL,
RESULT NUMBER NOT NULL
--CONSTRAINT tblgugudan_dan_num_pk PRIMARY KEY(dan, num) --복합키
);
혼자 기본키로 할 만한 게 없다. 그러나 dan과 num을 합치면 겹치는 게 없기 때문에 복합키로 두 개의 컬럼을 조합하여 기본키로 사용하는 게 가능하다.
복합키를 사용하려면 제약 사항으로 테이블 수준에서 선언하면 된다.
ALTER TABLE tblGugudan
ADD CONSTRAINT tblgugudan_dan_num_pk PRIMARY KEY(dan, num);
하지만 테이블은 테이블대로, 제약 사항은 제약 사항대로 구분하는 게 깔끔하기 때문에 위와 같이 ALTER TABLE문을 사용하는 게 일반적이다.
제약 사항과 Alter Table문에 대해서는 위 글을 참고하도록 하자!
BEGIN
FOR vdan IN 2..9 LOOP
FOR vnum IN 1..9 LOOP
INSERT INTO tblGugudan (dan, num, RESULT) VALUES (vdan, vnum, vdan * vnum);
END LOOP;
END LOOP;
END;
구구단을 테이블에 저장하여 출력하였다.
reverse
BEGIN
FOR vdan IN reverse 2..9 LOOP
FOR vnum IN reverse 1..9 LOOP
INSERT INTO tblGugudan (dan, num, RESULT) VALUES (vdan, vnum, vdan * vnum);
END LOOP;
END LOOP;
END;
loop는 무조건 1씩 증가할 수 있다.
만약 10, 9, 8, 7..1로 감소하고 싶다면 reverse 키워드를 사용하면 된다.
while loop문
자바의 while문과 같이 조건 반복을 한다.
loop를 기반으로 한다.
DECLARE
vnum NUMBER := 1;
BEGIN
WHILE vnum <= 10 LOOP
dbms_output.put_line(vnum);
vnum := vnum + 1;
END LOOP;
END;
while과 loop 사이에 루프조건을 작성한다.
while 조건이 있기 때문에 exit 조건을 작성할 필요가 없다.
loop문과 cursor를 함께 사용하여 활용도를 높일 수 있다.
💡분기문