[DB] function


MySQL function을 μ΄μš©ν•΄ 직원 μΆœμ„λ“±λ‘ ν•¨μˆ˜ λ§Œλ“€κΈ°


1.ν…Œμ΄λΈ” μƒμ„±ν•˜κΈ°

CREATE TABLE `EMP_ATTEND` (
    `ATTEND_YMD` VARCHAR(8) NOT NULL COLLATE 'utf8_bin',
    `EMP_NO` VARCHAR(9) NOT NULL COLLATE 'utf8_bin'
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;

κ°„λ‹¨ν•œ μ§μ›μΆœμ„ ν…Œμ΄λΈ”μ„ μƒμ„±ν•œλ‹€.


2.ν•¨μˆ˜ μƒμ„±ν•˜κΈ°

DELIMITER $$
 
DROP FUNCTION IF EXISTS FNC_ATTEND;
 
CREATE FUNCTION FNC_ATTEND(attendType VARCHAR(10), empNo VARCHAR(10)) RETURNS BOOL
// CREATE FUNCTION  "FUNCTION λͺ…" (λ³€μˆ˜κ°’1 νƒ€μž… , λ³€μˆ˜κ°’2 νƒ€μž…) RETURN νƒ€μž…

BEGIN
	 //DECLARE λ³€μˆ˜λͺ… varchar(50); λ³€μˆ˜μ„ μ–Έ	 
     DECLARE exist_flag INT;
     DECLARE returnVal  BOOL;
         SET returnVal = FALSE;
 
     -- μΆœμ„ 등둝
     IF 'attend'= attendType THEN
         SELECT COUNT(1)
           INTO exist_flag // μ‘°νšŒν•œ μ»¬λŸΌκ°’μΈ CODE_NAME 을 λ³€μˆ˜μ— λ„£λŠ”λ‹€.
           FROM EMP_ATTEND
          WHERE EMP_NO = empNo 
            AND ATTEND_YMD = DATE_FORMAT(NOW(), '%Y%m%d')
         ;
         
         IF exist_flag = 0 THEN
             INSERT INTO EMP_ATTEND(
                      ATTEND_YMD
                    , EMP_NO
             )VALUES(
                   DATE_FORMAT(NOW(), '%Y%m%d')
                     , empNo 
             );
             SET returnVal = TRUE;
         END IF;
     END IF;
      RETURN returnVal;
END $$
 
DELIMITER ;

function의 argument 2개λ₯Ό μ§€μ •ν•΄ μƒμ„±ν•˜κ³  return 값은 boolean으둜 λ°›κ² λ‹€.

λ§Œμ•½ arg둜 λ“€μ–΄μ˜¨ 첫번째 값이 λ¬Έμžμ—΄ β€˜attend’ 일경우 ν…Œμ΄λΈ”μ— ν•΄λ‹Ή μ§μ›μ˜ μ˜€λŠ˜λ‚ μ§œλ‘œ μΆœμ„ν•œ 데이터가 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  데이터가 μ—†λ‹€λ©΄ μ˜€λŠ˜λ‚ μ§œμ™€ μ§μ›λ²ˆν˜Έλ‘œ 값을 insertν•œλ‹€.

값이 insert 된 ν›„ returnVal의 값은 TRUEκ°€ λœλ‹€.


3.ν•¨μˆ˜ ν˜ΈμΆœν•˜κΈ°

-- if return value 0 then false
-- else if return value 1 then true
 
SELECT FNC_ATTEND('attend', '1000');

ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜κ³  μœ„μ™€ 같이 ν˜ΈμΆœμ„ ν•΄λ³Έλ‹€. 2개 νŒŒλžŒκ°’μ„ λ„£κ³  ν˜ΈμΆœν•˜λ©΄ 1μ΄λ‚˜ 0이 λ‚˜μ˜€κ²Œ λœλ‹€. 0이 λ‚˜μ˜€λ©΄ false, 1이 λ‚˜μ˜€λ©΄ true이닀.


  • μŠ€ν† μ–΄λ“œ ν•¨μˆ˜λŠ” ν”„λ‘œμ‹œμ €μ™€ 달리 IN OUT 을 μ‚¬μš©ν• μˆ˜ μ—†λ‹€.

  • μŠ€ν† μ–΄λ“œ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λŠ” λͺ¨λ‘ μž…λ ₯ νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©λœλ‹€.

  • μŠ€ν† μ–΄λ“œ ν•¨μˆ˜λŠ” RETURNS문으둜 λ°˜ν™˜ν•  κ°’μ˜ 데이터 ν˜•μ‹μ„ μ§€μ •ν•˜κ³ , λ³Έλ¬Έ μ•ˆμ—μ„œλŠ” RETURN 문으둜 ν•˜λ‚˜μ˜ 값을 λ°˜ν™˜ ν•΄μ•Ό ν•œλ‹€. μŠ€ν† μ–΄λ“œ ν”„λ‘œμ‹œμ €λŠ” λ³„λ„μ˜ λ°˜ν™˜ν•˜λŠ” ꡬ문이 μ—†κ³  OUT νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•΄μ„œ 값을 λ°˜ν™˜ ν•  수 μžˆλ‹€.

  • μŠ€ν† μ–΄λ“œ ν”„λ‘œμ‹œμ €λŠ” CALL 둜 ν˜ΈμΆœν•˜μ§€λ§Œ μŠ€ν† μ–΄λ“œ ν•¨μˆ˜λŠ” SELECT λ¬Έμž₯ μ•ˆμ—μ„œ ν˜ΈμΆœλœλ‹€.

  • μŠ€ν† μ–΄λ“œ ν”„λ‘œμ‹œμ € μ•ˆμ—λŠ” SELECT 문을 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ , μŠ€ν† μ–΄λ“œ ν•¨μˆ˜ μ•ˆμ—μ„œλŠ”

    μ§‘ν•© κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” SELECT λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

  • SELECT - INTO λŠ” μ§‘ν•© κ²°κ³Όλ₯Ό λ°˜ν™˜ ν•˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ μ˜ˆμ™Έμ μœΌλ‘œ μŠ€ν† μ–΄λ“œ ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

  • μŠ€ν† μ–΄λ“œ ν”„λ‘œμ‹œμ €λŠ” μ—¬λŸ¬ SQLλ¬Έμ΄λ‚˜ 숫자 계산 λ“±μ˜ λ‹€μ–‘ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜μ§€λ§Œ μŠ€ν† μ–΄λ“œ ν•¨μˆ˜λŠ” μ–΄λ–€ 계산을 ν†΅ν•΄μ„œ ν•˜λ‚˜μ˜ 값을 λ°˜ν™˜ ν•˜λŠ”λ° 주둜 μ‚¬μš©λœλ‹€.




reference

좜처: https://abc1211.tistory.com/136 [κΈΈμœ„μ˜ 개발자]