C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]20. 조합 데이터 형과 작업 본문

Programming/Oracle 공부

[Oracle/기본]20. 조합 데이터 형과 작업

19760323 2017. 5. 31. 16:13

 

● 조합 데이터형 (또는 Collection 이라고도 부른다.)

 

-RECORD

 관련은 있으나 비슷하지 않은 데이터를 논리적인 한 단위로 묶기 위해서 RECORD 데이터형을 사용한다.

 

-TABLE

 전체 객체로서 데이터의 모음을 참조하고 조작하기 위해 TABLE 데이터 형을 사용한다.

 

-중첩 TABLE

-VARRAY

 

● PL/SQL 레코드

 

RECORD는 여러개의 데이터 타입을 갖는 변수들의 집합니다.

PL/SQL 테이블과 다르게 개별 필드의 이름을 부여할 수 있고, 선언시 초기화가 가능하다.

 

TYPE type_name IS RECORD

          (field_declaration[, field_declaration]...);

identifier type_name;

 

type_name RECORD의 형의 이름

field_declaration 레코드 내 필드명, 데이터형, %TYPE, %ROWTYPE속성을 사용할 수 있다.

 

Ex. TYPE emp_record_type IS RECORD

       (ename VARCHAR2(10),

        job VARCHAR2(9),

        sal NUMBER(7,2));

 

     emp_record emp_record_type;

 

Ex.

 

DECLARE

TYPE emp_record_type IS RECORD

(empno NUMBER(4) NOT NULL := 10,

ename  emp.ename%TYPE,

job       emp.job%TYPE);

 

emp_record  emp_record_type; 

 

 

☞ 사용시 예

    emp_record.job := 'CLERK';

 

●%ROWTYPE

 

하나 이상의 데이터값을 갖는 데이터 타입으로 배열과 비슷한 역할을 하고 재사용이 가능하다.

%ROWTYPE 데이터 형과, PL/SQL테이블 레코드복합 데이터 타입에 속한다.

 

테이블이나 내부의 컬럼 데이터형, 크기, 속성등을 그대로 사용 할 수 있다.

%ROWTYPE 앞에 오는 것은 데이터베이스 테이블 이름이다.

지정된 테이블의 구조와 동일한 구조를 갖는 변수를 선언 할 수 있다.

데이터베이스 컬럼들의 수나 DATATYPE을 알지 못할 때 편리 하다.

테이블의 데이터 컬럼의 DATATYPE이 변경 될 경우 프로그램을 재수정할 필요가 없다.

 

 

DECLARE

     identifier reference%ROWTYPE;

 

 

identifier 레코드의 이름이다.

reference 레코드의 기초가 되는 테이브, 뷰, 커서, 커서 변수명이다.

             레코드를 선언할 때 (즉, 테이블 또는 뷰 가 존재해야 한다.) 이 참조가 유효한지 확실히 해야 한다.

 

EX. DECLARE

         emp_record emp%ROWTYPE;

 

Ex. DECLARE

         item_record item%ROWTYPE;

     BEGIN

         SELECT *

            INTO item_record

           FROM item

          WHERE ...

 

item 테이블의 열 값은 item_record로 이름 붙여진 레코드 안으로 지정한다.

 

- 장점

1. 기본 데이터베이스 열의 데이터형과 숫자는 모르게 할 수 있다.

2. 기본 데이터베이스 열의 데이터형과 숫자는 실행 중에 변경될 수 있다.

3. SELECT 문장으로 행을 검색할 때 유용하다.

 

● PL/SQL 테이블

 

1. 두 구성요소로 구성된다. (총 2개의 컬럼)

- BINARY_INTEGER 데이터 형의 기본 키

- 스칼라 또는 레코드 데이터형의

 

2. 제한되어 있지 않으므로 동적으로 증가 한다.

 

TYPE type_name IS TABLE OF

   {column_type / variable%TYPE / table.column%TYPE} [NOT NULL]

   [INDEX BY BINARY_INTEGER];

identifier type_name;

 

Ex. TYPE ename_table_type IS TABLE OF emp.ename%TYPE

       INDEX BY BINARY_INTEGER;

    ename_table ename_table_type;

    ...

 

Ex. DECLARE TYPE date_table_type IS TABLE OF DATE

           INDEX BY BINARY_INTEGER;

        date_table date_table_type;

 

Ex. DECLARE

        TYPE ename_table_type IS TABLE OF emp.ename%TYPE

           INDEX BY BINARY_INTEGER;

        TYPE hiredate_table_type IS TABLE OF DATE

           INDEX BY BINARY_INTEGER;

        ename_table   ename_table_type;

        hiredate_table hiredate_table_type;

     BEGIN

        ename_table(1) := 'CAMERON';       --ename_table 에서 1번째 행을 참조한다.

        hiredate_table(8) := SYSDATE + 7;   --hiredate_table 에서 8번째 행을 참조한다.

          IF ename_table.EXIST(1) THEN       --인덱스  1 인행이 적어도 하나 반환되면 TRUE를 반환한다.

            INSERT INTO ...                          존재하지 않는 테이블 요소를 참조할 때 발생되는 오류를 막기 위해

                                                          EXIST문장을 사용한다.

          ...

     END;

 

Ex. DECLARE

        TYPE dept_table_type IS TABLE OF dept%ROWTYPE

           INDEX BY BINARY_INTEGER;

        dept_table_ dept_table_type;

 

- 데이터베이스 테이블의 모든 필드에 대한 정보를 저장하기 위해 필요한 테이블 정의는 하나이기 때문에 레코드 테이블은

  PL/SQL 테이블의 기능성을 크게 증가시킨다.

 

Ex. 참조 예,

     dept_tabe(15).location := 'Atlanta';

 

     location은 필드를 나타낸다.

 

%ROWTYPE 속성과 조합 데이터형 RECORD 사이의 차이점은,

    RECORD는 레코드에서 필드의 데이터형을 지정하거나 개별 필드를 선언할 수 있도록 해 준다는 것이다.

 

● PL/SQL 테이블 메소드 사용

 

    PL/SQL 테이블을 쉽게 사용하기 위해 사용한다.

 

   

 방법

 설명

 EXISTS(n)

 n 번째 요소가 PL/SQL 테이블에 존재한다면 TRUE를 리턴한다.

 COUNT

 PL/SQL 테이블이 현재 포함하는 요소의 숫자를 리턴한다.

 FIRST

 LAST

 PL/SQL 테이블에서 처음과 마지막 (가장 작고 크고) 인덱스 숫자를 리턴한다.

 PRIOR(n)

 PL/SQL 테이블에서 인덱스 n 이전의 인덱스 숫자를 리턴한다.

 NEXT(n)

 PL/SQL 테이블에서 인덱스 n 다음의 인덱스 숫자를 리턴한다.

 EXTEND(n,i)

 PL/SQL 테이블의 크기 증가를 위해

 EXTEND 는 PL/SQL 테이블에 대한 1개의 NULL 요소 추가.

 EXTEND(n)은 PL/SQL 테이블에 n개의 NULL 요소를 추가.

 EXTEND(n,i)는 PL/SQL 테이블에 대한 i번째 요소에 n 개의 NULL 요소를 추가.

 TRIM

 PL/SQL 테이블의 끝에서 한 요소를 제거.

 TRIM(n)은 PL/SQL 테이블의 끝에서 n개의 요소를 제거.

 DELETE

 DELETE는 PL/SQL 테이블에서 모든 요소를 제거.

 DELETE(n)는 PL/SQL 테이블에서 n번째 요소를 제거.

 DELETE(m,n)는 PL/SQL 테이블에서 m...n 까지의 요소를 제거.

 

 

 

 

 

Comments