복합데이터타입
 
 하나 이상의 데이터값을 갖는 데이터 타입으로 배열과 비슷한 역할을 하고 재사용이 가능합니다.
 ROWTYPE데이터 형과, PL/SQL테이블과 레코드가 복합 데이터 타입에 속합니다.
 테이블이나 뷰 내부의 컬럼 데이터형, 크기, 속석등을 그대로 사용할 수 있습니다.
 %ROWTYPE 앞에 오는 것은 데이터 베이스 테이블 이름입니다.
 지정된 테이블의 구조와 동일한 구조를 갖는 변수를 선언할 수 있습니다.
 데이터베이스 컬럼들의 수나 DATATYPE을 알지 못할 때 편리 합니다.
 테이블의 데이터 컬럼의 DATATYPE이 변경될 경우 프로그램을 재 수정할 필요가 없습니다
 
예문)
 
create or replace procedure rowtype_test_jyh(p_empno in emp2.empno%type)
is
v_emp emp2%rowtype;
begin
dbms_output.enable;
select empno,ename,hiredate
into v_emp.empno, v_emp.ename, v_emp.hiredate
from emp2 where empno=p_empno;
dbms_output.put_line('사원번호:'||v_emp.empno);
dbms_output.put_line('사원이름:'||v_emp.ename);
dbms_output.put_line('입 사 일:'||v_emp.hiredate);
end;
/
 
set serveroutput on;
execute rowtype_test_jyh(7111);
 
 
PL/SQL 테이블

 PL/SQL 에서의 테이블은 오라클 SQL에서의 테이블과는 다릅니다.
 PL/SQL에서의 테이블은 일종의 일차원 배열이라고 생각하시면 이해하기 쉬울겁니다.
 테이블은 크기에 제한이 없으면 그 ROW의 수는 데이터가 들어옴에 따라 자동 증가 합니다.
 BINARY_INTEGER 타입의인덱스 번호로 순서가 정해집니다.
 하나의 테이블에 한 개의 컬럼 데이터를 저장 합니다.  
 
예제)
create or replace procedure table_test_jyh(v_deptno in emp2.deptno%type)
is
type empno_table is table of emp2.empno%type
index by binary_integer;
type ename_table is table of emp2.ename%type
index by binary_integer;
type sal_table is table of emp2.sal%type
index by binary_integer;
empno_tab empno_table;
ename_tab ename_table;
sal_tab sal_table;
i binary_integer:=0;
begin
dbms_output.enable;
for emp_list in(select empno, ename, sal from emp2 where deptno=v_deptno) loop
i:=i+1;
empno_tab(i):=emp_list.empno;
ename_tab(i):=emp_list.ename;
sal_tab(i):=emp_list.sal;
end loop;
for cnt in 1..i loop
dbms_output.put_line('사원번호:'||empno_tab(cnt));
dbms_output.put_line('사원이름:'||ename_tab(cnt));
dbms_output.put_line('사원급여:'||sal_tab(cnt));
end loop;
end;
/
 
set serveroutput on
execute table_test_jyh(10);
 
 
PL/SQL 레코드
 
 여러 개의 데이터 타입을 갖는 변수들의 집합입니다.
 스칼라, RECORD, 또는 PL/SQL TABLE datatype중 하나 이상의 요소로 구성됩니다.
 논리적 단위로서 필드 집합을 처리할 수 있도록 해 줍니다.
 PL/SQL 테이블과 다르게 개별 필드의 이름을 부여할 수 있고, 선언시 초기화가 가능합니다.
 
예제)
create or replace procedure record_test_jyh(p_empno in emp2.empno%type)
is type emp_record is record
(v_empno number, v_ename varchar2(30), v_hiredate date);
emp_rec emp_record;
begin
dbms_output.enable;
select empno,ename,hiredate
into emp_rec.v_empno, emp_rec.v_ename, emp_rec.v_hiredate
from emp2 where empno=p_empno;
dbms_output.put_line('사원번호:'||emp_rec.v_empno);
dbms_output.put_line('사원이름:'||emp_rec.v_ename);
dbms_output.put_line('입 사 일:'||emp_rec.v_hiredate);
end;
/
 
set serveroutput on
execute record_test_jyh(7111);
 
 
 
PL/SQL Table of Record
 
 PL/SQL TABLE변수 선언과 비슷하며 데이터타입을 %ROWTYPE으로 선언
 PL/SQL TABLE과 RECORD의 복합 기능
 
예제)
create or replace procedure table_test_jyh2
is
i binary_integer:=0;
type dept_table_type is table of dept%rowtype
index by binary_integer;
dept_table dept_table_type;
begin
for dept_list in (select * from dept)loop
i:=i+1;
dept_table(i).deptno:=dept_list.deptno;
dept_table(i).dname:=dept_list.dname;
dept_table(i).loc:=dept_list.loc;
end loop;
for cnt in 1..i loop
dbms_output.put_line('부서번호:'||dept_table(cnt).deptno||
'부서명:'||dept_table(cnt).dname||
'위치:'||dept_table(cnt).loc);
end loop;
end;
/
 
set serveroutput on
execute table_test_jyh2;
Posted by 용학도리
,