입력값을 받아 로직을 돌려 반영값을 돌려줍니다.
변수에 원하는 입력 값을 집어 넣어 사용할 수 있기 때문에 유지 보수에 좋습니다.
오라클에서는 기본적으로 필요한 함수를 제공하지만, 필요하다면 새로 만들 수 있습니다.
함수명을 보고 아래의 정보를 떠올릴 수 있도록 공부해야 합니다.
- 어떤 타입의 파라미터(매개 변수)가 들어갈까?
- 몇 개의 파라미터가 들어갈까?
- 반환되는 값을 무엇일까?
sys 계정에 있는 테이블입니다.
누구나 사용 가능하고 권한 부여가 가능합니다.
DUMMY 컬럼 하나만 존재하며 값은 'X'이고 데이터는 한 행만 존재합니다.
이번에 알아볼 Function, 함수를 실행하기 위해 DUAL 테이블을 사용할 것입니다.
오라클 함수는 입력 행을 기준으로 single Row, multi Row 함수로 나뉩니다.
single row function
WHERE 절에서 행의 데이터를 필터링하기 위해 사용 가능함. multi row function
* 대소문자 조작
LOWER
UPPER
INITCAP
* 문자열 조작
CONCAT (concatenation) : 문자열 합치기
SUBSTR : 문자열 자르기
INSTR : 문자열 중 특정 문자 위치
(왼쪽 부터 오른쪽 방향으로 검색)
(음수를 쓸 경우 반대 방향으로 검색)
0 반환LPAD : 왼쪽에 문자열 삽입 (RPAD 오른쪽에 삽입)
TRIM : 문자열 시작 부분과 종료 부분의 공백을 삭제
REPLACE : 문자열의 특정 부분을 변경
SELECT 'HELLO' || ',' || 'WORLD',
CONCAT('HELLO', CONCAT(',', 'WORLD')) CONCAT,
--> HELLO, WORLD
SUBSTR('HELLO, WORLD', 1, 5) SUBSTR,
--> HELLO
LENGTH('HELLO, WORLD') LENGTH,
--> 11
INSTR('HELLO, WORLD', 'O') INSTR,
--> 5
INSTR('HELLO, WORLD', 'O', 6) INSTR2,
--> 9
LPAD('HELLO, WORLD', 15, '*') LPAD,
--> ***HELLO, WORLD
RPAD('HELLO, WORLD', 15, '_') RPAD,
--> HELLO, WORLD***
REPLACE('HELLO, WORLD', 'O', 'X') REPLACE,
--> HELLX, WXRLD
TRIM(' HELLO, WORLD ') TRIM,
--> HELLO, WORLD
TRIM('D' FROM 'HELLO, WORLD') TRIM2
FROM dual;
숫자 조작
ROUND
TRUNC
MOD
SELECT ROUND(105.54, 1) round1,
--> 105.5
ROUND(105.54, 0) round2,
--> 106
ROUND(105.54, -1) round3,
--> 110
ROUND(105.54) round4,
--> 105
TRUNC(105.54, 1) trunc1,
--> 105.1
TRUNC(105.54, 0) trunc2,
--> 105
TRUNC(105.54, -1) trunc3,
--> 100
TRUNC(105.54) trunc4
--> 105
FROM dual;
SELECT empno, sal,
TRUNC(sal / 1000) --> 월급을 1000으로 나눈 값의 몫
MOD(sal, 1000) --> 월급을 1000으로 나눈 값의 나머지
FROM emp;
날짜/시간 조작
* DATE FORMAT
(1) YYYY, MM, DD…
(2) IW : 1년 동안의 주차. (1~53주차)
(3) D: 주간요일. 1~7까지 번호를 매김. (1:일, 2:월, 3:화, 4:수 ~ 7:토)
TO_DATE : 문자를 날짜로 형변환
TO_CHAR : 날짜를 문자로 형변환
SYSDATE : 서버의 현재 시간
SELECT TO_DATE('20191231', 'YYYYMMDD') lastday,
TO_DATE('20191231', 'YYYYMMDD') - 5 lastday_before5,
FROM dual;
SELECT SYSDATE,
SYSDATE + 1/24 시, -- 시에 1을 더하기
SYSDATE + 1/24/60 분, -- 분에 1을 더하기
SYSDATE + 1/24/60/60 초 -- 초에 1을 더하기
FROM dual;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD'), -- 년월일
TO_CHAR(SYSDATE), -- 서버 설정 기본
TO_CHAR(SYSDATE, 'YYYY'),-- 년도만
TO_CHAR(SYSDATE, 'HH24') -- 시간만
FROM dual;
SELECT SYSDATE, TO_CHAR(SYSDATE, 'IW'),
TO_CHAR(SYSDATE, 'D')
FROM dual;
ROUND
TRUNC
MONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
SELECT ename, TO_CHAR(hiredate, 'YYYYMMDD HH24:mi:ss') hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate), 2) months_between,
ADD_MONTHS(SYSDATE, 5) add_months,
ADD_MONTHS(TO_DATE('19951223', 'YYYYMMDD'), 15) add_months2,
NEXT_DAY(SYSDATE, 1) next_day,
LAST_DAY(SYSDATE) last_day,
TO_DATE(TO_CHAR(SYSDATE,'YYYYMM') || 01, 'YYYYMMDD') first_day
FROM emp;
TO_DATE, TO_CHAR, TO_NUMBER 직접 입력* NUMBER 형변환
TO_NUMBER(char, format) : (char) → (number)
TO_CHAR(date/num, format) : (number) → (character)
* format
9 : 숫자0 : 강제 0표시, : 1000자리 표시. : 소수점L : 화폐단위(사용자 지역)$ :달러 화폐표시SELECT :yyyymm, TO_CHAR(LAST_DAY(TO_DATE(:yyyymm, 'yyyymm')), 'dd') DT
FROM dual;
SELECT ename, sal, TO_CHAR(sal, 'L0009,999.00')
FROM emp;
NVL
SELECT empno, sal, comm, sal + NVL(comm, 0)
FROM emp;
NVL2
SELECT comm, sal, NVL2(comm, sal + comm, sal)
FROM emp;
NULLIF
SELECT job, empno, sal, NULLIF(sal, 3000)
FROM emp;
COALESCE
원하는 만큼 인자를 입력할 수 있는 가변 인자
스스로를 호출하는 재기 함수
--> Java로 표현하자면
if(ex1 != null)
sysout(ex1);
else
COALESCE(ex2, ex3....);
[...]
if(ex2 != null)
sysout(ex2);
else
COALESCE(ex3....);
[...]
CASE
: 참, 거짓을 판단하는 수식으로 값을 반환
CASE
WHEN expr1 비교식 THEN 반환값
WHEN expr2 비교식 THEN 반환값2
...
ELSE 반환값n
END
SELECT ename, job, sal,
CASE
WHEN job = 'SALESMAN' THEN sal * 1.05 -- sal + sal * 0.05
WHEN job = 'MANAGER' THEN sal * 1.10
WHEN job = 'PRESIDENT' THEN sal * 1.20
ELSE sal * 1.0
END sal_bonus
FROM emp;
DECODE
: 동등비교를 통해 값을 반환 (default를 쓰지 않으면 null 반환)
DECODE(expr1,
search1, return1, (expr1이 search1과 같으면 return1을 반환)
search2, return2,
search3, ruturn3,
...
[, default])
SELECT ename, job, sal,
DECODE(job,
'SALESMAN', sal * 1.05,
'MANAGER', sal * 1.10,
'PRESIDENT', sal * 1.20,
sal * 1.0) sal_bonus
FROM emp;