● 내장함수
● 함수 반환값 존재
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;