PL/SQL

ใ…Žใ„ฑใ…‡ยท2024๋…„ 2์›” 1์ผ
0

DB๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
14/14

๐ŸงธPL/SQL


PL/SQL

  • Procedural Language extension to SQL
  • Oracle Corporation์—์„œ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
  • SQL์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜์—ฌ SQL๋ฌธ์žฅ ๋‚ด์—์„œ ๋ณ€์ˆ˜์˜ ์ •์˜, ์กฐ๊ฑด์ฒ˜๋ฆฌ, ๋ฐ˜๋ณต์ฒ˜๋ฆฌ ๋“ฑ ์ง€์›
  • ํ”„๋กœ์‹œ์ €, ํŠธ๋ฆฌ๊ฑฐ, ํ•จ์ˆ˜ ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ



๐ŸŽ€๊ธฐ๋ณธ ๊ตฌ์กฐ


DECLARE (์„ ์–ธ๋ถ€)

  • ๋ณ€์ˆ˜ or ์ƒ์ˆ˜ ์„ ์–ธ

BEGIN (์‹คํ–‰๋ถ€)

  • SQL๋ฌธ
  • ์กฐ๊ฑด๋ฌธ
  • ๋ฐ˜๋ณต๋ฌธ

EXCEPTION (์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ถ€)

  • ์˜ˆ์™ธ ๊ธฐ์ˆ 

์ถœ๋ ฅ ๋‚ด์šฉ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋„๋ก ์„ค์ •

-- ๊ธฐ๋ณธ๊ฐ’OFF์—ฌ์„œ ON์œผ๋กœ ๋ณ€๊ฒฝ
SET SERVEROUTPUT ON;

์ถœ๋ ฅํ•  ๋•Œ

DBMS_OUTPUT.PUT_LINE('์ถœ๋ ฅํ• ๋‚ด์šฉ||๋ณ€์ˆ˜||'์ถœ๋ ฅํ• ๋‚ด์šฉ');

์ž…๋ ฅํ•  ๋•Œ
&์ž…๋ ฅ

  • ๋ฌธ์žํƒ€์ž…์„ ๋ฐ›์„ ๋•Œ๋Š” ''๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ
  • ๋„์–ด์“ฐ๊ธฐ ์‹œ ๊ณต๋ฐฑ ๋’ค์— ๋‚ด์šฉ์ด ๊ฐ’์— ํฌํ•จ๋จ
    ex) '&์‚ฌ์ˆ˜ ์‚ฌ๋ฒˆ'(x)
    ex) '&์‚ฌ์ˆ˜_์‚ฌ๋ฒˆ'(o)

๐ŸงธDECLARE - ์„ ์–ธ๋ถ€


๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ถ€๋ถ„ (์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ)

๋ฐ์ดํ„ฐ(ํƒ€์ž…) ์„ ์–ธ ์ข…๋ฅ˜

  • ์ผ๋ฐ˜ํƒ€์ž…
  • ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…
  • ROWํƒ€์ž…

โœจ1. ์ผ๋ฐ˜ ํƒ€์ž… ๋ณ€์ˆ˜ ์„ ์–ธ

[ํ‘œํ˜„์‹]

๋ณ€์ˆ˜๋ช… [CONSTANT] ์ž๋ฃŒํ˜• [:=๊ฐ’];
  • ์ƒ์ˆ˜ ์„ ์–ธ ์‹œ CONSTANT ์ž‘์„ฑ
  • ์ดˆ๊ธฐํ™” ์‹œ :=๊ฐ’ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ

[์˜ˆ์‹œ]

DECLARE
    EID NUMBER;
    ENAME VARCHAR2(20);
    PI CONSTANT NUMBER := 3.14;
BEGIN
    -- ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…
    EID := 100;
    ENAME := 'ํ™๊ธธ๋™';

    -- EID, ENAME, PI ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ถœ๋ ฅ
    -- ํŠน์ • ๋ฌธ์ž์™€ ๋ณ€์ˆ˜๋ฅผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ์—ฐ๊ฒฐ์—ฐ์‚ฐ์ž(||)๋ฅผ ์‚ฌ์šฉ
    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/

[์˜ˆ์‹œ] - ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์„ ๋•Œ
๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ '&๋Œ€์ฒด๋ณ€์ˆ˜๋ช…' ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ

DECLARE
    EID NUMBER;
    ENAME VARCHAR2(20);
    PI CONSTANT NUMBER := 3.14;
BEGIN
    -- ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์Œ
    EID := &๋ฒˆํ˜ธ;
    ENAME := 'ํ™๊ธธ๋™';

    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('PI : ' || PI);
END;
/

โœจ2. ๋ž˜ํผ๋Ÿฐ์Šค ํƒ€์ž… ๋ณ€์ˆ˜ ์„ ์–ธ

์–ด๋–ค ํ…Œ์ด๋ธ”์˜ ์–ด๋–ค ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์ฐธ์กฐํ•ด์„œ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •

[ํ‘œํ˜„์‹]

๋ณ€์ˆ˜๋ช… ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช…%TYPE;

๋ณ€์ˆ˜๋ช….์ปฌ๋Ÿผ๋ช…์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ

[์˜ˆ์‹œ]

DECLARE
    EID EMPLOYEE.EMP_ID%TYPE;
    ENAME EMPLOYEE.EMP_NAME%TYPE;
    SAL EMPLOYEE.SALARY%TYPE;
BEGIN
    -- EMPLOYEE ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ๋ฒˆ์ด 200๋ฒˆ์ธ ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์‚ฌ์›๋ช…, ์›”๊ธ‰ ์กฐํšŒ
    SELECT EMP_ID, EMP_NAME, SALARY
    INTO EID, ENAME, SAL        -- ๊ฐ ์ปฌ๋Ÿผ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋Œ€์ž…
    FROM EMPLOYEE
    WHERE EMP_ID = &์‚ฌ๋ฒˆ;       -- ์‚ฌ๋ฒˆ์„ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ๋Œ€์ž…

    DBMS_OUTPUT.PUT_LINE('EID : ' || EID);
    DBMS_OUTPUT.PUT_LINE('ENAME : ' || ENAME);
    DBMS_OUTPUT.PUT_LINE('SAL : ' || SAL);
END;
/

โœจ3. ROW ํƒ€์ž… ๋ณ€์ˆ˜ ์„ ์–ธ

ํ…Œ์ด๋ธ”์˜ ํ•œ ํ–‰์— ๋Œ€ํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ๊ฐ’์„ ํ•œ๊บผ๋ฒˆ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜
[ํ‘œํ˜„์‹]

๋ณ€์ˆ˜๋ช… ํ…Œ์ด๋ธ”๋ช…%ROWTYPE;



๐ŸงธBEGIN - ์‹คํ–‰๋ถ€


๐ŸŽ€SQL๋ฌธ

SELECT ์ปฌ๋Ÿผ, ์ปฌ๋Ÿผ
INTO ๋ณ€์ˆ˜, ๋ณ€์ˆ˜	--ROW ํƒ€์ž… ๋ณ€์ˆ˜
FROM ํ…Œ์ด๋ธ”๋ช…
[WHERE ์กฐ๊ฑด์‹]

๐ŸŽ€์กฐ๊ฑด๋ฌธ

์ข…๋ฅ˜

1. ๋‹จ๋… IF ๋ฌธ
2. IF ~ ELSE๋ฌธ
3. IF ~ ELSIF๋ฌธ
4. CASE ~ WHEN ~ THEN๋ฌธ

โœจ1. ๋‹จ๋… IF ๋ฌธ

IF ์กฐ๊ฑด์‹
	THEN ์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
END IF;

โœจ2. IF ~ ELSE๋ฌธ

IF ์กฐ๊ฑด์‹
  THEN ์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
ELSE ์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
END IF;

โœจ3. IF ~ ELSIF๋ฌธ

IF ์กฐ๊ฑด์‹
  THEN ์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
ELSIF ์กฐ๊ฑด์‹2
  THEN ์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
END IF;

โœจ4. CASE ~ WHEN ~ THEN๋ฌธ

CASE ๋น„๊ต๋Œ€์ƒ
	WHEN ๋™๋“ฑ๋น„๊ต๊ฐ’1 THEN ๊ฒฐ๊ณผ๊ฐ’1
    WHEN ๋™๋“ฑ๋น„๊ต๊ฐ’2 THEN ๊ฒฐ๊ณผ๊ฐ’2
    ...
    ELSE ๊ฒฐ๊ณผ๊ฐ’N
END;

๐ŸŽ€๋ฐ˜๋ณต๋ฌธ

์ข…๋ฅ˜

1. BASIC LOOP๋ฌธ
2. FOR LOOP ๋ฌธ
3. WHILE LOOP ๋ฌธ

โœจ1. BASIC LOOP๋ฌธ

LOOP
	๋ฐ˜๋ณตํ•  ๊ตฌ๋ฌธ
    IF ์กฐ๊ฑด์‹ THEN EXIT;
    END IF;
    EXIT WHEN ์กฐ๊ฑด์‹
END LOOP;

โœจ2. FOR LOOP ๋ฌธ

FOR ๋ณ€์ˆ˜ IN [REVERSE] ์‹œ์ž‘๊ฐ’.. ๋๊ฐ’
LOOP
	๋ฐ˜๋ณต ์ˆ˜ํ–‰๋  ๊ตฌ๋ฌธ
END LOOP;
* REVERSE : ๋๊นž๋ถ€ํ„ฐ ์‹œ์ž‘๊ฐ’์œผ๋กœ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰

โœจ3. WHILE LOOP ๋ฌธ

WHILE ์กฐ๊ฑด์‹
LOOP
	๋ฐ˜๋ณต์ˆ˜ํ–‰ํ•  ๊ตฌ๋ฌธ
END LOOP;



๐ŸงธEXCEPTION - ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ถ€


EXCEPTION
	WHEN ์˜ˆ์™ธ๋ช…1 THEN ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๊ตฌ๋ฌธ;
    WHEN ์˜ˆ์™ธ๋ช…2 THEN ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๊ตฌ๋ฌธ;
    ...
    WHEN OTHERS THEN ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๊ตฌ๋ฌธ;

โœจ์‹œ์Šคํ…œ ์˜ˆ์™ธ

์˜ค๋ผํด์—์„œ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋‘” ์˜ˆ์™ธ๋ช…

NO_DATA_FOUND

์กฐํšŒ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ

TOO_MANY_ROWS

์กฐํšŒ๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋งŽ์„ ๋•Œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ

ZERO_DIVIDE

0์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ

DUP_VAL_ON_INDEX

UNIQUE ์ œ์•ฝ์กฐ๊ฑด์— ์œ„๋ฐฐ๋˜๋Š” ๊ฒฝ์šฐ

0๊ฐœ์˜ ๋Œ“๊ธ€