게시일: Nov 15, 2011 7:6:16 AM
- 변수와 상수
▶ 변수 선언
pid number(9)
pname varchar2(10)
▶ 상수 선언
: CONSTANT 키워드가 붙는다.
: 선언시에 반드시 값을 할당해야 한다.
iYear constant integer := 2011;
▶ %TYPE
: 테이블에 있는 컬럼 타입을 그대로 가져온다.
[구문 형식]
변수명 테이블명.컬럼명%TYPE
▶ %ROWTYPE
: 테이블에 있는 로우를 대입할 수 있다.
: 일반 변수에는 사용할 수 없으며, 콜렉션이나 OBJECT 타입 변수에서만 사용할 수 있다.
- 콜렉션 (COLLECTION)
: 배열 형태의 데이터 타입
: 같은 데이터 타입을 가진 요소들로 구성
▶ VARRAY (variable array)
: 고정 길이(fixed number)를 가진 배열
: 선언시에 배열의 전체 크기를 명시해야 함.
: 데이터를 참조할 때 각각의 요소들 순서대로 참조해야 함.
예) varray의 크기가 3이라면 varray[1], varray[2], varray[31] 순서대로 데이터가 들어가야 함.
: 테이블 내에 저장될 수 있음. -> 테이블의 하나의 컬럼 타입으로 사용될 수 있음.
▶ 중첩 테이블
: VARRAY와 흡사한 구조를 가지고 있으나 차이점이 있음.
: 선언시에 배열의 크기를 명시할 필요 없음.
: 데이터를 참조할 때 각각의 요소 순서를 지킬 필요 없음.
예) varray의 크기가 3이라면 varray[1], varray[3]만 할당하고 varray[2]는 값을 할당하지 않아도 됨.
▶ Associative array(index-by table) : 연관 배열
: 키와 값의 쌍으로 구성된 콜렉션 (Java나 C#과 같은 언어에서 사용하는 Hash table과 동일한 개념
: varray가 요소의 인덱스를 통해 각 요소의 값에 접근하는 반면 associative array는 키에 의해 값에 접근한다.
- 콜렉션의 사용
▶ VARRAY
TYPE 타입명 IS { VARRAY | VARYING ARRAY } (크기) OF 요소데이터타입 [NOT NULL];
▶ nested table
TYPE 타입명 IS TABBLE OF 요소데이터타입 [NOT NULL];
▶ associative array
TYPE 타입명 IS TABLE OF 요소데이터타입 [ NOT NULL] INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(크기) ] INDEX BY 키타입;
예)
declare
-- 타입 선언
TYPE varray_test IS VARRAY(3) OF INTEGER; -- INTEGER형 3개
TYPE nested_test IS TABLE OF VARCHAR2(10); -- VARCHAR2(10)형, 크기 설정 없음
TYPE associ_test_num IS TABLE OF NUMBER INDEX BY PLS_INTEGER; -- 키는 PLS_INTEGER 형, 값은 NUMBER형
TYPE associ_test_str1 IS TABLE OF VARCHAR2(32) INDEX BY PLS_INTEGER; -- 키는 PLS_INTEGER 형, 값은 VARCHAR2(32)형
TYPE associ_test_str2 IS TABLE OF VARCHAR2(32) INDEX BY VARCHAR2(64); -- 키는 VARCHAR2(64)형, 값은 VARCHAR2(32)형
-- 변수 선언
varray1 varray_test;
nested1 nested_test;
associ1 associ_test_num;
associ2 associ_test_str1;
associ3 associ_test_str2;
begin
-- 변수에 값 할당
varray1 := varray_test(1,2,3); -- VARRAY(3) 이므로 3개만
nested1 := nested_test('A', 'B', 'C', 'D'); -- nested table은 배열 크기 제한이 없다
associ1(3) := 33;
associ2(2) := 'TT';
associ3('O') := 'ORACLE';
associ3('K') := 'KOREA';
dbms_output.put_line(varray1(1) ); -- 1 (첫번째, 0번째 아님)
dbms_output.put_line(nested1(2) ); -- B (두번째)
dbms_output.put_line(associ1(3) ); -- 33
dbms_output.put_line(associ2(2) ); -- TT
dbms_output.put_line(associ3('O')); -- ORACLE
dbms_output.put_line(associ3('K')); -- KOREA
end;
☞ Associative array를 사용하면 좋은 경우
'홍길동' '010-1111-1111'
'장길산' '010-2222-2222'
'임꺽정' '010-3333-3333'
데이터가 위와 같은 경우 이름을 키로 하고 전화번호를 요소값으로 설정한다.
- 콜렉션을 데이터베이스 객체로 만들어 사용하기
-- type 생성
CREATE TYPE alphabet_type AS VARRAY(26) OF VARCHAR2(2); --> TYPE alphabet_type Compiled
declare
-- 객체 선언
test_alpha alphabet_type;
begin
-- 값 할당
test_alpha := alphabet_type('A', 'B', 'C', 'D');
dbms_output.put_line(test_alpha(2)); -- B
end;
- 레코드
: 테이블 형태의 데이터 타입
[구문 형식]
TYPE 레코드이름 IS RECORD (필드1 데이터타입1, 필드2 데이터타입2, ...);
레코드이름 테이블명%ROWTYPE;
레코드이름 커서명%ROWTYPE;
-- 테이블 : departments
declare
-- departments 과 동일한 타입으로 선언한 레코드
type RECORD1 is record (
DEPT_ID number not null := 300
, DEPT_NAME varchar2(30)
, MAIN_ID number
, LOCA_ID number
);
REC1 RECORD1; -- 위에서 선언한 타입으로 선언
REC2 DEPARTMENTS%rowtype; -- 테이블의 레코드와 동일한 타입으로 선언
cursor c1 is
select department_id, department_name, location_id
from departments
where location_id = 1700;
REC3 C1%rowtype; -- 커서를 이용한 레코드 선언
begin
REC1.DEPT_NAME := '레코드부서1';
REC2.DEPARTMENT_ID := 400;
REC2.DEPARTMENT_NAME := '레코드부서2';
REC2.LOCATION_ID := 2700;
-- 테이블에 레코드를 그대로 입력
insert into DEPARTMENTS values REC1;
-- 테이블에 레코드를 그대로 입력
insert into DEPARTMENTS values REC2;
open C1;
loop
fetch C1 into REC3;
dbms_output.put_line(REC3.DEPARTMENT_ID);
exit when C1%notfound;
end loop;
commit;
exception
when others then
rollback;
end;