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.