riboooo
Daily Traveler ๋ฆฌ๋ณด
riboooo
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (71)
    • ํ”„๋กœ์ ํŠธ,๋ฐœํ‘œ (2)
    • IT (67)
      • HTML ,CSS (3)
      • JAVA (22)
      • SQL (37)
      • ์ž๋ฃŒ๊ตฌ์กฐ,์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
      • PYTHON (4)
      • ๋ณด์•ˆ (0)
      • ์„œ๋ฒ„ ๊ตฌ์ถ• (0)
      • GITHUB (1)
    • About ribo (2)
      • ์ปค๋ฆฌ์–ด (1)
      • ํšŒ๊ณ ๋ก (1)
      • ๋ฒ„ํ‚ท๋ฆฌ์ŠคํŠธ (0)
      • ์ผ๊ธฐ (0)
      • ์žก๋‹ด (0)
    • ์ฑ… (0)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • join
  • ๋„ค์ด๋ฒ„ํ•ต๋ฐ์ด
  • oracle
  • select
  • ORACLE NULL ํ•จ์ˆ˜
  • django์„ค๊ณ„
  • ORACLE CASE
  • java
  • ์˜ค๋ผํด
  • ์ž๋ฐ”์ฝ”๋”ฉ์ปจ๋ฒค์…˜
  • ORACLE ๋‚ ์งœ ๊ด€๋ จ ํ•จ์ˆ˜
  • INSTALLED_APPS
  • ORACLE ์ˆซ์ž ํ•จ์ˆ˜
  • Django
  • inspectdb
  • ์‹œ๊ฐ„ ์ค‘๋ณต ํ™œ์šฉ
  • SQL
  • prewise
  • non-prewise
  • ORACLE ์กฐ๊ฑด๋ฌธ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
riboooo

Daily Traveler ๋ฆฌ๋ณด

IT/SQL

[ORACLE]PL/SQL

2022. 1. 11. 21:37

PL/SQL

๐Ÿ’ก Procedural Language / SQL
  • ์ง‘ํ•ฉ์  ์„ฑํ–ฅ์ด ๊ฐ•ํ•œ SQL์— ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€

๊ธฐ๋ณธ ๊ตฌ์กฐ

์„ ์–ธ๋ถ€(Declare)

  • ๋ณ€์ˆ˜, ์ƒ์ˆ˜ ์„ ์–ธ
  • ์ƒ๋žต๊ฐ€๋Šฅ

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

  • ์ œ์–ด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ๋“ฑ ๋กœ์ง ์‹คํ–‰

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

  • ์‹คํ–‰๋„์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ์„ catch, ํ›„์†์กฐ์น˜
  • ์ƒ๋žต๊ฐ€๋Šฅ

์—ฐ์‚ฐ์ž

  • := ๋Œ€์ž…์—ฐ์‚ฐ์ž
  • ** ์ œ๊ณฑ์—ฐ์‚ฐ์ž

๋ณ€์ˆ˜

๋ณ€์ˆ˜

์ผ๋ฐ˜ํƒ€์ž…

var VarTYPE( );

๋ณ€์ˆ˜ ์ฐธ์กฐ ํƒ€์ž…

๐Ÿ’ก ๋ณ€์ˆ˜ ํƒ€์ž…์„ ํŠน์ • ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์„ ์ง€์นญํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

table.column%TYPE ;

DECLARE
    deptno dept.deptno%TYPE;
    dname dept.dname%TYPE;

โญ•๋ณตํ•ฉ๋ณ€์ˆ˜

ROWTYPE

๐Ÿ’ก ํŠน์ • ํ…Œ์ด๋ธ”์˜ ํ–‰์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํ–‰ ์ฐธ์กฐ๋ณ€์ˆ˜

์„ ์–ธ : ๋ณ€์ˆ˜๋ช… ํ…Œ์ด๋ธ”๋ช…%ROWTYPE
์ ‘๊ทผ : ๋ณ€์ˆ˜๋ช….์ปฌ๋Ÿผ๋ช…

DECLARE 
    v_dept_row dept%ROWTYPE;
BEGIN
    SELECT * INTO v_dept_row
    FROM dept
    WHERE deptno=10;
    DBMS_OUTPUT.PUT_LINE('dname : ' || v_dept_row.dname);
    DBMS_OUTPUT.PUT_LINE('deptno : ' || v_dept_row.deptno);
    DBMS_OUTPUT.PUT_LINE('loc : ' || v_dept_row.loc);
END;
/

/*
dname : ACCOUNTING
deptno : 10
loc : NEW YORK
*/

RECODE TYPE

๐Ÿ’ก ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ–‰์˜ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์€ ROWTYPE๊ณผ ๋™์ผ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜
DECLARE
    TYPE dept_row_type IS RECORD(
    deptno dept.deptno%TYPE,
    dname dept.dname%TYPE);

    dept_rec dept_row_type;
BEGIN
    SELECT deptno, dname
    INTO dept_rec
    FROM dept
    WHERE deptno=10;

    DBMS_OUTPUT.PUT_LINE('dept_row : ' || dept_rec.deptno || ',' || dept_rec.dname);
END;
/

TABLE TYPE

๐Ÿ’ก ๋ณต์ˆ˜๊ฐœ์˜ ํ–‰์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

TABLE ํ…Œ์ด๋ธ”ํƒ€์ž…์ด๋ฆ„ IS TABLE OF ํ–‰์˜ ํƒ€์ž… INDEX BY BINARY_INTEGER

DECLARE
    TYPE dept_tab_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

    v_dept_tab dept_tab_type;

BEGIN
    SELECT * BULK COLLECT INTO v_dept_tab
    FROM dept;

    FOR i IN 1..v_dept_tab.count LOOP
        DBMS_OUTPUT.PUT_LINE(v_dept_tab(i).deptno || ' , ' || v_dept_tab(i).dname );
    END LOOP;
END;
/
/*
10 , ACCOUNTING
20 , RESEARCH
30 , SALES
40 , OPERATIONS*/

๋กœ์ง์ œ์–ด

์กฐ๊ฑด์ œ์–ด

IF

๐Ÿ’ก ์กฐ๊ฑด์ œ์–ด , ๋ถ„๊ธฐ

IF ์กฐ๊ฑด THEN
์‹คํ–‰ํ• ๋ฌธ์žฅ;
ELSIF ์กฐ๊ฑด THEN
์‹คํ–‰ํ•  ๋ฌธ์žฅ;
ELSE
์‹คํ–‰ํ• ๋ฌธ์žฅ;
END IF;

DECLARE
    p NUMBER := 2;
BEGIN
    IF p = 1 THEN
         DBMS_OUTPUT.PUT_LINE('p=1');
    ELSIF p = 2 THEN
         DBMS_OUTPUT.PUT_LINE('p=2');
    ELSE
         DBMS_OUTPUT.PUT_LINE('else');
    END IF;
END;
/

/*
p=2 */

๋ฐ˜๋ณต๋ฌธ

FOR - LOOP

FOR count IN [REVERSE] start..end LOOP
statement;
END LOOP;

counter : index variable( i )

DECLARE
BEGIN
FOR i IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('for i :'  || i);
END LOOP;
END;
/
/*
for i :1
for i :2
for i :3
for i :4
for i :5*/

WHILE

WHILE condition
LOOP
statement;
END LOOP;

DECLARE
    i NUMBER := 1;
BEGIN
    WHILE i <= 5 LOOP
        DBMS_OUTPUT.PUT_LINE( i );
        i := i+1;
    END LOOP;
END;
/

LOOP

LOOP
statement;
EXIT [when condition];
END LOOP;

DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        EXIT WHEN i > 5;
            DBMS_OUTPUT.PUT_LINE( i );
            i := i + 1;
    END LOOP;
END;
/

๋ธ”๋ก ์œ ํ˜•

Anonymous block
Procedure
Function

Anonymous block

๐Ÿ’ก ์ด๋ฆ„์ด ์—†๋Š” block ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
-- ํ™”๋ฉด ์ถœ๋ ฅ์„ ํ™œ์„ฑํ™” ํ•˜๋Š” ์„ค์ • ( ์ ‘์†ํ›„ 1ํšŒ๋งŒ ์‹คํ–‰ํ•˜๋ฉด ์œ ์ง€)
SET SERVEROUTPUT ON;
-- ๊ฐ„๋‹จํ•œ PL/SQL์ต๋ช… ๋ธ”๋Ÿญ

DECLARE
    deptno NUMBER(2);
    dname VARCHAR2(20);
BEGIN
    SELECT deptno, dname  INTO deptno, dname
    FROM dept
    WHERE deptno =10;

    dbms_output.Put_line(deptno || '    ' || dname);
END;
/   -- ์‹ค์ง์ ์œผ๋กœ PL/SQL ๊ตฌ๋ฌธ์ด ๋๋‚˜๋Š” ๋ถ€๋ถ„

/*
10    ACCOUNTING

PL/SQL ํ”„๋กœ์‹œ์ €๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
*/

Procedure

๐Ÿ’ก ์ด๋ฆ„์ด ์žˆ๋Š” pl/sql ๋ธ”๋Ÿญ
  • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์„์ˆ˜ ์žˆ๊ณ  ์ ˆ์ฐจ์  ๋กœ์ง์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์ฝ”๋“œ ์ž‘์„ฑ
  • ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋ทฐ

  1. ๋ทฐ ์ƒ์„ฑ
  2. select *
    from ๋ทฐ

ํ”„๋กœ์‹œ์ € ์ ˆ์ฐจ

  1. ํ”„๋กœ์‹œ์ € ์ƒ์„ฑ (CREATE OR REPLACE ...)
  2. ํ”„๋กœ์‹œ์ € ์‹คํ–‰ (EXEC ํ”„๋กœ์‹œ์ €๋ช…)

โ™ฆ๏ธ์ธ์ž๊ฐ€ ์—†๋Š” ํ”„๋กœ์‹œ์ € ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

CREATE OR REPLACE PROCEDURE print_dept IS

    dname dept.dname%TYPE;
    loc dept.loc%TYPE;
BEGIN
    SELECT dname, loc  INTO  dname ,loc
    FROM dept
    WHERE deptno =10;

    DBMS_OUTPUT.PUT_LINE(dname || '    ' || loc);
END;
/

-- ์‹คํ–‰
EXEC print_dept;

--ACCOUNTING    NEW YORK

โ™ฆ๏ธ์ธ์ž๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์‹œ์ € ์ƒ์„ฑ

ํ”„๋กœ์‹œ์ €๋ช… (์ธ์ž๋ช…1 IN ์ธ์žํƒ€์ž…1, ....)

์ธ์ž๋ช… : ์ฃผ๋กœ P_ ์ ‘๋‘์–ด ์ฃผ๋กœ ์‚ฌ์šฉ

๋ณ€์ˆ˜๋ช… : ์ฃผ๋กœ V_ ์ ‘๋‘์–ด ์ฃผ๋กœ ์‚ฌ์šฉ

CREATE OR REPLACE PROCEDURE print_dept(p_deptno IN dept.deptno%TYPE) IS

    v_dname dept.dname%TYPE;
    v_loc dept.loc%TYPE;
BEGIN
    SELECT dname, loc  INTO  v_dname ,v_loc
    FROM dept
    WHERE deptno = p_deptno;

    DBMS_OUTPUT.PUT_LINE(v_dname || '    ' || v_loc);
END;
/

-- ์‹คํ–‰
EXEC print_dept(20);
--RESEARCH    DALLAS

Function

๐Ÿ’ก ๋กœ์ง์„ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” pl/sql ๋ธ”๋Ÿญ (return ํ•„์ˆ˜)

CURSOR (์ปค์„œ)

๐Ÿ’ก SELECT ๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๊ณต๊ฐ„
  • ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ฒŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•ด์ ธ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Œ.
  • ํ•œ๋ฒˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ถœํ•˜์ง€ ์•Š๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ธ์ถœ ๋‹จ๊ณ„๋ฅผ ์ œ์–ด ํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์ง€ ์•Š๊ณ ๋„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ.

์ปค์„œ์˜ ์ข…๋ฅ˜

  • ๋ฌต์‹œ์  ์ปค์„œ : ์ปค์„œ์ด๋ฆ„์„ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๊ฒฝ์šฐ
    โ‡’ ์˜ค๋ผํด์ด ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์คŒ
  • ๋ช…์‹œ์  ์ปค์„œ : ์ปค์„œ๋ฅผ ๋ช…์‹œ์  ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์„ ์–ธํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ์ปค์„œ๋ฅผ ์ง์ ‘ ์ œ์–ด ๊ฐ€๋Šฅ

์ปค์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (๋ช…์‹œ์  ์ปค์„œ)

  1. ์ปค์„œ ์„ ์–ธ (DECLARE)

    CURSOR ์ปค์„œ์ด๋ฆ„ IS

           SELECT ์ฟผ๋ฆฌ;
  2. ์ปค์„œ ์—ด๊ธฐ

    OPEN ์ปค์„œ์ด๋ฆ„;

  3. FETCH (์ธ์ถœ)

    FETCH ์ปค์„œ์ด๋ฆ„ INTO ๋ณ€์ˆ˜;

  4. ์ปค์„œ ๋‹ซ๊ธฐ

    CLOSE ์ปค์„œ์ด๋ฆ„;

-- dept ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด ๋ถ€์„œ๋ฒˆํ˜ธ, ๋ถ€์„œ์ด๋ฆ„์„ cursor๋ฅผ
--ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์‹ค์Šต

DECLARE
    CURSOR dept_cur IS     -- ์ปค์„œ์„ ์–ธ
        SELECT deptno, dname
        FROM dept;
    v_deptno dept.deptno%TYPE;
    v_dname dept.dname%TYPE;
BEGIN
    OPEN dept_cur;    -- ์ปค์„œ์—ด๊ธฐ

    LOOP
        FETCH dept_cur INTO v_deptno, v_dname;
        EXIT WHEN dept_cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_deptno || ' , ' || v_dname);        
    END LOOP;
END;
/

๋ช…์‹œ์  ์ปค์„œ FOR LOOP( ํ–ฅ์ƒ๋œ FOR ๋ฌธ)

FOR ๋ ˆ์ฝ”๋“œ๋ช… IN ์ปค์„œ๋ช… LOOP
๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ฌธ์žฅ;
END LOOP;

  • OPEN, FETCH, CLOSE : 2~4๋‹จ๊ณ„๋ฅผ FOR LOOP์—์„œ ํ•ด๊ฒฐ
DECLARE
    CURSOR dept_cur IS     -- ์ปค์„œ์„ ์–ธ
        SELECT deptno, dname
        FROM dept;
BEGIN
    FOR dept_row IN dept_cur LOOP
        DBMS_OUTPUT.PUT_LINE(dept_row.deptno || ' , ' || dept_row.dname);        
    END LOOP;
END;
/

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ช…์‹œ์  ์ปค์„œ FOR LOOP

DECLARE
CURSOR ์ปค์„œ๋ช… (ํŒŒ๋ผ๋ฏธํ„ฐ๋ช… ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…) IS
QUERY ;
BEGIN
FOR ๋ ˆ์ฝ”๋“œ๋ช… IN ์ปค์„œ๋ช… LOOP
๋ฐ˜๋ณต ์‹คํ–‰ํ•  ๋ฌธ์žฅ;
END LOOP;
END;

DECLARE
    CURSOR emp_cur(p_deptno dept.deptno%TYPE) IS     -- ์ปค์„œ์„ ์–ธ
        SELECT empno, ename
        FROM emp
        WHERE deptno = p_deptno;
BEGIN
    FOR emp_row IN emp_cur(30) LOOP
        DBMS_OUTPUT.PUT_LINE(emp_row.empno || ' , ' || emp_row.ename);        
    END LOOP;
END;
/

์ธ๋ผ์ธ ์ปค์„œ ์„ ์–ธ

BEGIN
    FOR dept_row IN (SELECT deptno, dname FROM dept) LOOP
        DBMS_OUTPUT.PUT_LINE(dept_row.deptno || ' , ' || dept_row.dname);        
    END LOOP;
END;
/
๋ฐ˜์‘ํ˜•

'IT > SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ORACLE] ์ธ๋ฑ์Šค(INDEX) ๊ตฌ์กฐ  (0) 2022.01.11
[ORACLE]์‹คํ–‰๊ณ„ํš  (0) 2022.01.11
[ORACLE] Window ํ•จ์ˆ˜, ๋ถ„์„ํ•จ์ˆ˜  (0) 2022.01.11
[ORACLE]๊ณ„์ธต์ฟผ๋ฆฌ  (0) 2022.01.11
[ORACLE]Subquery Advanced  (0) 2022.01.11
    riboooo
    riboooo
    ์ตœ์ค€์˜ https://github.com/riboooo

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”