'먹고살기 > Oracle' 카테고리의 다른 글

오라클 관리자 계정  (0) 2011.04.05
REDO LOG FILE에 대해서  (0) 2011.04.05
ORACLE DATE (날짜 다루기)  (0) 2011.04.05
Database Link사용법  (0) 2011.04.05
사용자 세션의 강제 종료  (0) 2011.04.05
날짜 다루기

1) 현재의 날짜와 시간

SYSDATE을 사용합니다. 요번에 마친 프로젝트가 있는데, 파워빌더로 ORACLE DB연결해서 사용했거든요. 현재 날짜를 얻기 위해 다음과 같이 사용했어요.

SELECT SYSDATE
INTO :lsToday
FROM
DUAL ;

그리고 날짜의 포맷은 파워빌더에서 지원해주는 것으로 사용했죠.

2) 날짜 포맷 요소

포 맷

설 명

범 위

포 맷

설 명

범 위

SS

0 ~ 59

MON

월 (약자)

JAN ~ DEC

SSSSS

자정 이후의 초

0 ~ 86399

MONTH

월 (영문)

JANUARY ~
DECEMBER

MI

0 ~ 59

YY

연도 끝 자리
두자

예) 98

HH

0 ~ 12

YYYY

연도 (네자리)

예) 1998

HH24

0 ~ 24

YEAR

철자화된 연도

DD

월간 일자

1 ~ 31
(28 , 30)

CC

세기

예) 19

DAY

요일

SUNDAY ~
SATURDAY

Q

분기

1 ~ 4

D

요일

1 ~ 7

J

율리우스력 일자

예) 2448000

DDD

년간 일자

1 ~ 366
(365)

W

월간 주

1 ~ 5

MM

1 ~ 12

WW

연간 주

1 ~ 52

3) 날짜를 문자열로 변환하기

  • 형식 : TO_CHAR( date_column_name, format )
  • FORMAT은 단일 인용부호로 둘러쌓여야 합니다.
  • 예) SELECT ename, TO_CHAR( birthday, 'YYYY/MM/DD' )
    FROM std_db
    ORDER BY birthday ;
    --> 생년월일 순으로 Sort되며 "1971/12/01"과 같은 Format으로 Display됩니다.
  • TO_CHAR 함수를 이용하여 문자열로 변환되면, SUBSTR과 같은 다른 문자열 함수내에서 인수로 사용할 수 있습니다.
  • 예) SELECT ename, SUBSTR( TO_CHAR( birthday, 'YYYY/MM/DD' ), 1, 4 )
    FROM std_db
    ORDER BY birthday ;
    --> 생년월일에서 연도만 Return합니다.
  • 년월일을 한글로 나타나게 하려면 다음과 같이 표현하면 됩니다.
  • 예) SELECT ename, TO_CHAR( birthday, 'YYYY"년"MM"월"DD"일"' )
    FROM std_db
    ORDER BY birthday ;

4) 문자열을 날짜로 변환하기

  • 형식 : TO_DATE( string_column_name, format )
  • 사용법은 TO_CHAR와 비슷합니다.

5) 시분초의 표현

  • 예) SELECT TO_CHAR( birthday, 'HH:MI:SS' )
    FROM std_db ;
    --> 태어난 시간을 "09:33:21"과 같은 형태로 Display합니다.
    SELECT TO_CHAR( birthday,
    'HH24:MI' )
    FROM std_db ;
    --> 태어난 시간을 "23:21"과 같은 형태로 시와 분을 Display합니다.
  • 시간을 24시간 형태로 표현하지 않고 AM, PM형태로 표현하려면
    예) SELECT TO_CHAR( birthday, 'HH:MI:SS
    PM' )
    FROM std_db ;
    --> 현재 시간이 오전인지 오후인지에 상관없이 PM을 Format에 추가하면 됩니다.

6) 날짜의 더하기와 빼기

ORACLE에서는 기존의 한 날짜로부터 다른 날짜를 계산하기 위해 더하기나 빼기를 할 수 있어요~! 오늘 딸기아빠가 된 우성이가 딸기의 백일을 알고 싶으면 다음과 같이 조회하면 되죠~!

SELECT SYSDATE + 100 FROM DUAL ;

물론 두 날짜 사이의 더하기와 빼기도 가능하지요~!

'먹고살기 > Oracle' 카테고리의 다른 글

REDO LOG FILE에 대해서  (0) 2011.04.05
오라클 강좌  (0) 2011.04.05
Database Link사용법  (0) 2011.04.05
사용자 세션의 강제 종료  (0) 2011.04.05
oracle JOIN  (0) 2011.04.05
원격지의 패러미터파일(init.ora)에 global_names를 true로 하면 dblink의 이름과 접속하는 db의 이름이
동일하도록 요구한다.


global_names = true [ or false ]

이 설정은 다음과 같이 해서 알 수 있다.
SQL> select name, value from v$parameter where name='global_names';

NAME                 VALUE
-------------------- ------
global_names         FALSE


현재 데이터베이스의 이름은 global_names에 질의함으로써 알 수 있다.

SQL> connect kang/xxxxxx@piruks;
연결되었습니다.
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------
PIRUKS.KANG.COM



local db에 kang이라는 사용자로 접속한다.
SQL> connect kang/xxxxxx
연결되었습니다.

이제 원격지(piruks.kang.com)의 DB에 kang이라는 사용자로 연결되는 Database link를 생성한다.
여기서 piruks.kang.com은 원격지의 [Database name].[Domain name]이다.
보통 [Database name].[Domain name]는 Service Name이라 불리운다.
하지만 위와 같이 해서 제대로 않되는 경우가 있다.
이럴때는 global_name에 있는 이름을 dblink이름으로 정하면 해결된다.
piruks는 database connect string이다.

SQL> create database link piruks.kang.com
  2  connect to kang identified by xxxxxx
  3  using 'piruks';

데이타베이스 링크가 생성되었습니다.



사용법은 다음과 같다.
보통의 DML문장에 '@piruks.kang.com'을 추가한다.

SQL> select * from tab@piruks.kang.com;

TNAME                                                        TABTYPE         CLUSTERID
------------------------------------------------------------ -------------- ----------
TEST                                                         TABLE

SQL> select * from test@piruks.kang.com;

NAME                        AGE
-------------------- ----------
강명규                       27

SQL> insert into test@piruks.kang.com values('홍길동', 30);

1 개의 행이 만들어졌습니다.

SQL> update test@piruks.kang.com set age=31 where age=30;

1 행이 갱신되었습니다.

SQL> select * from test@piruks.kang.com;

NAME                        AGE
-------------------- ----------
강명규                       27
홍길동                       31

SQL> delete from test@piruks.kang.com where age=31;

1 행이 삭제되었습니다.

데이터베이스링크에서 DDL문장은 적용되지 않는다.
SQL> drop table test@piruks.kang.com;
drop table test@piruks.kang.com
                *
1행에 오류:
ORA-02021: 원격 데이터베이스에 DDL 조작들이 허용되지 않습니다


SQL> drop database link piruks.kang.com;

데이타베이스 링크가 삭제되었습니다.

SQL>


[2003-07-30 추가]
public DB링크와 동의어의 사용
이제껏 설명한 private DB링크와는 달리, public DB링크는 DB내의 모든 사용자가 사용할 수 있다.
이는 일반계정에서는 사용하지 못하므로 system사용자에서 생성해야 한다.
일반계정에서 public DB링크를 생성하려면, 다음의 권한이 필요하다.

DROP PUBLIC DATABASE LINK
CREATE PUBLIC DATABASE LINK

system계정에서 다음의 명령으로 kang계정에 이 권한을 줄 수 있다.

SQL> grant CREATE PUBLIC DATABASE LINK, DROP PUBLIC DATABASE LINK to kang;

권한이 부여되었습니다.


SQL> connect system/xxxxxx
연결되었습니다.
SQL> create public database link db.world
  2  connect to kang identified by xxxxxx
  3  using 'linuxdb';

데이타베이스 링크가 생성되었습니다.
SQL> conn scott/tiger
연결되었습니다.
SQL> select * from v_emp@db.world;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

SQL> conn kang/xxxxxx
연결되었습니다.
SQL> select * from v_emp@db.world;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

이와 같이 매번 골뱅이와 DB링크명(@db.world)를 붙이면 불편하므로, 동의어를 사용하여 투명하게 사용할 수도
있을 것이다. 모든 사용자에게 적용하려면 마찬가지로 system계정에서 public동의어를 생성하면 된다.

SQL> conn kang/xxxxxx
연결되었습니다.
SQL> create synonym v_emp for v_emp@db.world;

동의어가 생성되었습니다.

SQL> select * from v_emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
이하생략

12 개의 행이 선택되었습니다.

SQL>


[2003-07-30 추가]
하나의 SQL명령에서 사용할 수 있는 DB링크수는 초기화 패러미터 open_links에 따라 정해진다.
디폴트는 4개다.
SQL> show parameter open_links

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
open_links                           integer 4
open_links_per_instance              integer 4


[2003-07-30 추가]
본문에서 잠깐 언급했지만, DB링크가 제대로 생성되었으나 실제 질의시 실패하는 경우가 있다.
이 경우에는, 연결DB의 global_name에 지정된 문자열을 사용하면 해결된다.
원래 초기화패러미터 gloabl_names가 true일 경우에만, 이것을 강제하게 되어 있으나,
이상한 것은 false일 경우에도 발생했다. 예제를 보면 쉽게 알 수 있을 것이다.

[문제**********]
DB링크는 에러없이 생성되나, 실제 질의가 실패함.
SQL> conn kang/xxxxxx
연결되었습니다.
SQL> create database link linuxdb_link
  2  connect to kang identified by xxxxxx
  3  using 'linuxdb';

데이타베이스 링크가 생성되었습니다.

SQL> select * from tab@linuxdb_link;
select * from tab@linuxdb_link;
                  *
1행에 오류:
ORA-02085: 데이터베이스 링크 LINUXDB_LINK.WORLD가 DB.WORLD에 연결됩니다


SQL> drop database link linuxdb_link;

데이타베이스 링크가 삭제되었습니다.


[해결책********]
원격DB서버의 global_name값을 확인
SQL> connect system/xxxxxx@linuxdb
SQL> show parameter global_names

NAME                                 TYPE    VALUE
------------------------------------ ------- ------------------------------
global_names                         boolean FALSE
연결되었습니다.
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
DB.WORLD

다시 돌아와, DB링크생성시 이름을 위에서 확인한 global_names로 한다.
SQL> conn kang/xxxxxx
연결되었습니다.
SQL> create database link db.world
  2  connect to kang identified by xxxxxx
  3  using 'linuxdb';

데이타베이스 링크가 생성되었습니다.

SQL> select * from tab@db.world;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
A                              TABLE
AA                             TABLE
BONUS                          TABLE
CUSTOMER                       TABLE
DEPT                           TABLE
EMP                            TABLE
FAMILY                         TABLE
HITEL                          TABLE
ILSAN014                       TABLE
INTERIOR                       TABLE
MEMBER                         TABLE
MEMBER_DETAIL                  TABLE
PLAN_TABLE                     TABLE
SALGRADE                       TABLE
SAMWOO                         TABLE
SERVER                         TABLE
TEST                           TABLE
TM_YH                          TABLE
V_EMP                          VIEW

19 개의 행이 선택되었습니다.

'먹고살기 > Oracle' 카테고리의 다른 글

오라클 강좌  (0) 2011.04.05
ORACLE DATE (날짜 다루기)  (0) 2011.04.05
사용자 세션의 강제 종료  (0) 2011.04.05
oracle JOIN  (0) 2011.04.05
oracle exp/imp  (0) 2011.04.05
 ⊙ 사용자가 데이터베이스에 접속해 있을 때 사용자의 세션을 강제 종료실킬 필요가 있다면
ALTER SYSTEM문을 KILL SESSION 연산자와 함께 사용하면 됩니다.

⊙ 사용자의 SESSION KILL은 ALTER SYSTEM 권한이 있어야 합니다.


⊙ ALTER SYSTEM KILL SESSION 명령어가 수행하는 작업

- 사용자의 현재 트랜잭션을 롤백 합니다.
- 현재 사용중인 모든 테이블 또는 행의 LOCK을 풀어 줍니다.
- 사용자에 의해 예약 되었던 시스템 자원을 풀어 줍니다.







세션ID와 시리얼번호를 확인하기 위해서는 V$SESSION 뷰를 조회 해야 합니다.

SQLPLUS system/manager


SQL> SELECT sid, serial#, username
FROM V$SESSION;

SID SERIAL# USERNAME
------- ---------- ------------
8 8589 HBC
17 7243 CMS
18 25707 CMS
...

세션 정보가 화면에 출력 됩니다.



HBC유저의 세션을 KILL하기 위해서는

SQL>ALTER SYSTEM KILL SESSION ’8,8589’;

위의 명령어 수행으로 HBC사용자를 강제 종료 시킵니다.

'먹고살기 > Oracle' 카테고리의 다른 글

ORACLE DATE (날짜 다루기)  (0) 2011.04.05
Database Link사용법  (0) 2011.04.05
oracle JOIN  (0) 2011.04.05
oracle exp/imp  (0) 2011.04.05
Tablespace  (0) 2011.03.30
oracle JOIN 먹고살기/Oracle 2011. 4. 5. 08:44

 JOIN

JOIN 이란?

하나 이상의 테이블로부터 Data를 질의하기 위해서 사용됩니다.
Join조건은 WHERE절에서 기술합니다

사용 형식 :

SQL> SELECT table1.column, table2.column ….
2>
FROM table1, table2,….
3>
WHERE join조건문;

종류

Equijoin Join하고자 하는 두개의 테이블에 같은 컬럼이 있을 때 사용 P.K.와 F.K.와의 관계에서 얻어짐
Non-Equijoin Join하고자 하는 테이블이 직접적 관계가 없는 경우 WHERE절에서 ‘=’가 아닌 다른 연산자를 통해서 얻어짐
Outer join 관계가 있는 테이블을 질의할 경우 결과에 나타나지 않는 행들까지 얻고자 할 때
Self join 테이블 자체내에서 조인할 경우

  • Equijoin

보통 P.K.와 F.K. 관계가 있는 테이블에서 ‘=’ 연산자를 통해서 서로 다른 두개의 테이블을 조인합니다.
SQL> SELECT table1.column, table2.column ….
2> FROM table1, table2,….
3> WHERE table1.column= table2.column ;


SQL> select dept.deptno, emp.empno
2> from dept, emp
3> where dept.deptno=emp.deptno
4> order by 1;

    • Column과 Table에서의 Alias

SQL> select d.deptno, e.empno
2> from dept d, emp e
3> where d.deptno=e.deptno;

    • WHERE절에서의 추가조건

WHERE절에서의 조건문은 하나 이상 기술할 수 있습니다.

SQL> SELECT table1.column, table2.column , tacle3.column….
2> FROM table1, table2, table3….
3> WHERE table1.column= table2.column
4> AND table2.column=table3.column
5> OR …………………………………..;

  • Non-Equijoin

조인하고자 하는 테이블에 직접적인 관계가 없는 상황일 때 WHERE절에서 ‘=’가 아닌 다른 연산자를 통해서 검색을 하는 경우.

SQL> SELECT e.empno, e.ename, e.sal, g.grade
2> FROM emp e, salgrade g
3> WHERE e.sal BETWEEN g.losal AND g.hisal;

  • Outer Join

Equijoin과 비슷하나 결과는 만족하는 행뿐만 아니라 만족하지 않은 행까지도 보기 위해서 사용하는

조인방법을 말합니다.



SQL> select e.deptno, e.ename, d.dname
2> from emp e, dept d
3> where e.deptno(+)=d.deptno;

  • Self Join

Equijoin과 비슷하나 F.K.가 참조하는 P.K.가 같은 테이블에 있을 때 사용하는 방법입니다


SQL> select DISTINCT m.mgr, e.ename
2> fro emp e, emp m
3> where e.empno=m.mgr;


[출처] oracle JOIN|작성자 빠드루가

'먹고살기 > Oracle' 카테고리의 다른 글

Database Link사용법  (0) 2011.04.05
사용자 세션의 강제 종료  (0) 2011.04.05
oracle exp/imp  (0) 2011.04.05
Tablespace  (0) 2011.03.30
OCP  (0) 2011.03.18