함수 반환값 존재
일부만 쓰기위함
SELECT CURRENT_DATE FROM DUAL;
-- 반올림
SELECT ROUND(1.2345, 2) FROM DUAL;
-- 대문자로 변경
SELECT UPPER('asdfjiqjwri') FROM DUAL;
SELECT M.*, UPPER(M.USERID) FROM MEMBER1 M;
-- 일부만 가져오기(나이, 시작위치, 개수)
SELECT M.*, SUBSTR(M.USERAGE, 0, 1) FROM MEMBER1 M;
/
CREATE OR REPLACE FUNCTION FUNC_TODAY RETURN VARCHAR2
IS
V_DATE VARCHAR2(40);
BEGIN
SELECT TO_CHAR(CURRENT_DATE, 'YYYY"년"MM-DD HH24:MM:SS')
INTO V_DATE FROM DUAL;
RETURN V_DATE; -- 프로시저와 다른점!!
END;
/
-- 함수확인
SELECT FUNC_TODAY FROM DUAL;
/
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;
/
-- 실행 결과 55
SELECT FUNC_SUM(10) FROM DUAL;
SELECT M.*, FUNC_SUM(USERAGE) FROM MEMBER1 M;
/
-- 시퀀스 사용 무결성 오류 발생
INSERT ALL
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE )
VALUES(SEQ_BOARD3_NO.NEXTVAL, 'A1', 'A', 'B', 1, CURRENT_DATE)
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE )
VALUES(SEQ_BOARD3_NO.NEXTVAL, 'A1', 'A', 'B', 1, CURRENT_DATE)
SELECT * FROM DUAL;
COMMIT;
/
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, 'A1', 'A', 'B', 1, CURRENT_DATE)
INTO BOARD3(NO, TITLE, CONTENT, WRITER, HIT, REGDATE )
VALUES(FUNC_BOARD3_SEQ, 'A1', 'A', 'B', 1, CURRENT_DATE)
SELECT * FROM DUAL;
COMMIT;
SELECT * FROM BOARD3;
/
SELECT ID FROM (
SELECT M.*, ROW_NUMBER() OVER(ORDER BY M.AGE DESC) ROWN FROM MEMBER3 M
)
WHERE ROWN = 1;
CREATE OR REPLACE FUNCTION FUNC_MEMBER3_AGE RETURN MEMBER3.ID%TYPE
IS
V_TMP MEMBER3.ID%TYPE;
BEGIN
SELECT ID INTO V_TMP FROM (
SELECT M.*, ROW_NUMBER() OVER(ORDER BY M.AGE DESC) ROWN FROM MEMBER3 M
)
WHERE ROWN = 1;
RETURN V_TMP;
END;
/
CREATE OR REPLACE FUNCTION FUNC_MEMBER3_AGE RETURN VARCHAR2
IS
V_AGE VARCHAR2(10);
BEGIN
SELECT ID INTO V_AGE FROM MEMBER3 WHERE AGE=(SELECT MAX(AGE) FROM MEMBER3);
RETURN V_AGE;
END;
/
SELECT FUNC_MEMBER3_AGE FROM DUAL;
/
-- 전체순위
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;
CREATE OR REPLACE FUNCTION FUNC_MEMBER3_CNT RETURN NUMBER
IS
V_AGE NUMBER ;
BEGIN
SELECT COUNT(*) INTO V_AGE FROM MEMBER3 WHERE AGE >=10 AND AGE <=20;
--SELECT COUNT(*) INTO V_AGE FROM MEMBER3 WHERE AGE BETWEEN 10 AND 20;
RETURN V_AGE;
END;
/
SELECT FUNC_MEMBER3_CNT FROM DUAL;
/
CREATE OR REPLACE FUNCTION FUNC_MEMBER3_GENDER(uid VARCHAR2) RETURN VARCHAR2
IS
V_GEN VARCHAR2(2);
BEGIN
SELECT GENDER INTO V_GEN FROM MEMBER3 WHERE ID = uid;
IF V_GEN = 'M' THEN
RETURN '남';
ELSE
RETURN '여';
END IF;
END;
/
SELECT FUNC_MEMBER3_GENDER('A') FROM DUAL;
SELECT M.*, FUNC_MEMBER3_GENDER(ID) FROM MEMBER3 M;
/
CREATE OR REPLACE FUNCTION FUNC_BOARD3_HIT RETURN NUMBER
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자로 변환 ()
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;
SELECT * FROM BOARD3;
SELECT * FROM MEMBER3;