레이블이 rownum이란인 게시물을 표시합니다. 모든 게시물 표시
레이블이 rownum이란인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 23일 수요일

[ORACLE 외부파일 BFILE 강좌]BFILE을 이용하여 이미지를 DB에 저장/저장된 BFILE을 이용하여 새로운 이미지 생성

 [ORACLE 외부파일 BFILE 강좌]BFILE을 이용하여 이미지를 DB에 저장/저장된 BFILE을 이용하여 새로운 이미지 생성



BFILE을 이용하여 이미지를 DB에 저장/저장된 BFILE을 이용하여 새로운 이미지 생성

아래의 두 PL/SQL 프로시저는 OS의 binary file을 DB의 BFILE 컬럼과 연계하여 작업을 하는 예제 입니다.

Load_BFILE_FROM_Image 프로시저

이 프로시저는 디스크 상의 이미지 파일을 BFILE 컬럼에 저장하는 역할을 합니다. 이 프로시저는 SQL문장안에서 BFILENAME 함수를 사용 하여 BFILE 컬럼을 UPDATE 합니다. 여기서 주의 할 점은 이미지가 디스크 상에 존재 할 뿐 DB에는 저장 되지 않는 다는 것을 명심해야 합니다. 즉 BFILE 컬럼은 OS상의 파일에 대한 포인터를 저장 한다고 보면 됩니다.


Write_BFILE_To_File 프로시저

이 프러시저는 그래픽 파일 등을 내용을 기 저장된 BFILE 참조를 이용하여 어떻게 다시 디스크에 쓰는지에 대해 예를 들고 있습니다. 이때 UTL_FILE.PUT_RAW 프로시저를 이용하여 BFILE 컬럼의 포인터를 읽어 하나씩 디스크에 기록 하게 됩니다.

또한 DBMS_LOB.READ 함수를 이용하여 BFILE 참조로부터 낱낱이 읽어 들여 이를PL/SQL RAW 변수에 넣습니다.

아래의 예를 참고 합니다.

1.        테스트를 위한 테이블, 디렉토리를 만듭니다.

SQL> CREATE TABLE test_bfile (
  2        id          NUMBER(15)
  3      , file_name    VARCHAR2(1000)
  4      , image        BFILE
  5      , timestamp    DATE
  6  )
  7  /

테이블이 생성되었습니다.

SQL> CREATE OR REPLACE DIRECTORY
  2      EXAMPLE_LOB_DIR
  3      AS
  4  'd:\LOBs'
  5  /

디렉토리가 생성되었습니다.


2.        Load_BFILE_From_Image 프러시저를 만듭니다.
(d:\LOBs 폴더에 oraclejava_logo.gif 파일을 복사해 둡니다. 파일 이름은 적절히 수정 하시면 됩니다)

CREATE OR REPLACE PROCEDURE Load_BFILE_From_Image
IS
BEGIN
    DBMS_OUTPUT.ENABLE(100000);
    INSERT INTO test_bfile (id, file_name, image, timestamp)
        VALUES (1001, 'oracle9i_logo.gif', null, sysdate);
    UPDATE test_bfile
        SET image = BFILENAME('EXAMPLE_LOB_DIR', 'oraclejava_logo.gif')
        WHERE id = 1001;
END;


3.        Write_BFILE_To_File 프러시저를 만듭니다.


  CREATE OR REPLACE PROCEDURE Write_BFILE_To_File
  IS
    source_pic      BFILE;
    buffer          RAW(32767);
    buffer_size    CONSTANT BINARY_INTEGER := 32767;
    amount          BINARY_INTEGER;
    offset          NUMBER(38);
    file_handle    UTL_FILE.FILE_TYPE;
    directory_name  CONSTANT VARCHAR2(80) := 'EXAMPLE_LOB_DIR';
    image_filename  CONSTANT VARCHAR2(80) := 'oraclejava_logo2.gif';
    dest_pic        BFILE;
  BEGIN
      DBMS_OUTPUT.ENABLE(100000);
      -- -----------------
      -- GET BFILE LOCATOR
      -- -----------------
      SELECT image INTO source_pic
          FROM test_bfile
          WHERE id = 1001;
      -- ---------------------------------------
      -- OPEN ORIGINAL BFILE IMAGE USING LOCATOR
      -- ---------------------------------------
      DBMS_LOB.FILEOPEN(
          file_loc  => source_pic,
          open_mode  => DBMS_LOB.FILE_READONLY);
      -- ---------------------------------
      -- OPEN NEW IMAGE FILE IN WRITE MODE
      -- ---------------------------------
      file_handle := UTL_FILE.FOPEN(
          location    => directory_name,
          filename    => image_filename,
          open_mode    => 'w',
          max_linesize => buffer_size);
      amount := buffer_size;
      offset := 1;
      -- ---------------------------------------------------
      -- READ FROM BFILE IMAGE / WRITE OUT NEW IMAGE TO DISK
      -- ---------------------------------------------------
      WHILE amount >= buffer_size
      LOOP
          DBMS_LOB.READ(
              file_loc  => source_pic,
              amount    => amount,
              offset    => offset,
              buffer    => buffer);
          offset := offset + amount;
          UTL_FILE.PUT_RAW(
              file      => file_handle,
              buffer    => buffer,
              autoflush => false);
      END LOOP;
      UTL_FILE.FCLOSE(file => file_handle);
      DBMS_LOB.FILEOPEN(file_loc => source_pic);
      -- --------------------------------------------
      -- INSERT THE NEW IMAGE FILE AS A SECOND RECORD
      -- --------------------------------------------
      INSERT INTO test_bfile (id, file_name, image, timestamp)
          VALUES (1002, 'oraclejava_logo2.gif', null, sysdate);
      UPDATE test_bfile
          SET image = BFILENAME('EXAMPLE_LOB_DIR', 'oraclejava_logo2.gif' )
          WHERE id = 1002;
      COMMIT;
* END;
  /

프로시저가 생성되었습니다.

4.        SQL*Plus 에서 테스트 합니다.

SQL> set serveroutput on
SQL> exec Load_BFILE_From_Image

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> exec Write_BFILE_To_File

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL>
SQL>
SQL> SELECT id, DBMS_LOB.GETLENGTH(image) Length FROM test_bfile;

        ID    LENGTH
---------- ----------
      1001        910
      1002        916

참고) 이제 탐색기에서 보면 oraclejava_logo2.gif가 생겨 났음을 확인 할 수 있습니다. 그런데 이 파일은 원래의 oraclejava_logo.gif 보다 사이즈가 조금 큰데 그 이유는 UTL_FILE.PUT_RAW 프러시저에서 CR/LF가 추가 되어서 그러합니다.

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  


[기타 다른 강좌는 아래 해당 카테고리를 클릭해주세요]

2013년 8월 10일 토요일

[오라클자바,오라클자바커뮤니티]Oracle Types of Data Integrity

Oracle Types of Data Integrity

A. Nulls
- 기본적으로 Column은 Null을 허용한다. 
Column에 대해서 null을 포함하는 row들의 insert나 또는 update를 허용하는 또는 허용하지 않는  하나의 column에 대해서 정 의되는 규칙.

B. Unique Column Values
-Column(또는 column들의 집합)에 대해서 unique value를 포함하는 row들의 insert나 또는  update만을 허용하는 column들(또는 column들의 집합)에 대해서 정
의되는 규칙, 즉 지정된 열또는 열들에서중복된 값을 허용안함

- Unique 제약조건을 구성하는 열중 일부분이 Null을 허용한다면 Null을 허용하지 않는 열은  동일한 값을 가질수 없다.

C. Primary Key Values
-Table에 있는 각 row는 column(또는 column들의 집합)에 있는 value들에 의해서 유일하게 식별될 수 있도록 하는 하나의 column(또는 column들의 집합)에 정의된
규칙.

- Primary Key Column은 Null을 허용하지 않는다.

- 만약 dept Table의 dept_no Column이 Primary Key라면 해당열에 대한 고유 인덱스를 암시적으로  생성하며 해당열에대해 not null제약조건을 암시적으로 생성한다.

- Primary Key Column은 16개 까지로 제한됨

D. Referential Integrity(참조 무결성)과 Foreign Key 무결성 제약조건
- 만약 Column 또는 column들의 집합에 대한 값(the dependent value)이 관련된 table의 column에 있는 값(the referenced value)과 match 된다면 하나의 row에
대한 insert 또는 update만을 허용하는 하나의 table에 존재하는 column(또는 column들의 집합)에 대해서 정의된 규칙.

-Referential integrity는 또한 어떤 data 조작의 유형이 참조되는 값들에 허용되는 지와 이러한 action들이 종속된 값들에 어떠한 영향을 주는 지를 지시하는 규칙들을 포함한다. 

Restrict
 참조되는 data의 update 또는 deletion을 허용하지 않는 referential
integrity.

Set to Null
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 NUll이 설정된다.

Set to Default
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 default value가 설정된다.

Cascade
 참조되는 data가 update될 때, 관련되는 모든 종속된 data도 update된다; 참조되는 row가 delete될 때, 관련되는 모든 종속된 row들도 delete된다.

F. Check Constrints
- 각 열또는 열집합에 대한 Check Constraints는 지정된 조건이 참인지 거짓인지 알수있게 한다.

- 사용자가 확인 조건을 지정함으로서 특수하거나 복잡한 무결성 조건을 시행한다.

- 문자열 리터럴이나 인수(투캐랙터, 투넘버, 투데이트)로 NLS 매개변수를 가지는 SQL을 포함한는  제약조건을 평가하기 위해 Oracle은 기본적으로 DataBase의 NLS설정값을 사용한다.

2013년 8월 4일 일요일

ORACLE ROWNUM

SELECT절에 의해 추출된 데이터(ROW)에 붙는 순번이다. 다시 말해 WHERE절까지 만족 시킨 자료에 붙은 순번이라고 이해를 하길 바란다. WHERE절에 ROWNUM을 이용하여 조건을 주면 다른 조건을 만족시킨 결과에 대해 조건이 반영된다. SELECT 리스트에 ROWNUM을 이용하는 것도 물론 가능하다. 이때 ORDER BY를 사용한다면 WHERE절까지 만족 시킨 결과에 ROWNUM이 붙은 상태로 ORDER BY가 반영된다. 아래의 예문을 이해하자. 




SQL> select rownum, ename, sal from emp
  2  where sal >= 2900;
    ROWNUM ENAME            SAL
---------- ---------- ----------
        1 JONES            2975
        2 SCOTT          3000
        3 KING            5000
        4 FORD            3000
SQL> select rownum, ename, sal from emp
  2  where sal > 2900
  3  order by ename;
    ROWNUM ENAME            SAL
---------- ---------- ----------
        4 FORD            3000
        1 JONES            2975
        3 KING            5000
        2 SCOTT            3000
SQL> select rownum, ename, sal from emp
  2  where sal >= 2900
  3  and rownum < 3;
    ROWNUM ENAME            SAL
---------- ---------- ----------
        1 JONES            2975
        2 SCOTT            3000 


아래 예문도 이해 하세요~


rownum1로 시작해야 작동하는 제한사항이 있으며, 1로 시작하지 않으면 원하는 결과를 뽑지 못한다.

SELECT ROWNUM,ename from emp WHERE ROWNUM BETWEEN 1 and 3;
ROWNUM      ENAME    
----------- ----------
          1 SMITH    
          2 ALLEN    
          3 WARD     
3 rows selected.

SELECT ROWNUM,ename from emp WHERE ROWNUM BETWEEN 2 and 3;
ROWNUM      ENAME    
----------- ----------
0 rows selected.
SQL> SELECT t1.rn,
                   t1.ename
            FROM   (SELECT ROWNUM rn,
                           ename
                    FROM   emp) t1
            WHERE  t1.rn BETWEEN 2 and 3;
RN          ENAME    
----------- ----------
          2 ALLEN    
          3 WARD



[출처] 오라클자바커뮤니티, 오엔제이프로그래밍