DBMS 1

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

DBMS_LOB

작성자
dataonair
작성일
2021-02-14 16:00
조회
1863



제8장DBMS_LOB




내용 목차






8.1. 개요

8.2. 프로시저


8.2.1. APPEND

8.2.2. COPY

8.2.3. CREATETEMPORARY

8.2.4. ERASE

8.2.5. FREETEMPORARY

8.2.6. READ

8.2.7. TRIM

8.2.8. WRITE

8.2.9. WRITEAPPEND


8.3. 함수


8.3.1. COMPARE

8.3.2. GETLENGTH

8.3.3. INSTR

8.3.4. ISTEMPORARY

8.3.5. SUBSTR





8.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 문자 집합의 문자열이 저장되며, 2byte로 하나의 문자를 나타낸다.
    • 길이 또는 크기 값은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 패키지 내에 정의된 상수이다.

  • LOBMAXSIZELOB 데이터의 최대 크기이다.
    LOBMAXSIZE CONSTANT BINARY_INTEGER := 18446744073709551615
    데이터 타입은 BINARY_INTEGER이고 LOB 데이터의 최대 크기는 18446744073709551615이다.
  • LOB_READONLYLOB 데이터에 대한 읽기 전용의 사용 여부를 설정하는 모드이다.
    LOB_READONLY CONSTANT BINARY_INTEGER := 0
    데이터 타입은 BINARY_INTEGER이고 값이 0이면 읽기 전용으로 설정된다.
  • LOB_READWRITELOB 데이터의 읽기 및 쓰기를 설정하는 모드이다.
    LOB_READWRITE CONSTANT BINARY_INTEGER := 1
    데이터 타입은 BINARY_INTEGER이고 값이 1이면 읽기 및 쓰기로 설정된다.





8.2. 프로시저




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




8.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>





8.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_POS src_offset, dest_offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LEN amount의 값이 1보TBODY>
  • 예제
    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>





8.2.3. 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이다.
    cache LOB 데이터를 읽을 때 버퍼 캐시(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>





8.2.4. 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_POS offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LEN amount의 값이 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>





8.2.5. 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>





8.2.6. 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_POS offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LEN

    • amount의 값이 1보다 작거나 MAXBUFSIZE보다 큰 경우이다.
    • amount의 값이 버퍼의 크기보다 큰 경우이다.
    NO_DATA_FOUND offset이 대상 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>





8.2.7. 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_LEN newlen 값이 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>





8.2.8. 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_POS offset의 값이 1보다 작거나 LOBMAXSIZE보다 큰 경우이다.
    INVALID_LEN amount의 값이 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>





8.2.9. 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_LEN amount 값이 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>






8.3. 함수




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




8.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 데이터))
  • 반환값

    반환값 설명
    0 lob_1, lob_2의 LOB 데이터가 동일한 경우에 반환한다.
    N < 0 or N > 0 lob_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>





8.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>





8.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)