DB/Oracle2009/08/10 15:07

0. Introduction

Oracle requires minimal changes from the MySQL configuration except for the usual gotchas :-)

Drivers for older Oracle versions may be distributed as *.zip files rather than *.jar files. Tomcat will only use *.jar files installed in $CATALINA_HOME/common/lib. Therefore classes111.zip or classes12.zip will need to be renamed with a .jar extension. Since jarfiles are zipfiles, there is no need to unzip and jar these files - a simple rename will suffice.

For Oracle 9i onwards you should use oracle.jdbc.OracleDriver rather than oracle.jdbc.driver.OracleDriver as Oracle have stated that oracle.jdbc.driver.OracleDriver is deprecated and support for this driver class will be discontinued in the next major release.

1. Context configuration

In a similar manner to the mysql config above, you will need to define your Datasource in your Context. Here we define a Datasource called myoracle using the thin driver to connect as user scott, password tiger to the sid called mysid. (Note: with the thin driver this sid is not the same as the tnsname). The schema used will be the default schema for the user scott.

Use of the OCI driver should simply involve a changing thin to oci in the URL string.

<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
username="scott" password="tiger" maxActive="20" maxIdle="10"
maxWait="-1"/>

2. web.xml configuration

You should ensure that you respect the element ordering defined by the DTD when you create you applications web.xml file.

<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3. Code example

You can use the same example application as above (asuming you create the required DB instance, tables etc.) replacing the Datasource code with something like

Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
//etc.
저작자 표시 비영리 변경 금지
Posted by Mizix
DB/Oracle2009/07/24 14:09
그룹함수


SUM함수
==> 그룹의 누적 합계를 반홚나다.

SELECT SUM(SAL)
FROM EMP;

AVG
==> 그룹의 평균을 반환한다.

SELECT AVG(SAL)
FROM EMP;

MAX
==>그룹의 최대값을 반환한다.

SELECT MAX(SAL)
FROM EMP;

MIN
==> 그룹의 최소값을 반환한다.

SELECT MIN(SAL)
FROM EMP;

SELECT ENAME,MIN(SAL)
FROM EMP;

※위 와같은 문장은 에러가 난다. ENAME은 그룹함수가 아니기 때문에 각각 산출되는 값의 갯수가 달라서 매치 시킬수 없기 때문이다. 즉, 800이라는 결과값을 SMITH에도 붙일 수도 없고 ALLEAN에 붙일 수도 없기 때문이다.


COUNT
==> 그룹의 총 개수를 반환한다. 테이블에서 조건을 만족하는 행의 갯수를 반환하는 함수이다.

SELECT COUNT(*),COUNT(COMM)
FROM EMP;
COUNT(*) : 테이블의 전체 로우(행)개수를 표시한다.
COUNT(COMM) : COMM 칼럼에서 NULL이 아닌 행개수를 표시한다.
저작자 표시 비영리 동일 조건 변경 허락
Posted by Mizix
DB/Oracle2009/07/16 17:42
(1) TO_CHAR 함수
TO_CHAR(datetime, 'format')
>> 데이터 관련 데이터 타입을 VARCHAR2 데이터 타입으로 변환.


SQL>
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD')
FROM dual;

TO_CHAR(number, 'format')
>> NUMBER 데이터 타입을 VARCHAR2 데이터 타입으로 변환.

SQL>
SELECT TO_CHAR(20000, '$999,999')
FROM dual;

>> 두 예제는 각각의 SYSDATE를 'YYYY-MM-DD' 형식의 VARCHAR2 데이터 타입으로 변환과 NUMBER데이터 타입인 20000을 '$999,999'형식의 VARCHAR2데이터 타입으로 변환해서 출력해준다.

(2) NVL 함수
NVL(ex1, ex2)
>>ex1의 값이 없는 경우, 즉 NULL이면 ex2의 값을 반환.

SQL>
SELECT NVL(employee_id,0), job_id
FROM employees

>>employee_id 칼럼의 데이터를 조회할 때 값이 없는 곳은 0으로 표시해서 출력한다.

Posted by Mizix
DB/Oracle2009/07/16 12:14
날짜 함수 사용법

(1)SYSDATE 함수
SYSDATE
>> 시스템의 설정된 날짜 값을 반환.


SQL>
SELECT SYSDATE
FROM dual;



(2) ADD_MONTHS 함수
ADD_MONTH(date,integer)
>> 지정한 날짜에서 해당 월에 정수를 더한 값을 반환.


SQL>
SELECT TO_CHAR(ADD_MONTHS(SYSDATE, 30),'YYYY-MM-DD')
FROM dual;
>> 첫번째 인자인 SYSDATE로 현재의 날짜인 시스템 날짜 값을 받고, 두번재 인자로 그 해당월에 30개월 뒤의 날짜를 반환한다. 반환할때는 'YYYY-MM-DD' 형식으로 출력한다.




(3) LAST_DAY 함수
LAST_DAY(date)
>>해당월의 남은 일수를 반환.

SQL>
SELECT LAST_DAY(SYSDATE)
FROM dual;
>> 현재 날짜를 시스템 날짜 값으로 받고 그 해당 월의 남은 일수를 반환한다. '2009-04-20' 이면, '2009-04-30'일에서 해현재의 날짜를 뺀 결과인 10을 반환한다.



(4) MONTHS_BETWEEN 함수
MONTHS_BETWEEN(date1, date2)
>> date1과 date2 사이의 기간을 월로 나타낸다.

SQL>
SELECT MONTHS_BETWEEN(LAST_DAY(SYSDATE),SYSDATE)
FROM dual;

>> 현재 날짜의 마지막날을 받고, 현재 날짜를 뺀다. 그 결과를 월(month)단위로 표시한다.

Posted by Mizix
DB/Oracle2009/07/16 11:38
SQL 명령어중 단일행함수중 문자함수 사용법


2)문자함수
(1) LOWER 함수
LOWER(char)
>> 입력된 문자 값을 소문자로 변환한다.


SQL>
SELECT LOWER('KOrea') "Lower"
FROM dual;
>>문자값 중 대문자를 소문자로 변환한다.
※ 오라클은 테이블에 저장되어있는 데이터에 대해서 대소문자를 구분합니다.
예를들어 'King'이라는 사원의 이름이 있다면, WHERE절로 질의문을 써서 조건을 줄때 'king'로 했다면, 검색이 안된다.
EX) WHERE last_name = 'seo'
      결과  : no roew selected라고 검색된 레코드가 없다고 메세지를 준다.



(2) SUBSTR 함수
SUBSTR(문자열, 시작 문자 위치, 반환할 문자 갯수)
>>입력된 문자열을 시작 문자 위치에서 부터 문자 갯수 만큼 반환한다.


SQL>
SELECT SUBSTR('Korea Economy', 1, 5) "subtr"
FROM dual;
>>'Korea Economy' 문자열의 시작위치 1부터 5까지의 문자를 반환한다.
결과 : Korea

Posted by Mizix
DB/Oracle2009/07/14 18:50
1) 숫자 함수
(1) MOD 함수
MOD(m,n)
>>m을 n으로 나누었을 때 나머지 값을 반환.

SQL>
SELECT MOD(10,3) "Modulus"
FROM Dual;
>> 10을 3으로 나누었을 때 나머지 값을 반환한다. 결과는 Dual의 "Modulus"라는 칼럼에 출력한다.



(2) ROUND 함수
ROUND(m,n)
m을 n+1 자리에서 반올림 한 결과를 반환한다.

SQL>
SELECT ROUND(18.354, 2) "Round"
FROM Dual;
>> 18.354 를 소수점 셋째 자리에서 반올림 하여 반환한다. 결과값은 18.35

SQL>
SELECT ROUND(18.354, -1) "Round"
FROM Dual;
>> 18.354 를 정수 첫째 자리에서 반올림 하여 반환한다. 결과값은 20



(3) WIDTH_BUCKET 함수
WIDTH_BUCKET(expr, min_value, max_value, num_bucker
최소,최대값으 범위(min,max)를 설정하고 구간(bucker)을 나누어 expr이 어디에 속하는지 반환한다.

SQL>
SELECT WIDTH_BUCKET(92, 0, 100, 10) "Score"
FROM dual;
>> 0 부터 100까지를 10개의 구간으로 나누어 92가 몇번째 구간에 속하는지 그 구간의 위치를 반환해준다.



Posted by Mizix
DB/Oracle2009/07/14 15:42
2. 오라클 - ORDER BY, GROUP BY, HAVING

1) ORDER BY
- 데이터 정렬해서 보기
ORDER BY 칼럼이름 [ASC|DESC]

※ ORDER BY에 기본은 ASC정렬(오름차순)이다.
    ASC 오름차순 - 작은 값부터 큰 값
    DESC
내림차순 - 큰 값부터 작은 값

● 오름차순으로 정렬하기
SQL>
SELECT employee_id, last_name, salary
FROM employees
WHERE salary >= 10000
ORDER BY salary;
>> employees 안에 있는 데이터 중 salary >= 10000 의 조건을 만족하는 데이터의 employee_id, last_name, salary 칼럼을 조회한다. 이때 salary의 데이터를 기준으로 오름차순으로 출력한다.

● 내림차순으로 정렬하기
SQL>
SELECT employee_id, last_name, salary
FROM employees
WHERE salary >= 10000
ORDER BY salary DESC;
>> employees 안에 있는 데이터 중 salary >= 10000 의 조건을 만족하는 데이터의 employee_id, last_name, salary 칼럼을 조회한다. 이 때 salary의 데이터를 기준으로 내림차순으로 출력한다.



2) GROUP BY - 데이터 그룹화하기
GROUP BY 칼럼이름

※칼럼의 동일한 데이터끼리 그룹으로 묶는다

그룹화하여 평균 구하기
SQL>
SELECT department_id, AVG(salary)
FROM employees
GROUP BY
department_id
ORDER by department_id;
>> employees 안에 있는 데이터 중 department_id, AVG(salary)를 조회한다. 조회할 때 부서별(department_id)로 그룹화 한 후 부서별 급여(salary)의 평균을 구한다. 그 후에 department_id를 기준으로 오름차순으로 출력한다.

※ AVG(salary)는 salary의 평균값을 구하는 공식.

연도별 그룹화하기
SELECT TO_CHAR(hire_date, 'yyyy'), AVG(salary)
FROM employees
GROUP BY TO_CHAR(hire_date, 'yyyy');

>> employees 안에 있는 데이터 hire_date, salary의 데이터를 hire_date의 연도별로 그룹화 한 후, 연도별 평균 값을 출력한다.

※TO_CHAR(hire_date, 'yyyy')  는 hire_date의 연도(yyyy)의 값을 구한다. TO_CHAR에서 더 설명함.



3) HAVING - GROUP BY의 결과로부터 특정 조건을 만족하는 것만 조회하기
GROUP GY 칼럼이름
HAVING 조건

※그룹으로 묶어진 칼럼에서 조건에 맞는 그룹만 조회한다.

●조건에 만족하는 그룹만 출력하기
SQL>
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary0>=10000;
>> employees 안의 데이터를 동일한 department_id 별로 그룹으로 묶어 그룹별 급여평균이 10000이상인 그룹만 조회한다.



Posted by Mizix
DB/Oracle2009/07/14 14:33

1. 오라클 - SELECT, WHERE

 

1) SELECT - 데이터 조회 하기

SELECT 칼럼, 칼럼, ....
FROM 테이블

●테이블의 모든 칼럼 조회
SELECT *
FROM 테이블;

>>테이블 안에 있는 모든 데이터를 조회한다.

●테이블의 특정 칼럼 조회
SELECT 칼럼1, 칼럼2, ....
FROM 테이블;

>>테이블 안에 있는 특정 칼럼들만 조회한다.



2) WHERE - 전체 데이터중 조건을 만족하는 값만 조회하기

WHERE 칼럼이름 조건값

● 기본적인 조건 조회하기
SQL) SELECT employee_id, hire_date
        FROM employees
        WHERE last_name = 'king';


>> employees 안에 있는 데이터 중 last_name= 'king'인 데이터의 employee_id, hire_date 칼럼을 조회한다.


SQL) SELECT employee_id, last_name, salary

         FROM employees
        WHERE salary >= 10000;

>> employees 안에 있는 데이터 중 salary >= 10000 의 조건을 만족하는 데이터의 employee_id, last_name, salary 칼럼을 조회한다.
※ 테이블에 저장된 문자 데이터에 대해서는 대소문자를 구분한다. 그리고 문자, 날짜 데이터는 ' '으로 묶어서 표현해 주어야한다.


● AND를 이용한 조건 설정

SQL) SELECT employee_id, last_name, salary

         FROM employees
        WHERE salary >= 10000

        AND salary <= 20000;

>> employees 안에 있는 데이터중 salary >= 10000, salary <=20000 의 두 조건을 모두 만족하는 데이터의 employee_id, last_name, salary을 조회한다.

 

● OR를 이용한 조건 설정

SQL) SELECT employee_id, last_name, salary

         FROM employees
        WHERE salary >= 10000

        OR salary <= 20000;

 

>> employees 안에 있는 데이터 중 salary >= 10000, salary <=20000 의 두 조건중 하나라도 만족하는 데이터의 employee_id, last_name, salary을 조회한다.

 

● BETWEEN AND를 이용한 조건 설정. (AND 연산을 보다 간결하게)

SQL) SELECT employee_id, last_name, salary

         FROM employees
        WHERE salary BETWEEN 10000 AND 20000


>> 위의 AND를 이용한 조건설정을 BETWEEN AND를 이용해 보다 간편하게 표현할수 있다.
(BETWEEN AND 연산은 =<, => 과 같은 말이다. >, <와 같은 미만,초과와 같은 표현은 AND연산으로 비교해야함.)

● IN를 이용한 조건 설정 (OR연산을 보다 간결하게)

SQL) SELECT employee_id, last_name, job_id

         FROM employees
        WHERE job_id = 'FI_MGR'

        OR job_id = 'FI_ACCOUNT'

        OR job_id = 'SA_MGR';

 

       위의 부분을

 WHERE job_id IN ('FI_MGR', 'FI_ACCOUNT','SA_MGR');

 으로 보다 간결하게 표현할수 잇다.

 

>>  위 IN조건 중 하나라도 만족하는 데이터의 employee_id, last_name, job_id를 조회한다.

 

● IS NULL/NOT를 이용한 조건 설정

SQL> SELECT employee_id, last_name, job_id, salary, commision_pct

FROM employees

WHERE commission_pct IS NOT NULL; //IS NULL일 경우에는 값이 있는 것을 조회한다.

 

>> employees 안에 있는 데이터 중 commission_pct의 값이 NULL이 아닌 데이터의 employee_id, last_name, job_id, salary, commision_pct를 조회한다.
※ NULL은 0이 아니다. 할당되지 않은 값을 말한다. 즉, commission_pct에 아무런 값이 없을때를 말함.
commission_pct의 값에 0이 들어가있다면, 그것은 0이라는 값이 할당된것이다.


● LIKE를 이용한 조건 설정

SQL> SELECT employee_id, last_name, hire_date

FROM employees

WHERE hire_date BEETWEEN '97/01/01' AND '97/12/31'

위의 노란 부분을


WHERE hire_date LIKE '97%';

이렇게 바꿀수 있다.

hire_date는 입사일임.


>>두 구문은 hire_date안의 97년 입사자를 조회한다. 97%의 의미는 '97'로 시작되는 모든 값은 조건을 만족하며, 만약에 사원이름을 검색할때 일부만 기억하고 있을경우 'Au'로 LIKE를 이용하여 조건절을 설정하면 'Au'로 시작하는 사원을 조회한다.
※ 연도를 이용하여 조건을 검색할때는 2자리로 검색하는 것보다, 4자리로 검색하는게 좋다. 1970년과 2070년의 구분의 의미가 없어지기 때문이다.
Posted by Mizix