48_[db]pl sql(procedural langauge for sql) 기초 변수,상수
PL/SQL(Procedural Langauge for SQL) 기초-변수,상수, 조건문, 반복문
- SQL만으로 구현이 어렵거나 불가능한 작업을 수행하기 위해서 오라클에서 제공하는 프로그래밍 언어
🌹 PL/SQL 구성
- DB 관련 특정 작업을 수행하는 명령어
- 실행에 필요한 여러 요소를 정의하는 명령어
- etc
💐 Block 블록
- 위에서 언급된 명령어들을 모아둔, PL/SQL 프로그램의 기본 단위
🌺 PL/SQL 블록의 기본 형식
--선언부
DECLARE --선택
[실행에 사용될 변수,상수, 커서 등을 선언]
--실행부
BEGIN --필수
[조건문, 반복문, SELECT, DML, 함수 등을 정의]
--예외처리부
EXCEPTION --선택
[PL/SQL 실행 도중 발생하는 예외 상황을 해결하는 문장 기술]
END;
🌟 중요한 점은 위에서 지금은 설명을 위해 중간에 주석을 달아두었지만, 주석이 중간에 들어가면 오류가 발생될 수 있다! 따라서 이점을 주의하자!
PL/SQL 블록의 기본 형식은 위와 같이
- 선언부 DECLARE -실행에 사용될 변수, 상수, 커서 등을 선언 -선택사항
- 실행부 BEGIN -조건문, 반복문, SELECT, DML, 함수 등을 정의 -필수 사항
- 예외처리부 EXCEPTION -PL/SQL 실행 도중 발생하는 예외 상황을 해결하는 문장을 기술 -선택 사항
🌟 위의 기본 형식의 마무리에는 꼭 블록이 끝났음을 나타내는
END; /
를 적어주어야 한다!
🌟 PL/SQL 실행 결과를 화면에 출력하기 위해 미리 준비해주어야 하는 설정!
-SERVEROUTPUT 환경 변수 값을 ON으로 변경
SET SERVEROUTPUT ON;
-DBMS_OUTPUT.PUT_LINE(‘~’); == 자바에서의 System.out.println(); DBMS_OUTPUT.PUT(‘~’)==자바에서의 System.out.print();
DBMS_OUTPUT.PUT_LINE(‘Hello World!’); DBMS_OUTPUT.PUT(‘Hello World!’);
SET SERVEROUTPUT ON;
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!');
END;
/
위의 블록을 실행하면 스크립트 화면에 Hello World!가 출력되는 것을 확인해볼 수 있다!
🌟 PL/SQL 블록에서 주의해야할 사항 🌟
- DECLARE, BEGIN, EXCEPTION 키워드에는 ;를 사용하지 않는다
- PL/SQL 블록에서 각 부(선언부, 실행부, 예외처리부) 내부 문장에서는 끝에 ;를 꼭 붙이기
- PL/SQL 블록 내부에서는 한 줄 주석(—)과 여러줄 주석(/**/)을 사용할 수 있지만, 중간에 삽입되는 경우 간혹 오류를 내뱉기도 한다!
- PL/SQL 블록을 마무리하고 실행하기 위해서 마지막에는 END;/를 붙여서 사용한다
1. 변수와 상수
🌺 기본 변수 선언과 사용
변수이름 자료형:=값 또는 값이 도출되는 여러 표현식;
🌟 | 기호는 DBMS_OUTPUT.PUT_LINE() 내부에서 여러 데이터 사이를 연결하여 출력될 때 사용된다! |
(변수 사용 예시)
DECLARE
V_EMPNO NUMBER(4) :=123;
V_ENAME VARCHAR2(30);
BEGIN
V_ENAME:='홍길동';
DBMS_OUTPUT.PUT_LINE('직원번호:'||V_EMPNO||',직원이름: '||V_ENAME);
END;
/
🌺 기본 상수 선언과 사용
변수이름 CONSTANT 자료형:=값 또는 값을 도출하는 여러 표현식;
변수와의 차이점은 변수이름과 자료형 사이에 CONSTANT라는 키워드를 추가했다는 점이다
(상수 사용 예시)
아래와 같이, 상수는 CONSTANT 키워드를 붙임으로써 구별할 수 있다
뿐만아니라, 한 가지 더 눈여겨볼 점은 r-value(편의상 r-value로 명명. 자바나 c 언어 기준으로 이해하기 쉽도록!)에 표현식을 넣어도 계산되어 저장되었다는 점이다!
DECLARE
V_CONST CONSTANT NUMBER(3) :=5*3;
BEGIN
DBMS_OUTPUT.PUT_LINE('상수 V_CONST: '||V_CONST);
END;
/
🌺 변수의 기본값 지정하기
변수이름 자료형 DEFAULT 값 또는 값 도출되는 여러 표현식;
🌺 변수에 NULL 값 저장 막기
변수이름 자료형 NOT NULL:= :=값 또는 값이 도출되는 여러 표현식;
변수이름 자료형 NOT NULL DEFAULT 값 또는 값이 도출되는 여러 표현식; ▶️ 변수의 기본값으로도 지정할 수 있음!
🌟 PL/SQL 에서 식별자(변수 및 객체) 이름 짓기 규칙 🌟
- 같은 블록 내에서 식별자는 고유해야 하고, 중복될 수 없음
- 대소문자 구별 ❌
- 테이블 이름 붙이는 규칙과 같은 규칙을 따름
🌺 변수의 자료형 - 스칼라, 복합, 참조, LOB(Large OBject)
- 스칼라형: 내부 구성 요소가 없는 단일 값. C/JAVA 등의 프로그래밍 언어에서의 원시 자료형과 유사
- 참조형
A) 열을 참조하는 %TYPE
변수이름 테이블이름.열이름%TYPE;
B.) 행을 참조하는 %ROWTYPE;
변수이름 테이블이름%ROWTYPE;
%ROWTYPE에서 중요하게 살펴볼 점은,
DECLARE
**D_ROW** DEPT%ROWTYPE;
BEGIN
SELECT DEPTNO, DNAME,LOC INTO **D_ROW**
FROM DEPT
WHERE DEPTNO=40;
DBMS_OUTPUT.PUT_LINE('DEPTNO: '||D_ROW.DEPTNO);
DBMS_OUTPUT.PUT_LINE('DNAME: ' || D_ROW.DNAME);
DBMS_OUTPUT.PUT_LINE('LOC: '||D_ROW.LOC);
END;
/
선언부에서 ROWTYPE으로 참조하여 행을 저장한 변수 D_ROW를 실행부에서 이용하여
사용할 데이터를 선택할 때 INTO를 사용하여 매칭시켜주었다는 점이다!
SELECT A,B,C INTO 참조형변수
FROM 테이블이름
[WHERE 조건식];
- 복합형, LOB형
- 복합형 : 여러 종류 및 갯수의 데이터를 저장하기 위해서 사용자가 직접 정의하는 자료형 -컬렉션 : 한 가지 자료형의 데이터를 여러개 저장(테이블의 열과 유사)(자료형: TABLE) -레코드 : 여러 종류 자료형의 데이터를 저장(테이블의 행과 유사)(자료형: RECORD)
- LOB형 : 대용량의 텍스트, 이미지, 동영상, 사운드 데이터 등 대용량 데이터를 저장하기 위한 자료형 -BLOB, CLOB 등
2. 조건문, 반복문
2.1. 조건문 - IF문, CASE 문
- IF 조건문
- IF-THEN : 특정 조건 만족하는 경우 작업 수행
- IF-THEN-ELSE: 특정 조건을 만족하는 경우와 반대의 경우에 각각 지정한 작업 수행
- IF-THEN-ELSIF : 여러 조건에 따라 각각 지정한 작업 수행
[USAGE]
🌹 IF-THEN
IF 조건식 THEN
수행할 명령어;
END IF; --IF문 종료
🌹 IF-THEN-ELSE
IF 조건식 THEN
수행할 명령어;
ELSE
수행할 명령어;
END IF;
🌹 IF-THEN-ELSIF
IF 조건식 THEN
수행할 명령어;
ELSIF 조건식
수행할 명령어;
ELSE
수행할 명령어;
END IF;
- CASE 조건문
- 자바에서의 SWITCH-CASE와 대응되는 ‘결과값에 따라 여러 수행 작업을 지정할 수 있는 조건문!’
- 자바에서의 경우와 유사하게 PL/SQL에서는 숫자, 문자열 에서 사용가능!
- 단순 CASE 문 : 비교 기준이 되는 조건의 값이 여러가지일 때, 해당 값만 명시하여 작업 수행
- 검색 CASE 문: 비교 기준을 명시하지 않고 각각의 WHEN절에서 조건식을 명시한 후 해당 조건 만족 시 수행할 작업을 명시
🌹 단순 CASE 문
CASE 비교기준
WHEN 값1 THEN
수행할 명령어;
WHEN 값2 THEN
수행할 명령어;
...
ELSE
수행할 명령어;
END CASE;
🌹 검색 CASE 문
CASE
WHEN 값1 THEN
수행할 명령어;
WHEN 값2 THEN
수행할 명령어;
...
ELSE
수행할 명령어;
END CASE;
2.2 반복(제어)문
🌹반복 제어문의 종류
- 기본 LOOP : 기본 반복문
LOOP
반복 수행 작업;
END LOOP;
위에서처럼 일정 반복을 수행하는 경우, EXIT-WHEN으로 특정 조건 만족 시 현재 반복하는 주기를 건너뛰고 나갈 수 있게 하였다. 이 EXIT-WHEN은 IF와 EXIT를 이용해서 동일한 기능을 수행할 수 있게 된다
DECLARE
V_NUM NUMBER:=6;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('현재 V_NUM: '||V_NUM);
V_NUM:=V_NUM+1;
IF V_NUM>10 THEN EXIT;
END IF;
END LOOP;
END;
/
- WHILE LOOP : 특정 조건식의 결과를 통해 반복 수행
WHILE 조건식 LOOP
반복 수행 작업;
END LOOP;
- FOR LOOP : 반복 횟수를 정하여 반복 수행 -i는 카운터 -1씩 증감하면서 실행됨
FOR i IN 시작값 .. 종료값 LOOP
반복 수행 작업;
END LOOP;
위와 같이 자바에서처럼 중첩시켜서 구구단 출력 등을 수행할 수도 있다! 위의 경우는 바깥 루프에서 한번 고정하고, 내부 루프에서 반복을 수행한 후 다시 바깥 루프를 실행하는 순서로 진행됨으로써 위와 같은 형태로 구구단이 출력된다
-역순 반복 : 시작값과 종료값의 위치는 변하지 않고 오로지 REVERSE로 역순이 진행되는 것!
FOR i IN REVERSE 시작값..종료값 LOOP
반복 수행 작업;
END LOOP;
위의 경우 시작값을 2, 종료값을 9로 지정하였는데 REVERSE 설정을 정해줌으로써 9부터 적용되는 것을 확인해볼 수 있다
아래의 경우는 FOR 루프에서 CONTINUE WHEN을 이용하여 홀수 케이스에는 아무런 작업을 수행하지 않고 다음 주기로 넘어가서 작업을 수행한다. 그 결과, 짝수가 출력되는 것을 확인할 수 있다
- Cursor FOR LOOP : 커서를 활용한 반복 수행 - 이 부분에서는 생략할 예정
🌺 자바에서의 BREAK, CONTINUE절과 유사한 기능들
- EXIT: 수행 중인 반복 종료
- EXIT-WHEN: 반복 종료를 위한 조건식 지정 후 만족시 반복 종료
- CONTINUE : 수행중인 반복의 현재 주기를 건너뜀
- CONTINUE-WHEN: 특정 조건식을 지정하고 조건식을 만족하면 현재 반복 주기를 건너뜀