제11장 DBMS_LOB

내용 목차

11.1. 개요
11.2. 프러시저
11.2.1. APPEND
11.2.2. COPY
11.2.3. CONVERTTOBLOB
11.2.4. CONVERTTOCLOB
11.2.5. CREATETEMPORARY
11.2.6. ERASE
11.2.7. FREETEMPORARY
11.2.8. LOADFROMFILE
11.2.9. LOADBLOBFROMFILE
11.2.10. OPEN
11.2.11. READ
11.2.12. TRIM
11.2.13. WRITE
11.2.14. WRITEAPPEND
11.3. 함수
11.3.1. COMPARE
11.3.2. GETLENGTH
11.3.3. INSTR
11.3.4. ISTEMPORARY
11.3.5. SUBSTR

본 장에서는 DBMS_LOB 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.

11.1. 개요

DBMS_LOB은 BLOB 또는 CLOB 타입의 컬럼 데이터에 여러 가지 연산을 제공하는 패키지이다. 또한, DBMS_LOB 패키지 내의 프러시저와 함수를 이용하여 대용량 객체형(Large OBject, 이하 LOB)의 전체 또는 일부에 읽기, 쓰기 등의 작업을 수행할 수 있다.

다음은 DBMS_LOB 패키지를 사용할 때 유의해야 할 사항이다.

  • 호출자 권한

    • 이 패키지는 호출자 권한으로 실행된다. 만약 다른 프러시저나 함수에서 호출되는 경우 해당 프러시저나 함수의 실행자 권한으로 실행된다.

  • 프러시저와 함수의 파라미터의 길이(length)와 오프셋(offset) 단위

    • 대상(destination) 데이터가 BLOB 타입이면 바이트(Byte), CLOB 타입이면 문자(character) 단위이다. 함수의 반환값도 이와 같다.

  • 프러시저와 함수의 파라미터 값을 전달할 때 값의 유효 범위

    • LOB 데이터 내의 오프셋, 길이, 크기 등을 나타내는 값은 항상 1 이상이어야 하며 LOBMAXSIZE 상수의 값보다 크면 안 된다.

    • LOBMAXSIZE 상수는 18446744073709551615 (2^64 – 1)의 값을 가진다.

    • LOB 데이터 내의 오프셋, 길이, 크기 등이 1보다 작거나 LOBMAXSIZE보다 큰 값이면 INVALID_ARGVAL 예외 상황이 발생한다.

  • CLOB 타입의 컬럼 데이터

    • 이 타입은 항상 유니코드 UTF-16 문자 집합의 문자열이 저장되며, 2bytes로 하나의 문자를 나타낸다.

    • 길이 또는 크기 값은 LOBMAXSIZE 상수를 2로 나눈 값보다 작아야 한다.

    • 만약 이 값보다 크면 마찬가지로 INVALID_ARGVAL 예외 상황이 발생한다.

  • APPEND, COPY, TRIM, WRITE

    • LOB 데이터를 갱신하려는 프러시저와 함수의 파라미터로 크기와 오프셋 값의 합이 최댓값(LOBMAXSIZE 상수 값)을 초과하면 안 된다. 만약 초과하면 예외 상황이 발생한다. 그리고 LOB 데이터를 갱신하려면 먼저 그 데이터를 포함하는 로우에 잠금(LOCK)을 설정해야 한다. 왜냐하면 프러시저나 함수는 자동으로 잠금을 설정해 주지 않기 때문이다.

  • READ, COMPARE, INSTR, SUBSTR

    • 읽기 전용의 프러시저와 함수는 LOB 데이터의 마지막까지만 읽기를 수행한다.

  • COMPARE, INSTR, SUBSTR

    • 문자열 패턴의 작업을 수행하는 함수의 파라미터로 LIKE 함수에서 사용되는 퍼센트(%)와 언더바(_)와 같은 와일드 카드(wild card) 문자를 사용할 수 없다.

LOB 데이터를 수행할 때에는 먼저 대상 LOB 데이터를 OPEN 프러시저를 이용하여 열고, 작업이 끝나면 CLOSE 프러시저를 이용하여 닫는다. 이때 OPEN 프러시저로 열린 LOB 데이터를 닫으면 데이터베이스에 갱신된 내용이 반영된다.

반면에 OPEN 프러시저를 실행하여 열지 않은 LOB 데이터에 대해 갱신 연산을 수행하면 바로 데이터베이스에 반영된다. 대개의 경우 LOB 데이터를 갱신하면 많은 디스크 작업이 수반되므로, 여러 번에 걸쳐 데이터베이스에 반영하는 것보다 한번에 모든 갱신을 데이터베이스에 반영하는 것이 효율적이다.

OPEN 프러시저를 실행하여 LOB 데이터를 연 경우에는 COMMIT 문장을 실행하기 전에 반드시 CLOSE 프러시저를 실행하여 닫아야 한다. 만약 열려있는 LOB 데이터가 있는데 COMMIT을 실행하면, 에러가 발생한다. 열려 있는 LOB 데이터가 있을 때 ROLLBACK을 실행하면 모든 갱신은 취소되고 열려 있는 LOB 데이터에 대한 정보도 없어진다.

다음은 DBMS_LOB 패키지 내에 정의된 상수이다.

  • LOBMAXSIZE

    LOB 데이터의 최대 크기이다.

    LOBMAXSIZE CONSTANT BINARY_INTEGER := 18446744073709551615

    데이터 타입은 BINARY_INTEGER이고 LOB 데이터의 최대 크기는 18446744073709551615이다.

  • LOB_READONLY

    LOB 데이터에 대한 읽기 전용의 사용 여부를 설정하는 모드이다.

    LOB_READONLY CONSTANT BINARY_INTEGER := 0

    데이터 타입은 BINARY_INTEGER이고 값이 0이면 읽기 전용으로 설정된다.

  • LOB_READWRITE

    LOB 데이터의 읽기 및 쓰기를 설정하는 모드이다.

    LOB_READWRITE CONSTANT BINARY_INTEGER := 1

    데이터 타입은 BINARY_INTEGER이고 값이 1이면 읽기 및 쓰기로 설정된다.

11.2. 프러시저

본 절에서는 DBMS_LOB 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.

11.2.1. APPEND

원본 LOB 데이터의 전체를 대상 LOB 데이터의 끝에 붙여 넣는 프러시저이다.

APPEND 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.APPEND
      (
          dest_lob            IN OUT NOCOPY       BLOB, 
          src_lob             IN                  BLOB
      );
    • CLOB 타입인 경우

      DBMS_LOB.APPEND
      (
           dest_lob            IN OUT NOCOPY       CLOB, 
           src_lob             IN                  CLOB
      );

      CLOB 데이터를 전달하는 경우 dest_lob, src_lob 파라미터의 LOB 데이터의 문자 집합(character set)이 같아야 한다.

  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_lob원본 LOB locator이다.
  • 예외 상황

    예외 상황설명
    VALUE_ERROR대상 또는 원본 LOB 데이터가 NULL인 경우이다.
  • 예제

    DECLARE
        dest_lob CLOB := 'All''s fair in ';
        src_lob CLOB := 'love and war';
    BEGIN
        DBMS_LOB.APPEND(dest_lob, src_lob);
        DBMS_OUTPUT.PUT_LINE('Result = ' || dest_lob);
    END;
    /
    Result = All's fair in love and war
    
    PSM completed
    SQL> 

11.2.2. COPY

원본 LOB 데이터의 전체 또는 일부를 대상 LOB 데이터에 복사하는 프러시저이다. 이때 복사할 원본 LOB 데이터의 오프셋과 대상 LOB 데이터의 오프셋을 지정할 수 있다. 만약 대상 LOB 데이터의 오프셋이 대상 LOB 데이터의 길이보다 짧으면 오프셋 위치에 존재하는 이전 데이터는 갱신된다.

이와는 반대로 대상 LOB 데이터 오프셋이 대상 LOB 데이터의 길이보다 길면 중간에 0(BLOB 데이터) 또는 공백(CLOB 데이터)으로 채워진다.

COPY 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.COPY
      (
          dest_lob        IN OUT NOCOPY   BLOB,
          src_lob         IN              BLOB,
          amount          IN              INTEGER,
          dest_offset     IN              INTEGER := 1,
          src_offset      IN              INTEGER := 1
      );
    • CLOB 타입인 경우

      DBMS_LOB.COPY
      (
          dest_lob        IN OUT NOCOPY   CLOB,
          src_lob         IN              CLOB,
          amount          IN              INTEGER,
          dest_offset     IN              INTEGER := 1,
          src_offset      IN              INTEGER := 1
      );

      CLOB 데이터를 전달하는 경우 dest_lob, src_lob 파라미터의 LOB 데이터의 문자 집합이 같아야 한다.

  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_lob원본 LOB locator이다.
    amount복사할 Byte(BLOB 데이터) 또는 문자(CLOB 데이터)의 개수이다.
    dest_offset

    대상 LOB 데이터 내의 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    src_offset

    원본 LOB 데이터 내의 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터 중 하나라도 NULL인 경우이다.
    INVALID_POSsrc_offset, dest_offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LENamount의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
  • 예제

    DECLARE
        dest_lob CLOB := 'It you would be loved, ';
        src_lob CLOB := 'be worthy to be loved';
    BEGIN
        DBMS_LOB.COPY(dest_lob, src_lob, length(src_lob), 
                      length(dest_lob) + 1, 1);
        DBMS_OUTPUT.PUT_LINE('Result = ' || dest_lob);
    END;
    /
    Result = It you would be loved, be worthy to be loved
    
    PSM completed
    SQL> 

11.2.3. CONVERTTOBLOB

입력으로 받은 CLOB을 BLOB으로 변환하는 프러시저이다.

CONVERTTOBLOB 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOB.CONVERTTOBLOB
    (
        dest_lob        IN OUT NO COPY  BLOB,
        src_lob         IN              CLOB,
        amount          IN              INTEGER,
        dest_offset     IN OUT          INTEGER,
        src_offset      IN OUT          INTEGER,
        blob_csid       IN              NUMBER,
        lang_context    IN OUT          INTEGER,
        warning         OUT             INTEGER
    );
  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_lob원본 LOB locator이다.
    amount복사할 문자의 개수이다.
    dest_offset

    대상 LOB 데이터 내의 오프셋이다.

    출력은 대상 LOB이 저장된 마지막 주소이다.

    (단위: Byte(BLOB 데이터))

    src_offset

    원본 LOB 데이터 내의 오프셋이다.

    출력은 원본 LOB을 읽은 마지막 주소이다.

    (단위: 문자(CLOB 데이터))

    blob_csidCLOB에서 변환된 데이터를 BLOB을 저장할 때 사용할 캐릭터 셋의 ID이다.
    lang_context미사용
    warning미사용
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터 중 하나라도 NULL인 경우이다.
  • 예제

    declare
        src_clob                clob;
        dest_blob               blob;
        dest_clob               clob;
        amount                  integer;
        dest_offset             integer;
        src_offset              integer;
        blob_csid               integer;
        lang_context            integer;
        warning                 integer;
    
    begin
        src_clob := 'abcdefghijklmn';
        dbms_lob.createtemporary(dest_blob, false);
        dbms_lob.createtemporary(dest_clob, false);
    
        amount := 10;
        dest_offset := 1;
        src_offset := 1;
        blob_csid := 0;
        lang_context := 0;
        warning := 0;
    
        dbms_lob.CONVERTTOBLOB(dest_blob, src_clob, amount,dest_offset, 
                          src_offset, blob_csid, lang_context, warning);
    end;
    /
    
    PSM completed
    SQL> 

11.2.4. CONVERTTOCLOB

입력으로 받은 BLOB을 CLOB으로 변환하는 프러시저이다.

CONVERTTOCLOB 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOB.CONVERTTOCLOB
    (
        dest_lob        IN OUT NO COPY  CLOB,
        src_lob         IN              BLOB,
        amount          IN              INTEGER,
        dest_offset     IN OUT          INTEGER,
        src_offset      IN OUT          INTEGER,
        blob_csid       IN              NUMBER,
        lang_context    IN OUT          INTEGER,
        warning         OUT             INTEGER
    );
  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_lob원본 LOB locator이다.
    amount복사할 문자의 개수이다.
    dest_offset

    대상 LOB 데이터 내의 오프셋이다.

    출력은 대상 LOB이 저장된 마지막 주소이다.

    (단위: Byte(BLOB 데이터))

    src_offset

    원본 LOB 데이터 내의 오프셋이다.

    출력은 원본 LOB을 읽은 마지막 주소이다.

    (단위: 문자(CLOB 데이터))

    blob_csidCLOB에서 변환된 데이터를 BLOB을 저장할 때 사용할 캐릭터 셋의 ID이다.
    lang_context미사용
    warning미사용
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터 중 하나라도 NULL인 경우이다.
  • 예제

    declare
        src_clob                clob;
        dest_blob               blob;
        dest_clob               clob;
    
        amount                  integer;
        dest_offset             integer;
        src_offset              integer;
        blob_csid               integer;
        lang_context            integer;
        warning                 integer;
    
    begin
        src_clob := 'abcdefghijklmn';
        dbms_lob.createtemporary(dest_blob, false);
        dbms_lob.createtemporary(dest_clob, false);
    
        amount := 10;
        dest_offset := 1;
        src_offset := 1;
        blob_csid := 0;
        lang_context := 0;
        warning := 0;
    
        dbms_output.put_line('org clob : ' || src_clob);
    
        dbms_lob.CONVERTTOBLOB(dest_blob, src_clob, amount,
                               dest_offset, src_offset, blob_csid,
                               lang_context, warning);
    
        dbms_output.put_line('dest offset : ' || dest_offset);
        dbms_output.put_line('srct offset : ' || src_offset);
    
        amount := 20;
        dest_offset := 1;
        src_offset := 1;
        blob_csid := 0;
        lang_context := 0;
        warning := 0;
    
        dbms_lob.CONVERTTOCLOB(dest_clob, dest_blob, amount,
                               dest_offset, src_offset, blob_csid,
                               lang_context, warning);
    
        dbms_output.put_line('dest clob : ' || dest_clob);
        dbms_output.put_line('dest offset : ' || dest_offset);
        dbms_output.put_line('srct offset : ' || src_offset);
    end;
    /
    
    org clob : abcdefghijklmn
    dest offset : 11
    srct offset : 11
    dest clob : abcdefghij
    dest offset : 11
    srct offset : 11
    
    PSM completed.
    
    SQL> 

11.2.5. CREATETEMPORARY

임시 CLOB 또는 임시 BLOB을 생성하는 프러시저이다.

CREATETEMPORARY 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.CREATETEMPORARY
      (
          lob         IN OUT NOCOPY   BLOB,
          cache       IN              BOOLEAN,
          dur         IN              PLS_INTEGER := 10
      );
    • CLOB 타입인 경우

      DBMS_LOB.CREATETEMPORARY
      (
          lob         IN OUT NOCOPY   CLOB,
          cache       IN              BOOLEAN,
          dur         IN              PLS_INTEGER := 10
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
    cacheLOB 데이터를 읽을 때 버퍼 캐시(buffer cache)에 저장할지 여부이다.
    dur현재 이 파라미터는 CREATETEMPORARY 프러시저의 수명을 조정하는 기능을 지원하지 않는다. 단, 기본은 세션이 완료되면 CREATETEMPORARY 프러시저가 자동으로 삭제된다.
  • 예외 상황

    예외 상황설명
    VALUE_ERROR캐시 파라미터가 NULL인 경우이다.
  • 예제

    DECLARE
        lob_1 CLOB;
        lob_2 CLOB := 'tibero';
    BEGIN
        DBMS_LOB.CREATETEMPORARY(lob_1, false);
        DBMS_LOB.APPEND(lob_1, lob_2);
        DBMS_OUTPUT.PUT_LINE(lob_1);
    END;
    /
    tibero
    
    PSM completed
    SQL> 

11.2.6. ERASE

LOB 데이터의 일부 또는 전체를 삭제하는 프러시저이다. 삭제된 영역은 0(BLOB 데이터) 또는 공백(CLOB 데이터)으로 채워진다. 대상 LOB 데이터의 길이가 오프셋과 삭제할 영역 크기의 합보다 짧다면 실제로 삭제된 영역의 크기는 삭제할 영역으로 입력한 크기보다 작을 수 있다. 실제로 삭제된 영역의 크기는 amount 파라미터로 출력된다.

ERASE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.ERASE
      (
          lob         IN OUT NOCOPY   BLOB,
          amount      IN OUT NOCOPY   INTEGER,
          offset      IN              INTEGER := 1
      );
    • CLOB 타입인 경우

      DBMS_LOB.ERASE
      (
          lob         IN OUT NOCOPY   CLOB,
          amount      IN OUT NOCOPY   INTEGER,
          offset      IN              INTEGER := 1
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
    amount삭제할 Byte 또는 문자 개수이다.
    offset

    삭제할 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터가 하나라도 NULL인 경우이다.
    INVALID_POSoffset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LENamount의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
  • 예제

    DECLARE
        lob CLOB := 'Tmaxsoft Tibero';
        amount NUMBER := 7;
    BEGIN
        DBMS_OUTPUT.PUT_LINE('Length of original LOB = ' || length(lob));
        DBMS_LOB.ERASE(lob, amount, 9);
        DBMS_OUTPUT.PUT_LINE('Value of erased LOB = ' || lob);
        DBMS_OUTPUT.PUT_LINE('Length of erased LOB = ' || length(lob));
    END;
    /
    Length of original LOB = 15
    Value of erased LOB = Tmaxsoft
    Length of erased LOB = 15
    
    PSM completed
    SQL> 

11.2.7. FREETEMPORARY

이미 생성된 임시 BLOB 또는 임시 CLOB을 삭제하는 프러시저이다.

FREETEMPORARY 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.FREETEMPORARY
      (
          lob         IN OUT NOCOPY   BLOB
      );
    • CLOB 타입인 경우

      DBMS_LOB.FREETEMPORARY
      (
          lob         IN OUT NOCOPY   CLOB
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터가 NULL인 경우이다.
  • 예제

    DECLARE
        lob CLOB;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(lob, false);
        DBMS_LOB.FREETEMPORARY(lob);
    END;
    /
    
    PSM completed
    SQL> 

11.2.8. LOADFROMFILE

파일 내용을 읽어서, LOB 데이터에 쓰기를 한다. 파일은 열어져 있어야 하며, LOB도 생성된 상태여야 한다. 본 프러시저에서는 문자집합 변환이 이뤄지지 않는다(CLOB의 데이터 내부 형태는 UCS2 인코딩이므로, CLOB으로 읽어들일 파일 인코딩 또한 UCS2이어야 한다. 그렇지 않는 경우 동작은 정의되지 않는다).

LOADFROMFILE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.LOADFROMFILE
      (
          dest_lob    IN OUT NOCOPY BLOB,
          src_file    IN            BFILE,
          amount      IN            INTEGER,
          dest_offset IN            INTEGER := 1,
          src_offset  IN            INTEGER := 1
      );
    • CLOB 타입인 경우

      DBMS_LOB.LOADFROMFILE
      (
          dest_lob    IN OUT NOCOPY CLOB,
          src_file    IN            BFILE,
          amount      IN            INTEGER,
          dest_offset IN            INTEGER := 1,
          src_offset  IN            INTEGER := 1
      );
  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_file

    LOB으로 읽어들일 bfile 타입의 파일 핸들이다.

    BLOB 및 CLOB 버전의 경우 문자집합의 변환이 없다(CLOB 버전을 사용하는 경우 입력 텍스트 파일은 UCS2 인코딩만을 지원한다).

    amount

    파일로부터 읽어들일 크기이다.

    BLOB 버전의 경우에는 바이트를 의미하고, CLOB 버전인 경우는 문자를 의미한다(문자는 UCS2 인코딩을 가정하므로, 1문자는 2Bytes이다).

    dest_offset쓸 LOB의 offset이다. (기본값: 1, 1 베이스)
    src_offset읽을 파일의 offset이다. (기본값: 1, 1 베이스)
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터가 적절하지 않는 경우 발생한다.
  • 예제

    SQL> create directory BFILETESTDIR as '/home/tests/test_bfile/';
    
    Directory 'BFILETESTDIR' created.
    
    SQL> DECLARE 
        f UTL_FILE.FILE_TYPE; 
    
        buffer RAW(16) := '000102030405060708090A0B0C0C0E0F';
    begin 
        f := UTL_FILE.FOPEN('BFILETESTDIR', 'test001.bin', 'wb');
        UTL_FILE.PUT_RAW(f, buffer);
        UTL_FILE.FCLOSE(f);
    end;
    /
    
    PSM completed.
    
    SQL> DECLARE 
        f1 BFILE;
        bl1 BLOB := HEXTORAW('AAAAAA');
        amount NUMBER;
        buffer RAW(16);
        result RAW(16) := '000102030405060708090A0B0C0C0E0F';
        buffer2 RAW(32);
        result2 RAW(32) := '000102030405060708090A0B0C0D0E0F';
    begin
       f1 := BFILENAME('BFILETESTDIR', 'test001.bin');
    
       DBMS_LOB.FILEOPEN(f1, DBMS_LOB.FILE_READONLY);
    
       amount := 16;
       DBMS_LOB.LOADFROMFILE(bl1, f1, amount);
       DBMS_LOB.READ(bl1, amount, 1, buffer);
    
       DBMS_OUTPUT.PUT_LINE(amount);
       DBMS_LOB.FILECLOSE(f1);
    end;
    /
    16
    
    PSM completed.
    
    SQL> DECLARE 
        lob CLOB;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(lob, false);
        DBMS_LOB.LOADFROMFILE(lob);
    END;
    /
    
    PSM completed.
    
    SQL> DECLARE
        f UTL_FILE.FILE_TYPE; 
    
        buffer RAW(16) := '00610062006300640065006600670068';
    BEGIN 
        f := UTL_FILE.FOPEN('BFILETESTDIR', 'ucs2_file.bin', 'wb');
        UTL_FILE.PUT_RAW(f, buffer);
        UTL_FILE.FCLOSE(f);
    END;
    /
    
    PSM completed.
    
    SQL> SET SERVEROUTPUT ON 
    SQL> DECLARE
        f1 BFILE;
        bl1 CLOB := 'init'; 
        amount NUMBER;
    BEGIN
       F1 := BFILENAME('BFILETESTDIR', 'ucs2_file.bin');
    
       DBMS_LOB.FILEOPEN(f1, DBMS_LOB.FILE_READONLY);
    
       AMOUNT := 8;
       DBMS_LOB.LOADFROMFILE(bl1, f1, amount);
    
       DBMS_OUTPUT.PUT_LINE ('abcdefgh');
    
       DBMS_LOB.FILECLOSE(f1);
    END;
    /
    bcdefgh
    
    PSM completed.
    
    SQL> 

11.2.9. LOADBLOBFROMFILE

파일 내용을 읽어서, BLOB 데이터에 쓰기를 한다. 파일은 열어져 있어야 하며, LOB도 생성된 상태여야 한다.

LOADBLOBFROMFILE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOB.LOADBLOBFROMFILE
    (
        dest_lob    IN OUT NOCOPY BLOB,
        src_file    IN            BFILE,
        amount      IN            INTEGER,
        dest_offset IN            INTEGER,
        src_offset  IN            INTEGER
    );
  • 파라미터

    파라미터설명
    dest_lob대상 LOB locator이다.
    src_fileLOB로 읽어들일 bfile 타입의 파일 핸들이다. 문자집합의 변환이 없다.
    amount파일로부터 읽어들일 크기(바이트)이다.
    dest_offset쓸 LOB의 offset이다. (1 베이스)
    src_offset읽을 파일의 offset이다. (1 베이스)
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터가 적절하지 않는 경우 발생한다.
  • 예제

    SQL> create directory BFILETESTDIR as '/home/tests/test_bfile/';
    
    Directory 'BFILETESTDIR' created.
    
    SQL> DECLARE 
        f UTL_FILE.FILE_TYPE; 
    
        buffer RAW(16) := '000102030405060708090A0B0C0C0E0F';
    begin 
        f := UTL_FILE.FOPEN('BFILETESTDIR', 'test001.bin', 'wb');
        UTL_FILE.PUT_RAW(f, buffer);
        UTL_FILE.FCLOSE(f);
    end;
    /
    
    PSM completed.
    
    SQL> DECLARE 
        f1 BFILE;
        bl1 BLOB := HEXTORAW('AAAAAA');
        amount NUMBER;
        buffer RAW(16);
        result RAW(16) := '000102030405060708090A0B0C0C0E0F';
        buffer2 RAW(32);
        result2 RAW(32) := '000102030405060708090A0B0C0D0E0F';
        src_ofst NUMBER;
        dst_ofst NUMBER;
    begin
       f1 := BFILENAME('BFILETESTDIR', 'test001.bin');
    
       DBMS_LOB.FILEOPEN(f1, dbms_lob.file_readonly);
    
       amount := 16;
        src_ofst := 1;
        dst_ofst := 1;
    
       DBMS_LOB.LOADBLOBFROMFILE(bl1, f1, amount, dst_ofst,  src_ofst);
       DBMS_LOB.READ(bl1, amount, 1, buffer);
    
       DBMS_OUTPUT.PUT_LINE(amount);
       DBMS_OUTPUT.PUT_LINE(src_ofst);
       DBMS_OUTPUT.PUT_LINE(dst_ofst);
    
        
       DBMS_LOB.FILECLOSE(f1);
    end;
    /
    16
    17
    17
    
    PSM completed.
    
    SQL> 

11.2.10. OPEN

File Locator로 읽기 전용, 바이너리 모드로 파일을 연다.

OPEN 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_LOB.OPEN
    (   
        file_loc     IN OUT NOCOPY   BFILE,
        open_mode    IN              BINARY_INTEGER := file_readonly
    );
  • 파라미터

    파라미터설명
    file_loc열 파일의 Locator이다.
    open_mode파일 읽기 모드(file_readonly) 파라미터만 허용한다.
  • 예외 상황

    예외 상황설명
    VALUE_ERRORFile locator가 NULL인 경우이다.
    INVALID_ARGVALopen_mode에 file_readonly 값외 다른 값이 온 경우이다.
    INVALID_DIRECTORYFile locator에 지정된 디렉터리가 유효하지 않나 존재하지 않는 경우이다.
    NOEXIST_DIRECTORYFile locator에 지정된 디렉터리 경로가 존재하 않는 경우이다.
    OPERATION_FAILED디렉터리 경로에 파일이 존재하지 않거나, 파일 열수 없는 경우이다.
  • 예제

    create directory BFILETESTDIR as '/mybasepath/bfiletest/';
    
    declare 
        f utl_file.file_type; 
    
        buffer raw(16) := '000102030405060708090A0B0C0D0E0F';
    begin 
        f := utl_file.fopen('BFILETESTDIR', 'test001.bin', 'wb');
        utl_file.put_raw(f, buffer);
        utl_file.fclose(f);
    end;
    /
    
    declare
        f1 bfile;
        amount number;
        buffer raw(16);
        result raw(16) := '000102030405060708090A0B0C0C0E0F';
    begin
       f1 := bfilename('BFILETESTDIR', 'test001.bin');
    
       dbms_lob.open(f1, dbms_lob.file_readonly);
    
       amount := 16;
       dbms_lob.read(f1, amount, 1, buffer);
    
       dbms_output.put_line(amount);
       dbms_output.put_line(buffer); 
        
       dbms_lob.close(f1);
    end;
    / 
    
    16
    000102030405060708090A0B0C0D0E0F

11.2.11. READ

대상 LOB 데이터의 일부 또는 전체를 읽어 출력 파라미터의 버퍼에 저장하는 프러시저이다. 만약 읽기를 시작하는 오프셋과 읽을 크기의 합이 대상 LOB 데이터의 크기보다 커서 LOB 데이터의 끝을 지나가게 되면, 실제 읽은 데이터의 크기는 파라미터로 주어진 읽을 크기보다 작을 수 있다. 이때 실제로 읽어온 데이터의 크기는 입출력 파라미터 amount에 저장되어 반환된다. 만약 읽을 오프셋의 위치가 대상 LOB 데이터의 크기보다 크다면 NO_DATA_FOUND 예외 상황이 발생한다.

CLOB 데이터로부터 읽은 데이터를 클라이언트에 전송하는 경우 클라이언트의 문자 집합으로 자동 변환된다. 이 경우 실제로 읽어온 데이터와 달라질 수 있다.

READ 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.READ
      (
          lob         IN              BLOB,
          amount      IN OUT NOCOPY   BINARY_INTEGER,
          offset      IN              INTEGER,
          buffer      OUT             RAW
      );
    • CLOB 타입인 경우

      DBMS_LOB.READ
      (
          lob         IN              CLOB,
          amount      IN OUT NOCOPY   BINARY_INTEGER,
          offset      IN              INTEGER,
          buffer      OUT             VARCHAR2
      );
  • 파라미터

    파라미터설명
    lob읽을 대상 LOB locator이다.
    amount

    읽을 크기를 입력하고 실제로 읽어온 크기를 출력한다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터) 개수)

    offset

    읽을 대상 LOB 데이터 내의 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    buffer읽을 데이터를 저장하는 출력 버퍼이다.
  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터 중 하나라도 NULL인 경우이다.
    INVALID_POSoffset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LEN
    • amount의 값이 1보다 작거나 MAXBUFSIZE보다 큰 경우이다.

    • amount의 값이 버퍼의 크기보다 큰 경우이다.

    NO_DATA_FOUNDoffset이 대상 LOB 데이터의 크기보다 큰 경우이다.
  • 예제

    DECLARE
        lob CLOB := 'TIBERO fighting!!!';
        buffer VARCHAR2(256);
        amount BINARY_INTEGER := 8;
    BEGIN
        DBMS_LOB.READ(lob, amount, 8, buffer);
        DBMS_OUTPUT.PUT_LINE('Value to be read = ' || buffer);
    END;
    /
    Value to be read = fighting
    
    PSM completed
    SQL> 

11.2.12. TRIM

대상 LOB 데이터의 길이를 지정된 길이로 설정하는 함수이다. BLOB 데이터의 경우 Byte 단위로, CLOB 데이터의 경우 문자 단위로 길이를 지정한다. 지정된 길이를 넘는 데이터는 소멸된다.

만약 이 프러시저를 길이가 0인 LOB 데이터로 실행하면 아무런 값이 반환되지 않는다.

TRIM 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.TRIM
      (
          lob         IN OUT NOCOPY   BLOB, 
          newlen      IN              INTEGER
      );
    • CLOB 타입인 경우

      DBMS_LOB.TRIM
      (
          lob         IN OUT NOCOPY   CLOB, 
          newlen      IN              INTEGER
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
    newlen

    새롭게 지정된 LOB 데이터의 길이이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 예외 상황

    예외 상황설명
    VALUE_ERROR입력 파라미터 중 하나라도 NULL인 경우이다.
    INVALID_LENnewlen 값이 0보다 작거나 LOBMAXSIZE보다 큰 경우이다.
  • 예제

    DECLARE
        lob CLOB := 'A pity beyond all telling is in the heart of love';
    BEGIN
        DBMS_LOB.TRIM(lob, 25);
        DBMS_OUTPUT.PUT_LINE('Value = ' || lob);
        DBMS_OUTPUT.PUT_LINE('Length = ' || length(lob));
    END;
    /
    Value = A pity beyond all telling
    Length = 25
    
    PSM completed
    SQL> 

11.2.13. WRITE

대상 LOB 데이터의 지정된 오프셋 위치에 주어진 데이터를 지정된 크기만큼 저장하는 프러시저이다. 새로운 데이터가 저장되는 위치에 존재하는 이전 데이터는 소멸된다. BLOB 데이터에 대한 오프셋 및 크기는 Byte 단위이며, CLOB 데이터에 대해서는 문자 단위이다.

주어진 데이터의 실제 크기보다 지정된 크기가 큰 경우에는 에러가 발생하며, 지정된 크기가 작은 경우에는 지정된 크기만큼만 저장된다. 지정된 오프셋이 대상 LOB 데이터의 크기보다 큰 경우에는 중간에 0(BLOB 데이터) 또는 공백(CLOB 데이터)으로 채워진다.

이 프러시저를 CLOB 데이터에 대하여 실행할 때 CLOB 데이터의 문자 집합과 저장할 데이터의 문자 집합은 같아야 한다. 이 프러시저를 클라이언트 쪽에서 호출하는 경우 저장할 데이터가 클라이언트 쪽의 문자 집합으로부터 CLOB 데이터 문자 집합으로 변환된 후에 저장된다.

WRITE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.WRITE
      (
          lob             IN OUT NOCOPY   BLOB,
          amount          IN              BINARY_INTEGER,
          offset          IN              INTEGER,
          buffer          IN              RAW
      );
    • CLOB 타입인 경우

      DBMS_LOB.WRITE
      (
          lob             IN OUT NOCOPY   CLOB,
          amount          IN              BINARY_INTEGER,
          offset          IN              INTEGER,
          buffer          IN              VARCHAR
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
    amount

    저장할 데이터의 크기이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    offset

    데이터를 저장할 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    buffer저장할 데이터이다.
  • 예외 상황

    예외 상황설명
    VALUE_ERROR파라미터 중 하나라도 NULL인 경우이다.
    INVALID_POSoffset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LENamount의 값이 1보다 작거나 MAXBUFSIZE보다 큰 경우이다.
  • 예제

    DECLARE
        lob CLOB;
        buffer VARCHAR2(100);
    BEGIN
        DBMS_LOB.CREATETEMPORARY(lob, false);
        buffer := 'Love is friendship set on fire';
        DBMS_LOB.WRITE(lob, length(buffer), 1, buffer);
        DBMS_OUTPUT.PUT_LINE(lob);
    END;
    /
    Love is friendship set on fire
    
    PSM completed
    SQL> 

11.2.14. WRITEAPPEND

대상 LOB 데이터의 끝에 주어진 데이터를 지정된 크기만큼 저장하는 프러시저이다. 이 프러시저는 WRITE 프러시저의 파라미터 오프셋을 대상 LOB 데이터의 길이로 설정한 것과 같다. BLOB 데이터의 크기는 Byte 단위이며, CLOB 데이터는 문자 단위이다.

주어진 데이터의 실제 크기보다 지정된 크기가 큰 경우에는 에러가 발생하며, 지정된 크기가 작은 경우에는 지정된 크기만큼만 저장된다.

이 프러시저를 CLOB 데이터에 대하여 실행할 때에 CLOB 데이터의 문자 집합과 저장할 데이터의 문자 집합은 같아야 한다. 이 프러시저를 클라이언트 쪽에서 호출하는 경우 저장할 데이터가 클라이언트 쪽의 문자 집합에서 CLOB 데이터 문자 집합으로 변환된 후에 저장된다.

WRITEAPPEND 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.WRITEAPPEND 
      (
          lob         IN OUT NOCOPY   BLOB,
          amount      IN              BINARY_INTEGER,
          buffer      IN              RAW
      );
    • CLOB 타입인 경우

      DBMS_LOB.WRITEAPPEND 
      (
          lob         IN OUT NOCOPY   CLOB,
          amount      IN              BINARY_INTEGER,
          buffer      IN              VARCHAR2
      );
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
    amount

    저장할 데이터의 크기이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터) 개수)

    buffer

    저장할 데이터이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 예외 상황

    예외 상황설명
    VALUE_ERROR파라미터 중 하나라도 NULL인 경우이다.
    INVALID_LENamount 값이 1보다 작거나 MAXBUFSIZE보다 큰 경우이다.
  • 예제

    DECLARE
        lob CLOB := 'Parting is such ';
        buffer VARCHAR2(100) := 'sweet sorrow';
    BEGIN
        DBMS_LOB.WRITEAPPEND(lob, length(buffer), buffer);
        DBMS_OUTPUT.PUT_LINE('Result = ' || lob);
    END;
    /
    Result = Parting is such sweet sorrow
    
    PSM completed
    SQL> 

11.3. 함수

본 절에서는 DBMS_LOB 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.

11.3.1. COMPARE

두 개의 LOB 데이터의 전체 또는 일부를 비교하는 함수이다. 같은 타입의 LOB 데이터 간에만 비교가 가능하다.

COMPARE 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.COMPARE
      (
          lob_1           IN          BLOB, 
          lob_2           IN          BLOB,
          amount          IN          INTEGER := 4294967295,
          offset_1        IN          INTEGER := 1,
          offset_2        IN          INTEGER := 1
      ) 
      RETURN INTEGER;
    • CLOB 타입인 경우

      DBMS_LOB.COMPARE
      (
           lob_1           IN          CLOB,
           lob_2           IN          CLOB,
           amount          IN          INTEGER := 4294967295,
           offset_1        IN          INTEGER := 1,
           offset_2        IN          INTEGER := 1
      ) 
      RETURN INTEGER;

      CLOB 데이터를 전달하는 경우 lob_1, lob_2 파라미터의 LOB 데이터의 문자 집합이 같아야 한다.

  • 파라미터

    파라미터설명
    lob_1비교 대상인 첫 번째 LOB locator이다.
    lob_2비교 대상인 두 번째 LOB locator이다.
    amount비교할 Byte의 크기(BLOB 데이터) 또는 문자(CLOB 데이터) 개수이다.
    offset_1

    비교를 시작할 첫 번째 LOB 데이터 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    offset_2

    비교를 시작할 두 번째 LOB 데이터 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 반환값

    반환값설명
    0lob_1, lob_2의 LOB 데이터가 동일한 경우에 반환한다.
    N < 0 or N > 0lob_1, lob_2의 LOB 데이터가 동일하지 않은 경우에 반환한다.

    NULL

    • amount가 1보다 작은 경우에 반환한다.

    • amount가 LOBMAXSIZE보다 큰 경우에 반환한다.

    • offset_1 또는 offset_2가 1보다 작은 경우에 반환한다.

    • offset_1 또는 offset_2가 LOBMAXSIZE보다 큰 경우에 반환한다.

  • 예제

    DECLARE
        lob_1 CLOB := 'abcdefgh';
        lob_2 CLOB := 'abcdefgg';
    BEGIN
        IF DBMS_LOB.COMPARE(lob_1, lob_2) = 0 then
            DBMS_OUTPUT.PUT_LINE('LOB_1 equals LOB_2');
        ELSE 
            DBMS_OUTPUT.PUT_LINE('LOB_1 does not equals LOB_2');
        END IF;
    END;
    /
    LOB_1 does not equals LOB_2
    
    PSM completed
    SQL> 

11.3.2. GETLENGTH

대상 LOB 데이터의 길이를 반환하는 함수이다. 이때 길이는 입력 LOB 데이터의 타입에 따라 Byte 또는 문자 단위의 값으로 반환된다.

GETLENGTH 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.GETLENGTH
      (
          lob             IN          BLOB
      ) 
      RETURN INTEGER;
    • CLOB 타입인 경우

      DBMS_LOB.GETLENGTH
      (
          lob             IN          CLOB
      ) 
      RETURN INTEGER;
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
  • 반환값

    반환값설명
    0빈 LOB 데이터인 경우에 반환한다.
    NULL입력 LOB 데이터의 파라미터가 NULL인 경우에 반환한다.

    COPY, ERASE, WRITE 등의 프러시저에 의해 채워진 0(BLOB 데이터) 또는 공백(CLOB 데이터) 문자도 대상 LOB 데이터의 길이에 포함된다.

  • 예제

    DECLARE
        lob CLOB := 'architecture';
    BEGIN
        DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(lob));
    END;
    /
    12
    
    PSM completed
    SQL> 

11.3.3. INSTR

대상 LOB 데이터 내에서 주어진 패턴이 n 번째로 나타나는 오프셋을 반환하는 함수이다. 패턴을 탐색하는 위치는 대상 LOB 데이터의 처음일 수도 있고 입력 파라미터로 지정된 위치일 수도 있다. 이때 탐색할 대상 패턴은 LIKE 연산자에서 사용되는 퍼센트(%) 또는 언더바(_)와 같은 와일드 카드 문자 등을 포함할 수 없다.

INSTR 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.INSTR
      (
          lob         IN      BLOB,
          pattern     IN      RAW,
          offset      IN      INTEGER := 1,
          nth         IN      INTEGER := 1
      ) 
      RETURN INTEGER;
    • CLOB 타입인 경우

      DBMS_LOB.INSTR
      (
          lob         IN      CLOB,
          pattern     IN      VARCHAR,
          offset      IN      INTEGER := 1,
          nth         IN      INTEGER := 1
      ) 
      RETURN INTEGER;
  • 파라미터

    파라미터설명
    lob패턴을 탐색할 대상 LOB locator이다.
    pattern탐색할 패턴이다.
    offset

    LOB 데이터 내의 탐색을 시작할 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

    nth

    탐색할 패턴의 개수이다.

    1 이상의 값을 가지며, 1이면 첫 번째 패턴의 오프셋을 반환한다.

  • 반환값

    반환값설명
    INTEGER

    패턴과 일치하는 부분을 찾은 경우 해당 패턴이 시작되는 오프셋을 반환한다.

    만약 찾지 못한 경우에는 0을 반환한다.

    NULL
    • IN 파라미터 중 하나라도 NULL인 경우에 반환한다.

    • offset이 1보다 작거나 LOBMAXSIZE보다 큰 경우에 반환한다.

    • nth가 1보다 작거나 LOBMAXSIZE보다 큰 경우에 반환한다.

  • 예제

    DECLARE
        lob CLOB := 'Corporate floor';
        result NUMBER;
    BEGIN
        result := DBMS_LOB.INSTR(lob, 'or', 3, 2);
        DBMS_OUTPUT.PUT_LINE('Result offset = ' || result);
    END;
    /
    Result offset = 14
    
    PSM completed
    SQL> 

11.3.4. ISTEMPORARY

주어진 LOB이 임시 LOB인지 아닌지의 여부를 확인하는 함수이다.

ISTEMPORARY 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.ISTEMPORARY
      (
          lob         IN          BLOB
      ) 
      RETURN INTEGER;
    • CLOB 타입인 경우

      DBMS_LOB.ISTEMPORARY
      (
          lob         IN          CLOB
      ) 
      RETURN INTEGER;
  • 파라미터

    파라미터설명
    lob대상 LOB locator이다.
  • 반환값

    반환값설명
    1임시 LOB인 경우에 반환한다.
    0임시 LOB이 아닌 경우에 반환한다.
  • 예제

    DECLARE
        lob CLOB;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(lob, false);
        IF DBMS_LOB.ISTEMPORARY(lob) = 1THEN
            DBMS_OUTPUT.PUT_LINE('TRUE');
        ELSE
            DBMS_OUTPUT.PUT_LINE('FALSE');
        END IF;
    END;
    /
    TRUE
    
    PSM completed
    SQL> 

11.3.5. SUBSTR

대상 LOB 데이터의 지정된 오프셋의 위치로부터 지정된 크기만큼의 데이터를 반환하는 함수이다. 반환될 최대 크기는 32767bytes이며, CLOB 데이터의 경우 반환될 최대 문자 개수는 32767을 2로 나눈 값이다. CLOB 데이터에 대하여 이 함수를 호출하면 같은 문자 집합의 문자열이 반환된다.

이 함수는 하나의 파라미터라도 NULL이 넘겨지거나, 파라미터 amount 또는 offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우에 NULL을 반환한다.

이 함수를 CLOB 데이터에 대해 클라이언트 쪽에서 호출한 경우 만약 클라이언트 쪽에 설정된 문자 집합가 CLOB 데이터 문자 집합과 다르다면 데이터 전송 중에 자동적으로 문자 집합의 변환이 일어난다.

SUBSTR 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    • BLOB 타입인 경우

      DBMS_LOB.SUBSTR
      (
          lob         IN          BLOB,
          amount      IN          INTEGER := 32767,
          offset      IN          INTEGER := 1
      ) 
      RETURN RAW;
    • CLOB 타입인 경우

      DBMS_LOB.SUBSTR
      (
          lob         IN          CLOB,
          amount      IN          INTEGER := 32767,
          offset      IN          INTEGER := 1
      ) 
      RETURN VARCHAR2;
  • 파라미터

    파라미터설명
    lob대상 LOB 데이터이다.
    amount

    읽을 데이터의 크기이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터) 개수)

    offset

    데이터를 읽을 LOB 데이터 내의 오프셋이다.

    (단위: Byte(BLOB 데이터) 또는 문자(CLOB 데이터))

  • 반환값

    반환값설명
    RAW/VARCHAR2 데이터SUBSTR 함수가 성공적으로 종료된 경우에 반환한다.
    NULL
    • 입력 파라미터가 하나라도 NULL인 경우에 반환한다.

    • amount가 1보다 작거나 32767bytes보다 큰 경우에 반환한다.

    • offset이 1보다 작거나 LOBMAXSIZE보다 큰 경우에 반환한다.

  • 예제

    DECLARE
        lob CLOB := 'Your friend is too young';
        buffer VARCHAR2(100);
    BEGIN
        buffer := DBMS_LOB.SUBSTR(lob, 6, 6);
        DBMS_OUTPUT.PUT_LINE('My favorite word is ' || UPPER(buffer));
    END;
    /
    My favorite word is FRIEND
    
    PSM completed
    SQL>