데이터베이스 관련 특정 작업을 수행하는 명령어와 실행에 필요한 여러 요소를 정의하는 명령어 등으로 구성되며, 이러한 명령어를 모아 둔 PL/SQL 프로그램의 기본 단위

DECLARE
[실행에 필요한 여러 요소 선언];
BEGIN
[작업을 위해 실제 실행하는 명령어];
EXCEPTION
[PL/SQL 수행 도중 발생하는 오류 처리];
END;

DECLARE
--GREETING VARCHAR2();
GREETING VARCHAR2(30); --변수 역할
BEGIN
GREETING := 'HEllo, PL/SQL!'; -- := 이게 대입연산자임
DBMS_OUTPUT.PUT_LINE(GREETING); --출력에 사용하는 메서드
END;
/*
--여러줄 주석
*/
📚자료형
- 스칼라: 단일값- 숫자, 문자열, 날짜, 논리형
- NUMBER: 숫자
- CHAR
- VARCHAR2
- DATE: 날짜
- BOOLEAN: 논리형, true, fale, NULL
LOB: Large OBject - CLOB, BLOB- 참조형
- %TYPE: 특정 테이블의 컬럼(1)의 자료형을 참조
- %ROWTYPE: 특정 테이블의 모든 컬럼들을 참조
- 복합형
- RECORD: 여러 변수와 자료형을 한꺼번에 선언하는 방식 / 레코드
- TABLE: 키 - 값 형태
DECLARE
V_NUM CONSTANT NUMBER := 1000; --상수
BEGIN
--V_NUM := 2000; 불가능
DBMS_OUTPUT.PUT_LINE(V_NUM); --상수가 되어서 값을 바꿀 수 없다.
END;
변수에 NULL 값 저장 막기
1) 변수이름 자료형 NOT NULL := 값 또는 값이 도출되는 표현식
2) 변수에 NOT NULL을 설정하고 값을 대입한 수 출력하기
변수 이름 정하기
DECLARE
--EMPNO NUMBER(4) NOT NULL := 1000; -- NOT NULL일경우 초기화를 해줘야함
EMPNO NUMBER(4) NOT NULL DEFAULT 1000; -- 기본값 지정하는 또 다른 방식
ENAME VARCHAR2(10);
BEGIN
EMPNO := 1000;
ENAME := '내이름';
DBMS_OUTPUT.PUT_LINE(EMPNO || ' : ' || ENAME);
END;
📒%TYPE: 특정 테이블의 컬럼의 자료형을 참조
DECLARE
-- 타입을 통해서 다른 테이블의 컬럼참조하기
EMPNO EMP.EMPNO%TYPE
ENAME EMP.ENAME%TYPE;
BEGIN
EMPNO := 1000;
ENAME := '내이름';
DBMS_OUTPUT.PUT_LINE(EMPNO || ' : ' || ENAME);
END;
📒테이블의 모든 컬럼 참조하기
--컬럼명을 통해서 접근
DECLARE
EMP_ROW EMP%ROWTYPE;
BEGIN
EMP_ROW.EMPNO := 1000;
EMP_ROW.ENAME := '이이름';
EMP_ROW.JOB := 'CLERK';
EMP_ROW.DEPTNO := 40;
DBMS_OUTPUT.PUT_LINE('EMPNO : ' || EMP_ROW.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME : ' || EMP_ROW.ENAME);
DBMS_OUTPUT.PUT_LINE('JOB : ' || EMP_ROW.JOB);
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || EMP_ROW.DEPTNO);
END;
/*
EMPNO : 1000
ENAME : 이이름
JOB : CLERK
DEPTNO : 40
*/
DECLARE
EMP_ROW EMP%ROWTYPE;
BEGIN
--sql구문과 더 자주 쓰인다.
--주로 SELECT INTO구문과 많이 쓰임
SELECT * INTO EMP_ROW
FROM EMP WHERE ENAME='SCOTT';
DBMS_OUTPUT.PUT_LINE('EMPNO : ' || EMP_ROW.EMPNO);
DBMS_OUTPUT.PUT_LINE('ENAME : ' || EMP_ROW.ENAME);
DBMS_OUTPUT.PUT_LINE('JOB : ' || EMP_ROW.JOB);
DBMS_OUTPUT.PUT_LINE('DEPTNO : ' || EMP_ROW.DEPTNO);
END;
/*
EMPNO : 7788
ENAME : SCOTT
JOB : ANALYST
DEPTNO : 20
*/
스칼라
1) 숫자 NUMBER
2) 문자열 CHAAR, VARCHAR2
3) 날짜 DATE
4) 논리 데이터 BOOLEAN
참조형
1) %TYPE : 열을 참조
2) %ROWTYPE : 행을 참조
3) 변수 이름 테이블이름.열이름%TYPE
4) 참조형(열)의 변수에 값을 대입한 후 출력하기
5) 특정 테이블에서 하나의 열이 아닌 행 구조 전체를 참조할 때 %ROWTYPE을 사용
6) 변수이름 테이블이름%ROWTYPE
7) 참조형(행)의 변수에 값을 대입한 후 출력하기
IF 조건식 THEN
조건식이 참일때 실행
END IF;
DECLARE
V_NUMBER NUMBER := 22;
BEGIN
IF MOD(V_NUMBER, 2) = 1 THEN
DBMS_OUTPUT.PUT_LINE('홀수 입니다.');
END IF;
END;
2) IF-THEN-ELSE
DECLARE
V_NUMBER NUMBER := 22;
BEGIN
IF MOD(V_NUMBER, 2) = 1 THEN
DBMS_OUTPUT.PUT_LINE('홀수 입니다.');
ELSE
DBMS_OUTPUT.PUT_LINE('짝수 입니다.');
END IF;
END;
3) IF-THEN-ELSIF
DECLARE
V_SCORE NUMBER := 83; --B학점
BEGIN
IF V_SCORE >= 90 THEN
DBMS_OUTPUT.PUT_LINE('A학점');
ELSIF V_SCORE >= 80 THEN
DBMS_OUTPUT.PUT_LINE('B학점');
ELSIF V_SCORE >= 70 THEN
DBMS_OUTPUT.PUT_LINE('C학점');
ELSIF V_SCORE >= 60 THEN
DBMS_OUTPUT.PUT_LINE('D학점');
ELSE
DBMS_OUTPUT.PUT_LINE('F학점');
END IF;
END;
CASE
WHEN 조건, 값 TEHN ...
1) 단순 CASE: 값의 일치여부
1 -> 금메달, 2 -> 은메달, 3 -> 동메달DECLARE
V_RANK NUMBER := 3;
BEGIN
CASE V_RANK
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('금메달');
WHEN 2 THEN
DBMS_OUTPUT.PUT_LINE('은메달');
WHEN 3 THEN
DBMS_OUTPUT.PUT_LINE('동메달');
ELSE
DBMS_OUTPUT.PUT_LINE('해당하지 않습니다.');
END CASE;
END;
2) 검색 CASE
DECLARE
V_SCORE NUMBER := 75;
BEGIN
CASE
WHEN V_SCORE >= 90
THEN DBMS_OUTPUT.PUT_LINE('A학점');
WHEN V_SCORE >= 80
THEN DBMS_OUTPUT.PUT_LINE('B학점');
WHEN V_SCORE >= 70
THEN DBMS_OUTPUT.PUT_LINE('C학점');
WHEN V_SCORE >= 60
THEN DBMS_OUTPUT.PUT_LINE('D학점');
ELSE
DBMS_OUTPUT.PUT_LINE('F학점');
END CASE;
END;
1) 기본 LOOP: 반드시 반복 중단 조건이 필수 - 무한반복
EXIT, EXIT-WHEN 조건식(조건식이 참일때 중단)
LOOP
END LOOP;
#EXIT
DECLARE
V_NUM NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('VNUM : ' || V_NUM);
V_NUM := V_NUM +1;
IF V_NUM > 4 THEN EXIT;
END IF;
END LOOP;
END;
/*
VNUM : 1
VNUM : 2
VNUM : 3
VNUM : 4
*/
#EXIT-WHEN
DECLARE
V_NUM NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('VNUM : ' || V_NUM);
V_NUM := V_NUM +1;
--IF V_NUM > 4 THEN EXIT;
--END IF;
EXIT WHEN V_NUM > 4;
END LOOP;
END;
2) WHILE LOOP
WHILE 조건식 LOOP
조건이 참일때 반복되는 구간
END LOOP;
DECLARE
V_NUM NUMBER := 1;
BEGIN
WHILE V_NUM <= 4 LOOP
DBMS_OUTPUT.PUT_LINE('V_NUM: '|| V_NUM);
V_NUM := V_NUM +1;
END LOOP;
END;
3) FOR LOOP
FOR i IN 0..4 LOOP --i는 0~4 반복
END LOOP;
FOR i IN REVERSE 0..4 LOOP --i는 4~0 역순 반복
END LOOP;
BEGIN
FOR i IN 1..4 LOOP
DBMS_OUTPUT.PUT_LINE('i: '|| i);
END LOOP;
END;
/*
i: 1
i: 2
i: 3
i: 4
*/
4) Cursor For LOOP
1) EXIT
2) EXIT-WHEN
3) CONTINUE: 반복 건너뛰기
4) CONTINUE-WHEN 조건식;
#1부터 100까지 숫자 중에서 홀수만 덧셈
DECLARE
V_TOTAL NUMBER := 0;
BEGIN
FOR i IN 1..100 LOOP
CONTINUE WHEN MOD(i,2) = 0; -- 2로 나눈 나머지가 0일때 건너뛰기
V_TOTAL := V_TOTAL + i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('합계: '|| V_TOTAL);
END;
-- 합계 : 2500