'Database/Oracle'에 해당되는 글 64건

  1. 2011.06.22 아카이빙(archiving)이란?
  2. 2011.06.14 Oracle에서 데이터 문자열을 구분자로 나누기
  3. 2011.05.26 Oracle Cursor2
  4. 2011.05.26 Oracle Cursor
Database/Oracle2011. 6. 22. 09:37

최근 들어 아카이빙이라는 용어가 매우 빈번하게 사용되고 있으나 아카이빙이 갖는 용어는 상황에 따라 매우 큰 차이를 두고 다르게 사용되고 있기 때문에 간단하게 정리해 봅니다.

아카이빙이란 주로 데이터를 원래 있던 위치에서 다른 곳으로 이동하여 보관하는 의미로 백업과 함께 데이터 보전을 위한 하나의 방법으로 사용되기도 하나 백업이 제공하는 것 이상의 의미를 갖고 있습니다. 현재, IT 업계에서는 다양한 기술의 아카이빙 기술을 제공하는데 이는 크게 세가지로 도식화해서 정리해 볼 수 있습니다.

1. 백업후 삭제 - 이 것은 가장 원시적인 방법으로 백업 소프트웨어를 이용해서 테이프나 이차 스토리지로 백업을 한 후 즉시 또는 일정 기간이 지나 일차 스토리지에서 원래의 데이터를 삭제하는 방법입니다. 대부분은 수작업이나 스크립트를 이용해서 이루어지며 데이터를 다시 찾고자 할 경우 백업 소프트웨어로 부터 정보를 찾아 일차스토리지로 다시 리스토어과정을 거쳐야 합니다. 대신에 새로운 소프트웨어를 구매해야 하는 비용은 필요 없는 것이 이점이라면 이점입니다.

2. HSM(Heirachycal Storage Manager) - HSM은 이미 메인프레임 환경에서 오래 전부터 개발되어 사용해온 기술로 오픈시스템 환경에 적용하기 시작한 것은 10년 전 정도로 추산됩니다. HSM은 이전하고자 하는 데이터의 포인터 부분(유닉스 시스템에서는 "inode"에 해당되며, "Stub" 이라고도 합니다.)은 원래의 위치에 두고 그 이하부분(데이터 영역)은 이차스토리지나 테이프로 이전하는 방법을 제공하는 기술입니다. HSM은 일반적으로 애플리케이션 영역보다는 파일시스템 영역에서 동작하며 입출력을 중간에서 가로채어 이 기능을 수행하게 됩니다. 따라서, 일부 시스템에는 HSM을 위한 별도의 파일시스템으로 전환하는 방법을 사용하며 HSM 지원을 위한 표준인 DMAPI(Data Management API)를 지원하는 시스템에서는 파일시스템 전화없이 적용하기도 합니다. 이런 특성으로 HSM은 지원가능한 시스템이 매우 제한되어 있습니다. HSM은 현재 특화된 시장을 중심으로 매우 활발한 움직임을 보이고 있는데, 대표적인 경우가 Email Archiving 이고, 이외에도 Healthcare(병원의 PACS), Security Surveillance(디지탈 비디오 보안시스템), Documents(문서관리 시스템) 등이 있습니다.

3. 아카이빙 툴 - 이 것은 좁은 의미의 아카이빙을 의미하는 것으로 넓은 의미의 아카이빙과 많이 혼동되어 사용되기도 합니다. 아카이빙 툴은 애플리케이션 서버와 데이터 시스템 사이에 별도의 아카이빙 툴을 두고 이 툴을 이용해서 데이터를 이전하고 관리하는 방법입니다. 따라서 애프리케이션은 아카이빙 툴에 데이터를 요청하고 아카이빙 툴은 데이터의 위치 정보를 갖고 해당 데이터를 읽어 들여 애플리케이션에 제공하는 원리입니다. 이 아카이빙 툴은 주로 방송시스템의 대용량 영상데이터를 관리하는 시스템으로 사용되고 있습니다.

대략적으로 아카이빙의 개념을 정리해 보았는데, 특히 HSM은 최근에 ILM(Information Lifecycle Management)의 활성화와 함께 급부상하고 있는 IT 기술 중의 하나이기도 합니다.

- 출처 ; http://www.mini7.co.kr/board/view.php?id=study&page=1&sn1=on&divpage=1&sn=on&ss=off&sc=off&keyword=cho78&select_arrange=headnum&desc=asc&no=50&PHPSESSID=cba6d75b664bfe2dd51db84af8dd703d -

'Database > Oracle' 카테고리의 다른 글

롤백 세그먼트(rollback segment)란 ?  (0) 2011.06.25
Oracle Lock  (0) 2011.06.22
Oracle에서 데이터 문자열을 구분자로 나누기  (0) 2011.06.14
Oracle Cursor2  (0) 2011.05.26
Oracle Cursor  (0) 2011.05.26
Posted by 아로나
Database/Oracle2011. 6. 14. 00:12

ex)
SELECT SUBSTR(TEST,1,INSTR(TEST,'.',1,1)-1) AS FIRST,
SUBSTR(TEST,INSTR(TEST,'.',1,1)+1,INSTR(TEST,'.',1,2)-INSTR(TEST,'.',1,1)-1) AS SECOND,
SUBSTR(TEST,INSTR(TEST,'.',1,2)+1) AS THIRD
FROM (SELECT '1.22.333' TEST
FROM DUAL);


설명)
SUBSTR('Hello',1,5) => 'Hello'
SUBSTR('Hello',2,4) => 'ell'
SUBSTR('Hello',3) => 'llo' (3번째 문자열부터 끝까지 출력)

INSTR('HelloWorld','W') => 6 ('HelloWorld'에서 'W'의 위치를 숫자로 리턴)

INSTR('HelloWorld','l'1,1) => 3 (첫번째 위치에서 문자 'l'을 첫번째로 만나는 위치을 숫자로 리턴)
INSTR('HelloWorld','l'1,3) => 9 (첫번째 위치에서 문자 'l'을 세번째로 만나는 위치을 숫자로 리턴)
INSTR('HelloWorld','l'5,1) => 9 (다섯번째 위치에서 문자 'l'을 첫번째로 만나는 위치을 숫자로 리턴)

그러므로 위의 예제에서
INSTR('1.22.333','.',1,1) => 2
INSTR('1.22.333','.',1,2) => 5
가 된다.

이를 참고하여 이해하기 바란다.

간단한 위의 예제 쿼리의 결과는
아래와 같다.

 FIRST   SECOND    THIRD
    1           22            333



'Database > Oracle' 카테고리의 다른 글

롤백 세그먼트(rollback segment)란 ?  (0) 2011.06.25
Oracle Lock  (0) 2011.06.22
아카이빙(archiving)이란?  (0) 2011.06.22
Oracle Cursor2  (0) 2011.05.26
Oracle Cursor  (0) 2011.05.26
Posted by 아로나
Database/Oracle2011. 5. 26. 14:15

 커서란 SQL*Plus에서 사용자가 실행한 SQL문의 단위를 의미합니다. 오라클에서 수행한 모든 쿼리문은 커서 단위로 처리합니다. 커서는 암시적 커서와 명시적 커서로 나뉩니다. PL/SQL의 SQL문처럼 하나의 결과를 리턴하는 경우 커서 없이도 SQL문의 실행된 결과가 암시적으로 커서에 저장되므로 이를 암시적 커서라고 합니다.

- SQL문을 수행한 후에 결과로 얻어지는 행이 여러 개일 경우에는 암시적인 커서에 정보를 저장할 수 없기에 에러가 발생합니다. 이런 경우에 반드시 명시적인 커서를 사용해야 합니다.

# 커서의 상태
사용자 삽입 이미지







- 명시적인 커서는 PL/SQL의 레코드(RECORD)와 PL/SQL 의 테이블(TABLE)을 결합한 것으로서 프로그램 언어의 구조체 배열과 유사합니다. 커서를 사용하기 위해서는 다음과 같은 4가지 단계를 거쳐야 합니다.
1. 커서를 선언한다. (CURSOR cur_name)
2. 커서를 오픈한다. (OPEN cur_name)
3. 커서의 조회한 결과를 인출해 저장한다. (FETCH cur_name)
4. 커서를 닫는다. (CLOSE cur_name)

1. 커서를 선언한다.
CURSOR cursor_name
IS statement;

- 커서를 선언할 때에는 실행할 SELECT 문을 IS 다음에 서브쿼리 형태로 기술합니다.
CURSOR C1 IS
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE DEPTNO = 20;
- C1은 커서의 이름이고 이 커서는 사원 테이블에서 부서번호가 20인 행을 조회합니다.

2. 커서를 오픈한다.
- 커서를 오픈 하게 되면 커서를 선언할 때 작성한 SELECT 문을 실행하게 됩니다.
OPEN C1;

3. 커서에 조회한 결과를 인출해 저장한다.
- FETCH 명령어를 수행하면 오픈한 SELECT문에 의해 검색된 한 개의 정보를 읽어오게 됩니다.
읽어온 정보는 변수에 저장합니다.
FETCH C1 INTO VEMPNO, VENAME, VSAL;

- SELECT 문의 결과로 얻어지는 행이 여러개일 경우에는  LOOP-END LOOP와 같은 반복문을 이용해서 마지막 행을 읽을 때가지 반복해서 수행해야 합니다.
LOOP
    FETCH C1 INTO VEMPNO, VENAME, VSAL;
    EXIT WHEN C1%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(VEMPNO) || VNAME || TO_CHAR(VSAL));
END LOOP;

- 만족하는 행을 발견하지 못할 때 즉, 마지막 행을 읽었을 때 반복문을 벗어나도록 하기 위해서는 'EXIT WHEN C1%NOTFOUND'와 같이 기술 합니다.

4. 커서를 닫는다.
- CLOSE 명령문으로 더 이상 사용되지 않을 커서를 닫습니다.
CLOSE C1;
- 커서를 닫으면 (CLOSE) 커서에 선언되 SELECT문의 선언이 해제됩니다.

- 20번 부서에 근무하는 사원의 정보를 출력해 봅니다.
SQL> SET SERVEROUTPUT ON -- DBMS_OUTPUT 출력 가능하도록 설정.
SQL> DECLARE
-- 커서를 실행한 결과를 저장할 지역 변수 선언
  2     vempno   NUMBER(4);
  3     vename   VARCHAR2(20);
  4     vsal    NUMBER(7, 2);
  5 
-- 번호가 20인 사원의 정보를 조회하는 SELECT문을 커서로 선언.
  6     CURSOR C1
  7     IS
  8     SELECT EMPNO, ENAME, SAL
  9     FROM EM01
 10     WHERE DEPTNO = 20;
 11 
 12  BEGIN
 13     OPEN C1; -- 커서를 오픈하면 커서를 선언할 때 작성한 SELECT 문이 실행됩.
 14     dbms_output.put_line('번호   이름   급여');
 15 
 16     LOOP
 17             FETCH C1 INTO VEMPNO, VENAME, VSAL; -- SELECT 문을 실행한 결과를 한행씩 가져와서 변수에 저장
 18             EXIT WHEN C1%NOTFOUND; -- 마지막 행까지 읽어서 행이 발견되지 않으면 반복문을 벗어남.
 19             DBMS_OUTPUT.PUT_LINE(TO_CHAR(VEMPNO) || '       ' || VENAME || '         ' || TO_CHAR(VSAL)); -- 검색된 결과를 사용자 화면에 출력.
        END LOOP ;
-- LOOP 구문 : 커서 실행 결과 구해진 행이 여러 개이면 반복문을 사용하여 처리.
 20   21        CLOSE C1;
 22  END ;
 23  /
번호   이름   급여
7566    JONES    2975
7902    FORD     3000
7368    SMITH    800
7788    SCOTT    3000
7876    TEST3    1100

PL/SQL procedure successfully completed.

SQL>

# OPEN-FETCH-CLOSE가 없이 커서 처리
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2  -- 커서를 수행한 결과 값을 저장할 레코드 형태의 변수.
  3     vemp     emp%ROWTYPE;
  4 
  5  -- 커서 선언
  6     CURSOR C1
  7     IS
  8     SELECT EMPNO, ENAME, SAL
  9     FROM EM01
 10     WHERE DEPTNO = 20;
 11 
 12  BEGIN
 13     dbms_output.put_line('번호   이름   급여');
 14 
 15  /* FOR 레코드명 IN 커서명 LOOP */
 16  -- OPEN-FETCH-CLOSE문을 하나의 FOR문으로 대체할 수 있음.
 17 
 18     FOR vemp IN C1 LOOP
 19             EXIT WHEN C1%NOTFOUND;
 20             DBMS_OUTPUT.PUT_LINE(TO_CHAR(vemp.empno) || '   ' || vemp.ename || '    ' || TO_CHAR(vemp.sal) || '------------->'||C1%ROWCOUNT);
 21     END LOOP;
 22  END ;
 23  /
번호   이름   급여
7566    JONES   2975------------->1
7902    FORD    3000------------->2
7368    SMITH   800------------->3
7788    SCOTT   3000------------->4
7876    TEST3   1100------------->5

PL/SQL procedure successfully completed.

# 커서를 활용한 실용 예제
SQL> DECLARE
  2     tot      NUMBER := 0;
  3     CURSOR emp_cursor
  4     IS
  5     SELECT ENAME, SAL
  6     FROM EM01;
  7  BEGIN
  8     dbms_output.put_line('이름                          급여');
  9     dbms_output.put_line('-------------------------');
 10 
 11     FOR cur_var IN emp_cursor LOOP
 12             tot := tot + cur_var.sal;
 13             dbms_output.put_line(cur_var.ename);
 14             dbms_output.put_line('_                ' || cur_var.sal);
 15     END LOOP;
 16     dbms_output.put_line('-------------------------');
 17     dbms_output.put_line('_                            ' || tot);
 18  END;
 19  /
이름                          급여
-------------------------
MARTIN
_                1250
JONES
_                2975
TURNER
_                1500
FORD
_                3000
SMITH
_                800
KING
_                5000
WARD
_                1250
BLAKE
_                2850
CLARK
_                2450
MILLER
_                1300
ALLEN
_                1600
SCOTT
_                3000
JAMES
_                1957
TEST
_                800
TEST3
_                1100
-------------------------
_                            30832

PL/SQL procedure successfully completed.

- 사원별 급여 현황을 그래프로 표현
SQL> DECLARE
  2     CURSOR emp_cursor
  3     IS
  4     SELECT ENAME, SAL
  5     FROM EMP
  6     ORDER BY SAL DESC;
  7 
  8     star    VARCHAR2(100);
  9     cnt     NUMBER := 0;
 10  BEGIN
 11     dbms_output.put_line('                       사원별 급여 현황');
 12     dbms_output.put_line('----------------------------------------');
 13 
 14     FOR cur_var IN emp_cursor LOOP
 15             star := NULL;
 16             cnt := round(cur_var.sal/100, 0);
 17 
 18             FOR i IN 1.. cnt LOOP
 19                     star := star || '*';
 20             END LOOP;
 21 
 22     dbms_output.put_line(cur_var.ename);
 23     dbms_output.put_line('_               ' || star || '    ' || ' (' || cur_var.sal || ')');
 24     END LOOP;
 25  END;
 26  /
사원별 급여 현황
----------------------------------------
KING
_               **************************************************       (5000)
FORD
_               ******************************   (3000)
SCOTT
_               ******************************   (3000)
JONES
_               ******************************   (2975)
BLAKE
_               *****************************    (2850)
CLARK
_               *************************        (2450)
JAMES
_               ********************     (1957)
ALLEN
_               ****************         (1600)
TURNER
_               ***************  (1500)
MILLER
_               *************    (1300)
MARTIN
_               *************    (1250)
WARD
_               *************    (1250)
ADAMS
_               ***********      (1100)
SMITH
_               ********         (800)
SMITH
_               ********         (800)

PL/SQL procedure successfully completed.

'Database > Oracle' 카테고리의 다른 글

롤백 세그먼트(rollback segment)란 ?  (0) 2011.06.25
Oracle Lock  (0) 2011.06.22
아카이빙(archiving)이란?  (0) 2011.06.22
Oracle에서 데이터 문자열을 구분자로 나누기  (0) 2011.06.14
Oracle Cursor  (0) 2011.05.26
Posted by 아로나
Database/Oracle2011. 5. 26. 14:13
1.  커서의  정의

커서란  SQL  Plus에서  사용자가  실행한  SQL문의  단위를  의미합니다.
오라클렝서  수행한  모든  쿼리문은  커서  단위로  처리합니다.

PL/SQL의  SQL문처럼  하나의  결과를  리턴하는  경우  커서  없이도  SQL문의  실행결과가 
암시적으로  커서에  저장되므로  이를  암시적  커서라고  합니다.

SQL문을  수행한  후에  결과로  얻어지는  행이  여러  개일  경우에는  암시적인  커서에  정보를 
저장할  수  없기에  에러가  발생합니다.  이럴  경우에는  반드시  명시적인  커서를  사용해야  합니다.

명시적인  커서는  PL/SQL의  레코드(RECORD)와  PL/SQL의  테이블(TABLE)을  결합한  것으로서
프로그램  언어의  구조체  배열과  유사합니다.



[커서의  사용]

1)  커서를  선언한다.
CURSOR  cur_name

2)  커서를  오픈한다.
OPEN  cur_name

3)  커서에  조회한  결과를  인출해  지정한다.
FECTCH  cur_name  ...

4)  커서를  닫는다
CLOSE  cur_name






2.  20번  부서에  근무하는  사원의  정보를  출력하는  예제


ed  cur01


SET  SERVEROUTPUT  ON
declare
   vempno   NUMBER(4);
   vename   VARCHAR2(20);
   vsal   NUMBER(7,  2);

   CURSOR   C1
   IS
   select  empno,  ename,  sal
   from  emp
   where  deptno=20;

begin
   OPEN  C1;

   dbms_output.put_line('empno   ename   sal');

   LOOP
      FETCH  C1  INTO  vempno,  vename,  vsal;
      EXIT  WHEN  C1%NOTFOUND;

      dbms_output.put_line(to_char(vempno)||'   '||vename||'   '||to_char(vsal));
   END  LOOP;


end;
/



저장하고  실행합니다.

@cur01
empno   ename   sal
7369   SMITH   800
...
...
...
...
...

PL/SQL  procedure  successfully  completed.





3.  OPEN-FETCH-CLOSE가  없이  커서  처리

ed  cur02


SET  SERVEROUTPUT  ON
declare
   vemp   emp%ROWTYPE;

   CURSOR   C1
   IS
   select  empno,  ename,  sal
   from  emp
   where  deptno=20;

begin
   dbms_output.put_line('empno   ename   sal');

   FOR   vemp   IN   C1   LOOP
      EXIT  WHEN  C1%NOTFOUND;

      dbms_output.put_line(to_char(vemp.empno)||'   '||vemp.ename||'   '||to_char(vemp.sal));
   END  LOOP;

end;
/


정장하고  실행합니다.

@cur02
empno   ename   sal
7369   SMITH   800
...
...
...
...
...

PL/SQL  procedure  successfully  completed.



4.  커서의  상태

%NOTFOUND   커서  영역의  자료가  모두  FETCH  됬는가를  알려줌
%FOUND      커서  영역에  FETCH가  되지  않은  자료가  있는가를  알려줌
%ISOPEN      커서가  OPEN된  상태인가를  알려줌
%ROWCOUNT   FETCH된  RECORD가  몇  개  있는지  알려줌

cur02  예제를  수정합니다.

ed  cur02

SET  SERVEROUTPUT  ON
declare
   vemp   emp%ROWTYPE;

   CURSOR   C1
   IS
   select  empno,  ename,  sal
   from  emp
   where  deptno=20;

begin
   dbms_output.put_line('empno   ename   sal   record  count');

   FOR   vemp   IN   C1   LOOP
      EXIT  WHEN  C1%NOTFOUND;

      dbms_output.put_line(to_char(vemp.empno)||'   '||vemp.ename||'   '||to_char(vemp.sal)||'   '||C1%ROWCOUNT);
   END  LOOP;

end;
/


저장하고  실행합니다.

@cur02

결과는  record  count  추가되었습니다.




5.  커서를  활용한  실용  예제
1)  급여  총합을  구하는  예제
ed  cur03

SET  SERVEROUTPUT  ON
declare
   tot   NUMBER  :=  0;

   CURSOR   emp_cursor
   IS
   select  ename,  sal
   from  emp;

begin
   dbms_output.put_line('name   sal');
   dbms_output.put_line('------------------------------------------');

   FOR  cur_var  IN  emp_cursor  LOOP
      tot  :=  tot  +  cur_var.sal;
      dbms_output.put_line(cur_var.ename);
      dbms_output.put_line('-   '||cur_var.sal);
   END  LOOP;
  
   dbms_output.put_line('------------------------------------------');
   dbms_output.put_line('-   '||tot);
end;
/


저장하고  실행합니다

@cur03




2)  사원별  급여  현황을  그래포로  표현
ed  cur04

SET  SERVEROUTPUT  ON
declare
   CURSOR   emp_cursor
   IS
   select  ename,  sal
   from  emp
   order  by  sal  desc;

   star   varchar2(100);
   cnt   number  :=  0;

begin
   dbms_output.put_line('   sal  of  emp');
   dbms_output.put_line('------------------------------------------');

   FOR  cur_var  IN  emp_cursor  LOOP
      star  :=  NULL;
      cnt  :=  round(cur_var.sal/100,  0);

      for  i  in  1..  cnt  loop
         star  :=  star||'*';
      end  loop;

   dbms_output.put_line(cur_var.ename);
   dbms_output.put_line('-   '||star||'('||cur_var.sal||')');
   END  LOOP;
end;
/


저장하고  실행합니다

@cur04

'Database > Oracle' 카테고리의 다른 글

롤백 세그먼트(rollback segment)란 ?  (0) 2011.06.25
Oracle Lock  (0) 2011.06.22
아카이빙(archiving)이란?  (0) 2011.06.22
Oracle에서 데이터 문자열을 구분자로 나누기  (0) 2011.06.14
Oracle Cursor2  (0) 2011.05.26
Posted by 아로나