Programming/Oracle

[Oracle] PL/SQL 제어문: 조건문, 반복문, 분기문

Isaac S. Lee 2023. 9. 7. 14:23

💡조건문


 

[Java] 조건문: if문, switch문

제어문은 수많은 명령어들의 흐름(실행 순서)을 통제하는 수단을 의미한다. 제어문의 끝에 문장 종결자(;)를 사용하지 않는다는 특징이 있다. 제어문은 크게 조건문(조건 제어문)과 반복문(반복

isaac-christian.tistory.com

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문은 값을 제시하면 특정 결과를 돌려주는 방식으로 사용할 수도 있다.

 

💡반복문


 

[Java] 반복문: for, while, do while

반복문을 이용하면 특정 코드를 개발자가 원하는 횟수만큼 반복 제어하여 생산성을 향상하고, 유지보수성을 향상시킬 수 있다. 반복문의 종류로는 for, while, do while, for(foreach)가 있다. 이때, foreac

isaac-christian.tistory.com


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문을 사용하는 게 일반적이다.

 

 

[Oracle] 제약 사항 (Constraint)

💡제약 사항 제약사항(Constraint)은 해당 컬럼에 들어갈 데이터(값)에 대한 조건이다. 사용자는 컬럼에 엉뚱한 값이 들어가지 않고 올바른 값만 저장될 수 있도록 해야 한다. 만약 숫자형만 들어

isaac-christian.tistory.com

 

[Oracle] 테이블 수정 Alter Table문

💡테이블 수정하기 테이블 정의 수정 > 스키마 수정 > 컬럼 수정 > 컬럼명 OR 자료형 (길이) OR 제약사항 등 수정 테이블을 수정한다는 건 실제로는 컬럼명, 자료형, 제약사항 등의 것들을 수정하

isaac-christian.tistory.com

제약 사항과 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 조건을 작성할 필요가 없다.

 

 

[Oracle] PL/SQL Cursor

📌cursor select into와 cursor의 차이 select into 결과셋의 레코드가 1개일 때만 사용할 수 있다. cursor 결과셋의 레코드가 다중 레코드일 때 사용한다. 루프를 사용한다. declare 변수 선언; 커서 선언; begin

isaac-christian.tistory.com

loop문과 cursor를 함께 사용하여 활용도를 높일 수 있다.

 

💡분기문


 

[Java] 분기문: break문, continue문

분기문을 이용하면 개발자가 코드의 흐름을 원하는 곳으로 이동할 수 있다. 분기문의 종류로는 break, continue, goto가 있으며, goto는 가독성을 떨어트린다는 이유로 JDK 1.5 때 폐기되었다. 분기문은

isaac-christian.tistory.com