λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’»/ORACLE

(28)[ORACLE] 11일차 : PL/SQL - 2

by λ”°κΆˆ 2024. 3. 25.

 

 

ν”„λ‘œμ‹œμ €λž€?
PL/SQLμ—μ„œ κ°€μž₯ λŒ€ν‘œμ μΈ ꡬ쑰인 ν”„λ‘œμ‹œμ €λŠ” κ°œλ°œμžκ°€ 자주 μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” 업무 흐름(SQL)을
미리 μž‘μ„±ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ 내에 μ €μž₯ν•΄ λ‘μ—ˆλ‹€κ°€ ν•„μš”ν•  λ•Œλ§ˆλ‹€ ν˜ΈμΆœν•˜μ—¬ μ‹€ν–‰ ν•  수 μžˆλ‹€.
ν”„λ‘œμ‹œμ €λŠ” νŠΉμ •ν•œ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

ν”„λ‘œμ‹œμ € νŠΉμ§•
νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ ν”„λ‘œμ‹œμ €λŠ” 쀑볡 μ •μ˜ κ°€λŠ₯
ν…Œμ΄λΈ”μ΄ μ‚­μ œλ˜μ–΄λ„ μ—°κ΄€λœ ν”„λ‘œμ‹œμ €κ°€ μ‚­μ œ λ˜λŠ” 것은 μ•„λ‹ˆλ‹€
ν…Œμ΄λΈ”μ΄ μ‚­μ œλœ μƒνƒœμ—μ„œ μ—°κ΄€λœ ν”„λ‘œμ‹œμ €λ₯Ό μ‹€ν–‰ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
ν”„λ‘œμ‹œμ € μ•ˆμ—μ„œ INSERT,UPDATE,DELETE문을 μ‚¬μš©ν•˜λŠ” 경우
μžλ™ COMMIT λ˜μ§€ μ•ŠμœΌλ―€λ‘œ COMMIT; ꡬ문을 μΆ”κ°€ ν•΄μ•Όλœλ‹€.

 

ν”„λ‘œμ‹œμ € 정보 확인

--ν”„λ‘œμ‹œμ € λͺ©λ‘ν™•인
SELECT * FROM user_procedures;

--μ˜μ‘΄μ„± 확인
SELECT * FROM user_dependencies;

--μ†ŒμŠ€ 확인
SELECT * FROM user_source;

 

ν”„λ‘œμ‹œμ € 생성

CREATE [OR REPLACE] PROCEDURE ν”„λ‘œμ‹œμ €λͺ…
(
    (parameter [IN|OUT|IN OUT] λ°μ΄ν„°νƒ€μž…[:=λ””ν΄νŠΈ κ°’])
)
IS
    λ³€μˆ˜,μƒμˆ˜ λ“± μ„ μ–Έ
BEGIN   
    μ‹€ν–‰λΆ€
    [EXCEPTION μ˜ˆμ™Έ μ²˜λ¦¬λΆ€]
END;
/

 

  • OR REPLACE
    • ν”„λ‘œμ‹œμ €κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œμ‹œμ €λ₯Ό μƒμ„±ν•˜λ©°, μ‘΄μž¬ν•˜λ©΄ κΈ°μ‘΄ ν”„λ‘œμ‹œμ €λŠ” μž¬μž‘μ„±(μˆ˜μ •)ν•œλ‹€.
  • λ§€κ°œλ³€μˆ˜(parameter)
    • IN νŒŒλΌλ―Έν„° :ν˜ΈμΆœμžμ— μ˜ν•΄ ν”„λ‘œμ‹œμ €λ‘œ μ „λ‹¬λ˜λŠ” νŒŒλΌλ―Έν„°μ΄λ©°, '읽기' μ „μš©μ˜ κ°’μœΌλ‘œ ν”„λ‘œμ‹œμ €λŠ” 이 νŒŒλΌλ―Έν„°μ˜ 값을 λ³€κ²½ν•  수 μ—†λ‹€. (λ””ν΄νŠΈ λͺ¨λ“œ)
    • OUT νŒŒλΌλ―Έν„° : ν”„λ‘œμ‹œμ €μ—μ„œ 값을 λ³€κ²½ν•  수 있고, 'μ“°κΈ°' κΈ°λŠ₯으둜 ν”„λ‘œμ‹œμ €κ°€ 정보λ₯Ό ν˜ΈμΆœμžμ—κ²Œ λŒλ €μ£ΌλŠ” κΈ°λŠ₯. OUT νŒŒλΌλ―Έν„°λŠ” λ””ν΄νŠΈ 값을 μ§€μ •ν•  수 μ—†λ‹€.
    • IN OUT νŒŒλΌλ―Έν„° : ν”„λ‘œμ‹œμ €κ°€ 읽고 μ“°λŠ” μž‘μ—…μ„ λ™μ‹œμ— ν•  수 μžˆλŠ” νŒŒλΌλ―Έν„°.
  • νŒŒλΌλ―Έν„°λŠ” 데이터 νƒ€μž…λ§Œ λͺ…μ‹œν•˜κ³  크기λ₯Ό μ§€μ •ν•  수 μ—†λ‹€. 

 

ν”„λ‘œμ‹œμ € μ‹€ν–‰ 

-- μ‹€ν–‰ ν˜•μ‹
EXEC ν”„λ‘œμ‹œμ €λͺ… [(λ§€κ°œλ³€μˆ˜κ°’,λ§€κ°œλ³€μˆ˜κ°’2...)];

-- μ‹€ν–‰ ν˜•μ‹ 2
EXEC ν”„λ‘œμ‹œμ €λͺ… (λ§€κ°œλ³€μˆ˜λͺ…1=>κ°’1,λ§€κ°œλ³€μˆ˜λͺ…2=>κ°’2...);
'=>' 기호λ₯Ό μ‚¬μš©ν•΄ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λͺ…κ³Ό 값을 μ—°κ²°ν•˜λŠ” ν˜•νƒœλ‘œ μ‹€ν–‰ν•  수 μžˆλ‹€.

 

ν”„λ‘œμ‹œμ € μ‚­μ œ

DORP PROCEDURE ν”„λ‘œμ‹œμ €λͺ…;

 

 


 

 

μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λž€?
μ‚¬μš©μžκ°€ 직접 λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ—¬ κ΅¬ν˜„ν•œ ν•¨μˆ˜λ‘œ λ‚΄μž₯ ν•¨μˆ˜(빌트인 ν•¨μˆ˜)처럼 μΏΌλ¦¬μ—μ„œ ν˜ΈμΆœν•˜κ±°λ‚˜ EXECUTE문을 톡해 μ‹€ν–‰ ν•  수 μžˆλ‹€.
ν”„λ‘œμ‹œμ €λŠ” νŠΉμ •ν•œ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ§€λ§Œ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λŠ” κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.
νŒ¨ν‚€μ§€ λ‚΄μ—μ„œ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λŠ” 쀑볡 μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€. 


ν•¨μˆ˜ 생성

CREATE [OR REPLACE] FUNCTION ν•¨μˆ˜λͺ…
[(parameter 데이터 νƒ€μž…
[,parameter 데이터 νƒ€μž…...]
)]
RETURN 데이터 νƒ€μž…
IS
	λ³€μˆ˜,μƒμˆ˜ λ“± μ„ μ–Έ
BEGIN
	μ‹€ν–‰λΆ€
    
    RETURN λ°˜ν™˜κ°’;
    [EXCEPTION μ˜ˆμ™Έ μ²˜λ¦¬λΆ€]
    END;

 

  • OR REPLACE : μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λ©°, μ‘΄μž¬ν•˜λ©΄ κΈ°μ‘΄ ν•¨μˆ˜λŠ” μž¬μž‘μ„±(μˆ˜μ •)ν•œλ‹€.
  • λ§€κ°œλ³€μˆ˜ (parameter) : νŒŒλΌλ―Έν„°λŠ” 데이터 νƒ€μž…λ§Œ λͺ…μ‹œν•˜κ³  크기λ₯Ό μ§€μ •ν•  수 μ—†λ‹€.
  • RETURN 데이터 νƒ€μž… : λ°˜ν™˜λ˜λŠ” κ°’μ˜ 데이터 νƒ€μž…λ§Œ λͺ…μ‹œν•˜κ³  크기λ₯Ό μ§€μ •ν•  수 μ—†λ‹€.
  • RETURN λ°˜ν™˜κ°’; : ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³  ν˜ΈμΆœν•œ 곳으둜 λ°˜ν™˜ν•  값을 λͺ…μ‹œν•œλ‹€. 

 

μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜ 호좜

--맀개 λ³€μˆ˜κ°€ μ—†λŠ” 경우
EXEC ν•¨μˆ˜λͺ… λ˜λŠ” ν•¨μˆ˜λͺ…()

--맀개 λ³€μˆ˜κ°€ μžˆλŠ” 경우
EXEC ν•¨μˆ˜λͺ…(κ°’1,κ°’2...)

 

μ‚¬μš©μž μ •μ˜ μ‚­μ œ

DROP FUNCTION ν•¨μˆ˜λͺ…;

 

CREATE OR REPLACE FUNCTION fnSum
(
        n IN NUMBER
)
RETURN NUMBER
IS

    s NUMBER := 0;
BEGIN
    FOR i IN 1..N LOOP
        s:=s+i;
        END LOOP;
    RETURN s;
END;

/

--ν•¨μˆ˜ λͺ©λ‘ 확인
SELECT * FROM user_procedures;

--ν•¨μˆ˜ κ²°κ³Ό 확인 
SELECT fnSum(10),fnSum(100) FROM dual;