DB/Oracle

수업 34일차 - 문자 함수, 숫자 함수, 날짜 함수

hs_developer 2022. 6. 21. 14:50

문자 함수

-- 문자 함수(length, lengthb)
select length('ABC'), length('김')
from DUAL; -- 컬럼명 없을 때 사용, 연습용(계산 출력,함수 확인)

select length('ABC'), lengthb('김') --한글은 1개당 3바이트
from DUAL;

-- UPPER, LOWER, INITCAP
select upper('abc'), lower('ABC'), initcap('ABC')
from DUAL;

-- UPPER
select ename, job
from emp
where ename=UPPER('king');

-- UPPER, LOWER, INITCAP
select ename, upper(ename) "대문자", lower(ename) "소문자", initcap(ename) "이니셜" -- ALIAS(별칭)
from emp;

-- SUBSTR == substring()
select substr('ABCDEFG', 3, 1) -- 3번째에서 1글자 자르기
from dual;

-- YY/MM/DD
select ename, substr(hiredate, 1, 2), substr(hiredate, 4, 2), substr(hiredate, 7, 2)
from emp;

select ename, substr(hiredate, -1, 2), substr(hiredate, -4, 2), substr(hiredate, -7, 2)
from emp;

-- 81년에 입사한 사원의 이름, 입사일
select ename, hiredate
from emp
where substr(hiredate, 1, 2)=81;

-- INSTR == indexOf, lastIndexOf
select ename, instr(ename, 'A', 1, 1) -- 맨 앞에 있는 'A' 찾기
from emp;

-- 이름 3번째 자리가 'O'인 사원의 이름, 직위
select ename, job
from emp
where ename like '__O';

select ename, job
from emp
where instr(ename, 'O', 1, 1)=3

-- replace
select replace('hello java', 'java', 'oracle')
from dual;

-- trim (자바는 공백만 제거하지만, 오라클은 문자도 제거 가능)
-- ltrim : 왼쪽 제거
select ltrim('AAABBBCCCAAA', 'A')
from dual;

-- rtrim : 오른쪽 제거
select rtrim('AAABBBCCCAAA', 'A')
from dual;

-- trim : 양방향 제거
select trim('A' from 'AAABBBCCCAAA')
from dual;

-- lpad
select lpad('King', 8, '*'), lpad('King', 3, '#') -- 부족하면 채우고, 넘치면 자른다
from dual;

 

 

 

숫자 함수

-- mod 
-- 사번이 짝수인 사원의 이름, 직위, 사번
select ename, job, empno
from emp
where mod(empno, 2)=0;

-- ceil : 올림 함수
select count(*) from books;

-- 한 페이지당 15개 출력 : 총 페이지
select ceil(count(*)/15.0) from books;

-- round/trunc
select round(12345.789, 2), trunc(12345.789, 2)
from dual;

 

 

날짜 함수

-- 날짜 함수
-- **sysdate
select sysdate-1 "어제", sysdate "오늘", sysdate+1 "내일"
from dual;

-- **months_betweeen
-- 근무개월 수
select ename, round(months_between(sysdate, hiredate)/12) -- 개월수/12 == 연도
from emp;

-- next_day, last_day (거의 안 씀..)
select next_day('22/06/21', '화'), next_day('22/06/21', '수')
from dual;

-- 그 달의 마지막 날
select last_day('22/06/21'), last_day('22/06/21')
from dual;

-- **adds_month : 등록된 날의 날짜
--오늘부터 4개월 후 날짜
select add_months(sysdate, 4) 
from dual;

 

 

 

변환 함수

-- 요일 문자열로 변환
select to_char(sysdate, 'day')
from dual;

select ename, hiredate, to_char(hiredate, 'day')
from emp;

-- 화요일에 입사한 사원의 이름, 입사일, 급여
select ename, hiredate, to_Char(sal, '$99,999') "월급"
from emp
where to_char(hiredate, 'day') = '화요일';

 

 

기타 함수

-- **NVL(null 값 대체)
select ename, sal, comm, sal + NVL(comm, 0)
from emp;

-- decode(다중 조건문)
select ename, decode(deptno, 10, '개발부', 20, '영업부', 30, '총무부') dname
from emp;

select ename, deptno, case when deptno=10 then '개발부' when deptno=20 then '영업부' when deptno=30 then '총무부' end dname
from emp;
                              
-- 숫자 -> 문자 변환
select chr(65), chr(66), chr(67)
from dual;

 

 

오라클 자바 연동

package com.sist.dao;

import java.util.*;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Emp {

	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Date hiredate;
	private int sal;
	private int comm;
	private int dept;
	
	
}
package com.sist.dao;

import java.util.*;
import java.sql.*;

public class EmpDAO {

	// 오라클 연결 객체
	private Connection conn;
	
	// SQL 문장 전송
	private PreparedStatement ps;
	
	// 오라클 서버 URL에 연결
	private final String URL = "jdbc:oracle:thin@localhost:1521:XE";
	
	// 1. 드라이버 등록
	public EmpDAO()
	{
		try
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch(Exception ex) {}
	}
	
	// 2. 오라클 연결
	public void getConnection()
	{
		try
		{
			conn = DriverManager.getConnection(URL, "hr", "happy");
		} catch(Exception ex) {}
	}
	
	// 3. 오라클 닫기
	public void disConnection()
	{
		try
		{
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
			// exit
			
		} catch(Exception ex) {}
	}
	
	// 4. 기능
	// 4.1 목록 출력 - NVL 사용
	// 클래스는 한명, 한개의 정보를 new에 저장 -> List에 보관
	public ArrayList<Emp> empListData()
	{
		ArrayList<Emp> list = new ArrayList<Emp>();
		
		try
		{
			// 1. 연결
			getConnection();
			
			// 2. SQL 문장 생성
			String sql = "SELECT empno, ename, job, hiredate, sal, NVL(comm, 0) " + "FROM emp";
			
			// 3. 오라클 전송
			ps = conn.prepareStatement(sql);
			
			// 4. 결과 값 받기
			ResultSet rs = ps.executeQuery();
			
			while(rs.next()) // 처음부터 마지막까지
			{
				Emp emp = new Emp();
				emp.setEmpno(rs.getInt(1));
				emp.setEname(rs.getString(2));
				emp.setJob(rs.getString(3));
				emp.setHiredate(rs.getDate(4));
				emp.setSal(rs.getInt(5));
				emp.setComm(rs.getInt(6));;
				
				list.add(emp);
			}
			rs.close();
		} 
		catch(Exception ex)
		{
			ex.printStackTrace(); // 오류 처리
		}
		finally
		{
			disConnection(); // 오라클 닫기
		}
		return list;
	}
	
	// 4-2 상세보기 - WHERE 사용
	// 4-3 검색 - LIKE 사용
	
	
	
}
package com.sist.user;

import java.util.*;
import com.sist.dao.*;

public class MainClass {

	public static void main(String[] args) {
		
		// 오라클 연결
		EmpDAO dao = new EmpDAO();
		ArrayList<Emp> list = dao.empListData();
		
		for(Emp e:list)
		{
			System.out.println(e.getEmpno() + " "
                                        + e.getEname() + " "
                                        + e.getJob() + " "
                                        + e.getHiredate().toString() + " "
                                        + e.getSal() + " "
                                        + e.getComm() + " ");
		}
	}
}