DataBase/Oracle

16. Oracle 콜렉션,바인드 함수

유가엘 2020. 4. 2. 17:00

15_Collection.sql
0.00MB

콜렉션 함수란?

일반 프로그래밍 언어에서 사용하는 배열 타입을 PL/SQL 에서는 콜렉션이라고 합니다.

 

연관 배열(Associative Array)

정의

Java의 Hash-Map 과 같이 키와 값으로 구성되어있는 콜렉션입니다.

키값을 Index라고 하기 때문에 Index-By Table 이라고 합니다.

키값으로는 숫자가 들어가며 , Binary_Integer , Pls_Integer 가 들어 갑니다.

위 값은 Number 보다 작은 저장영역을 사용하여 산술 연산 시 보다 빠릅니다.

DECLARE 
    tname varchar2(20); 
     
    TYPE t_emp_name IS TABLE OF 
    	employees.last_name%type 
    INDEX BY BINARY_INTEGER;
     
    v_name t_emp_name; 
     
BEGIN 
    SELECT last_name 
    INTO tname
    FROM employees
    WHERE employee_id =100; 
    
    
    v_name(0) := tname; 
    dbms_output.put_line(v_name(0)); 
END; 
/ 

-----------------------------------------------------------

DECLARE 
    TYPE tbl_type is table of 
        employees.last_name%TYPE 
    INDEX BY BINARY_INTEGER;
     
    vtbl_type tbl_type; 
    
    a binary_integer := 0; 
    
BEGIN 
    FOR i in (select last_name from employees) LOOP 
        a:= a+1; 
        vtbl_type(a):=i.last_name; 
    END LOOP; 
    FOR j in 1..a LOOP 
        dbms_output.put_line(vtbl_type(j)); 
    END LOOP; 
END; 
/ 

가변 길이 배열 (VARRY, Variable-Size Array)
Java의 배열과 같이 사용하는 콜렉션이며, 고정 길이를 가집니다.

DECLARE
    TYPE va_type IS VARRAY(5) OF VARCHAR2(20);
    va_array va_type;
BEGIN
    va_array := va_type('1', '2', '3', '', '');
    FOR i IN 1..5 LOOP
    	dbms_output.put_line(vva_test(i));
    END LOOP;
  
END;

중첩 테이블 (Nested Table)

VARRY와 비슷한 콜렉션이지만, 동적으로 크기가 증가됩니다.                         

DECLARE
	TYPE nt_tbl IS TABLE OF VARCHAR2(10);
    v_test nt_typ;
BEGIN
    v_test := nt_tbl('1', '2', '3');
 
    FOR i IN 1..3 LOOP
    	dbms_output.put_line(v_test(i));
	END LOOP;
END;

 



바인드 변수 (비 PL/SQL 변수)란?
호스트 환경에서 생성 되어 데이터를 저장하기 때문에 호스트 변수라고도 합니다.
예약어 VARIABLE 을 쓰며 , SQL 이나 PL/SQL 에서도 사용 가능 합니다. 
PL/SQL 실행 후에도 접근 가능 합니다.
print 명령어를 통해 출력 가능 합니다. 
:를 붙여 이용합니다. 

SET AUTOPRINT ON;

BEGIN 
    SELECT (salary*12+nvl(commission_pct*salary,0)) 
    INTO :vsal 
    FROM employees 
    WHERE employee_id = 128; 
END; 
/ 

PRINT vsal;