GOLDILOCKS 는 SQL/PSM 에서 일반 데이터 타입으로 선언된 변수를 지원합니다.
또한, 사용자의 편리성을 위해 변수를 선언하는 많은 방법을 지원합니다.
데이터 타입 |
구문 |
참조 대상 |
Attribute Data Types |
%TYPE |
다른 변수 혹은 테이블 컬럼과 같은 타입을 명시 |
|
%ROWTYPE |
특정 테이블 구조 혹은 특정 커서의 반환 타입과 같은 타입을 명시 |
User Defined Record Types |
TYPE .. IS RECORD .. |
사용자가 특정 용도에 맞는 데이터 구조를 선언하여 생성 |
User Defined Collection Types |
TYPE .. IS TABLE OF .. INDEX BY |
Associative Array 를 지원하며, Key/Value 형태로 1개 이상의 값을 저장 |
SYS_REFCURSOR |
SYS_REFCURSOR |
커서를 선언 |
위의 표의 구문을 사용하는 방법입니다.
먼저 PSM 수행을 위해 테이블을 생성합니다.
gSQL> CREATE TABLE EMP ( ID INTEGER, NAME VARCHAR(32) ); gSQL> INSERT INTO EMP VALUES ( 1001, 'Tom Jackson' ); gSQL> COMMIT;
%TYPE
다른 변수 혹은 특정 테이블의 컬럼과 같은 타입을 명시할 때 사용됩니다.
gSQL> DECLARE
2 V_NAME EMP.NAME%TYPE;
3 BEGIN
4 SELECT NAME INTO V_NAME FROM EMP;
5 DBMS_OUTPUT.PUT_LINE( 'EMP.NAME = ' || V_NAME );
6 END;
7 /
EMP.NAME = Tom Jackson
Anonymous PL block executed.%ROWTYPE
특정 테이블의 구조 혹은 특정 커서의 반환 타입과 같은 타입을 명시할 때 사용됩니다.
레코트 타입 혹은 Collection 타입 변수들은 ROWTYPE 의 대상이 될 수 없습니다.
gSQL> DECLARE
2 V_EMP EMP%ROWTYPE;
3 BEGIN
4 SELECT * INTO V_EMP FROM EMP WHERE ID = 1001;
5 DBMS_OUTPUT.PUT_LINE( 'Name of ID 1001 Is : ' || V_EMP.NAME );
6 END;
7 /
Name of ID 1001 Is : Tom Jackson
Anonymous PL block executed.User Defined Record Types
%ROWTYPE 을 사용하여 커서의 타입을 그대로 본떠오거나, 사용자가 특정 용도에 맞게 데이터 구조를 선언하여 생성할 수 있습니다.
일반 지역변수, Nested 프로시져 혹은 함수의 인자나 반환타입에는 사용이 가능하나, Schema-Level 프로시져 혹은 함수의 인자나 반환타입은 불가합니다.
gSQL> DECLARE
2 TYPE MY_EMP_TYPE IS RECORD
3 (
4 ID INTEGER := 99999,
5 NAME VARCHAR(32) NOT NULL DEFAULT 'anonymous'
6 );
7 V_EMP MY_EMP_TYPE;
8 BEGIN
9 SELECT ID, NAME INTO V_EMP.ID, V_EMP.NAME FROM EMP;
10 DBMS_OUTPUT.PUT_LINE('ID = ' || V_EMP.ID);
11 DBMS_OUTPUT.PUT_LINE('NAME = ' || V_EMP.NAME);
12 END;
13 /
ID = 1001
NAME = Tom Jackson
Anonymous PL block executed.gSQL> DECLARE
2 TYPE MY_EMP_TYPE IS RECORD
3 (
4 ID INTEGER := 99999,
5 NAME VARCHAR(32) NOT NULL DEFAULT 'anonymous'
6 );
7 V_EMP MY_EMP_TYPE;
8 PROCEDURE SET_EMP( A_EMP IN OUT MY_EMP_TYPE )
9 IS
10 BEGIN
11 DBMS_OUTPUT.PUT_LINE('ID = ' || A_EMP.ID);
12 DBMS_OUTPUT.PUT_LINE('NAME = ' || A_EMP.NAME);
13 SELECT ID, NAME INTO A_EMP.ID, A_EMP.NAME FROM EMP;
14 END;
15 BEGIN
16 SET_EMP( V_EMP );
17 DBMS_OUTPUT.PUT_LINE('ID = ' || V_EMP.ID);
18 DBMS_OUTPUT.PUT_LINE('NAME = ' || V_EMP.NAME);
19 END;
20 /
ID = 99999
NAME = anonymous
ID = 1001
NAME = Tom Jackson
Anonymous PL block executed.User Defined Collection Type
1개 이상의 데이터를 저장하는 일종의 배열 구조를 의미합니다.
GOLDILOCKS 는 Collection Type 중 Key/Value 로 저장이 가능한 Associative Type 을 지원합니다.
Associative Type 의 구문은 아래와 같으며 < > 에 들어가는 내용은 다음과 같습니다.
TYPE <type_name> IS TABLE OF <element_data_type> INDEX BY <index_key_data_type>
- <type_name> 은 해당 Type에 대해 사용자가 지정
- <element_data_type> 은 Array를 구성하는 Value의 Data Type을 지정
- <index_key_data_type> 은 element를 탐색할 Index Key의 Data Type을 지정
이 부분은 제가 더 공부하고 올리겠습니다. ㅠㅠ *. *
SYS_REFCURSOR
커서를 선언하는 용도로 사용됩니다.
커서는 OPEN FOR, FETCH, CLOSE 단계를 거칩니다.
gSQL> DECLARE
2 V_ID INTEGER;
3 V_NAME VARCHAR(32);
4 cur1 SYS_REFCURSOR;
5 BEGIN
6 OPEN cur1 FOR SELECT ID, NAME FROM EMP;
7
8 FETCH cur1 INTO v_id, v_name;
9 DBMS_OUTPUT.PUT_LINE('v_id = ' || v_id);
10 DBMS_OUTPUT.PUT_LINE('v_name = ' || v_name);
11 CLOSE cur1;
12 END;
13 /
v_id = 1001
v_name = Tom Jackson
Anonymous PL block executed.