● 내장함수
● 함수 반환값 존재

SELECT CURRENT_DATE FROM DUAL;

● 반올림

SELECT ROUND(1.2345, 2) FROM DUAL;

● 대문자

SELECT UPPER('sdafFE') FROM DUAL;
SELECT M.*, UPPER(M.USERID) FROM MEMBER1 M;

● 일부만 가져오기(나이, 시작위치, 개수)

SELECT M.*, SUBSTR(M.USERAGE, 0, 1) FROM MEMBER1 M;

● 함수 만들기
● 오늘 날짜 만드는 함수: FUNC_TODAY

CREATE OR REPLACE FUNCTION FUNC_TODAY RETURN VARCHAR2
IS
    V_DATE VARCHAR2(40);
BEGIN
    SELECT TO_CHAR(CURRENT_DATE, 'YYYY"년 "MM"월 "DD"일" HH24:MI:SS')
    INTO V_DATE FROM DUAL;
    RETURN V_DATE;
END;
/

● 함수 확인

SELECT FUNC_TODAY FROM DUAL;

● 팩토리얼 함수: FUNC_SUM

CREATE OR REPLACE FUNCTION FUNC_SUM(tnum NUMBER) RETURN NUMBER
IS
    V_SUM NUMBER:= 0;
BEGIN
    FOR I IN 1..tnum LOOP
        V_SUM:= V_SUM + I;
    END LOOP;
    RETURN V_SUM;
END;
/

● 실행

SELECT FUNC_SUM(10) FROM DUAL;
SELECT M.*, FUNC_SUM(USERAGE) FROM MEMBER1 M;

● FUNC_BOARD3_SEQ => 현재의 시퀀스 값을 가져오는 함수

CREATE OR REPLACE FUNCTION FUNC_BOARD3_SEQ RETURN NUMBER
IS
    V_SEQ NUMBER:= 0;
BEGIN
    -- 시퀀스의 다음 숫자 가져오기
    SELECT SEQ_BOARD3_NO.NEXTVAL INTO V_SEQ FROM DUAL;
    RETURN V_SEQ;
END;
/

● 실행

SELECT FUNC_BOARD3_SEQ FROM DUAL;

● 일괄추가: 원래 일괄추가 시퀀스때문에 안됐었는데, 시퀀스를 함수로 넣으니 동작

INSERT ALL 
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE)
VALUES(FUNC_BOARD3_SEQ, 'TTT', 'EEE', 'F', 0, CURRENT_DATE)
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE)
VALUES(FUNC_BOARD3_SEQ, 'MMM', 'EEE', 'F', 0, CURRENT_DATE)
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE)
VALUES(FUNC_BOARD3_SEQ, 'HHH', 'EEE', 'F', 0, CURRENT_DATE)
SELECT * FROM DUAL;

● 실습

● MEMBER3에서 가장 나이가 많은 사람의 아이디를 구하는 함수
나이로 내림차순 세우고 첫번째 사람 아이디 가져오기

CREATE OR REPLACE FUNCTION FUNC_MEMBER3_AGE RETURN VARCHAR2
IS
    V_ID VARCHAR2(10);
BEGIN
    SELECT ID FROM (
    SELECT M.*, ROW_NUMBER() OVER(ORDER BY M.AGE DESC) ROWN FROM MEMBER3 M
    )
    WHERE ROWN = 1;

    RETURN V_ID;
END;
/

● 순위 관한 함수(RANK)
● 전체순위

SELECT M.*, RANK() OVER (ORDER BY AGE DESC ) RK FROM MEMBER3 M;

● 지역별 순위

SELECT M.*, RANK() OVER (PARTITION BY GENDER ORDER BY AGE DESC ) RK FROM MEMBER3 M;

● MEMBER3에서 나이가 10~20인 사람의 수 구하는 함수 (FUNC_MEMBER3_CNT)

 CREATE OR REPLACE FUNCTION FUNC_MEMBER3_CNT RETURN NUMBER
IS
    V_CNT NUMBER;
BEGIN
    SELECT COUNT(*) INTO V_CNT FROM MEMBER3 WHERE (10 < AGE AND AGE < 20);
    RETURN V_CNT;
END;
/
SELECT FUNC_MEMBER3_CNT FROM DUAL;

● MEMBER3 아이디가 일치하는 사람의 성별을 남,여로 반환하는 함수

 CREATE OR REPLACE FUNCTION FUNC_MEMBER3_GENDER(V_ID VARCHAR2) RETURN VARCHAR2
IS
    V_GEN VARCHAR2(10);
BEGIN
    SELECT GENDER INTO V_GEN FROM MEMBER3 WHERE ID=V_ID;
    IF V_GEN = 'F' THEN
        RETURN '여';
    ELSE
        RETURN '남';
    END IF;  
END;
/
SELECT FUNC_MEMBER3_GENDER('A') FROM DUAL;

● BOARD3에서 조회수가 10이상인 개수를 구하는 함수

CREATE OR REPLACE FUNCTION FUNC_BOARD3_HIT RETURN VARCHAR2
IS
    V_HIT NUMBER;
BEGIN
    SELECT COUNT(*) INTO V_HIT FROM BOARD3 WHERE HIT >= 10;
    RETURN V_HIT;
END;
/
SELECT FUNC_BOARD3_HIT FROM DUAL;

● 글번호가 전송되면 게시판의 자리수를 10자로 변환(LPAD)
1이면 0000000001, 1235면 0000001235

SELECT B.*, LPAD(HIT,10, 0)  FROM BOARD3 B;
CREATE OR REPLACE FUNCTION FUNC_BAORD3_HIT10(tmp NUMBER) RETURN VARCHAR2
IS
    V_TMP VARCHAR2(10);
BEGIN
    SELECT LPAD(HIT,10, 0) INTO V_TMP FROM BOARD3 WHERE NO=tmp;
    RETURN V_TMP;
END;
/
SELECT B.*, FUNC_BAORD3_HIT10(B.NO)  FROM BOARD3 B;

0개의 댓글