PL/SQL Record Type
Record Type
n 서로 다른 종류의 데이터 아이템을 모아서 만든 데이터 구조로 데이터 테이블의
레코드(행)과 유사하게 다른 필드로 구성되어 있으며 프로그래밍 언어의 구조체와 유사하다.
n 하나의 레코드 타입안에는 Scalar Data Type, 다른 Record Type, Table Type들이 들어올 수
있으며 먼저 TYPE을 정의 후 변수의 데이터 타입으로 할당하여 사용한다.
TYPE emp_record_type is record (
empno emp.empno%TYPE,
ename emp.ename%TYPE,
sal emp.sal%TYPE
);
emp_record emp_record_type;
n PL/SQL은 다음 세가지 형태의 레코드를 다룰 수 있다.
User-Definded records : 사용자가 서로 다른 필드로 레코드 구조를 정의
Table-Based records : %rowtype 이용
Cursor-Based redords : %rowtype 이용
1. User-Definded Records
SQL> edit ojc9
SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE ojc9(p_empno IN NUMBER)
IS
TYPE emp_record_type is record (
empno emp.empno%TYPE,
ename emp.ename%TYPE,
sal emp.sal%TYPE
);
emp_record emp_record_type;
BEGIN
SELECT empno, ename, sal
INTO emp_record.empno, emp_record.ename, emp_record.sal
FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE(emp_record.empno || ' : ' || emp_record.ename || ' : ' || emp_record.sal);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('no data...');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('to many rows...');
END ojc9;
/
-- 위에서 작성한 ojc9.sql 파일을 실행하여 ojc9 라는 프로시저를 생성한다.
-- 오류가 발생하면 show errors로 확인 후 디버깅 해야 한다.
SQL> @ojc9
프로시저가 생성되었습니다.
SQL> exec ojc9(7788)
7788 : SCOTT : 3000
-- EMP 테이블에 없는사원번호를 입력, SELECT되는 데이터가 한건도 없으므로 오류발생.
-- EXCEPTION절로 빠져 WHEN NO_DATA_FOUND 처리부가 실행된다.
-- NO_DATA_FOUND는 오라클서버에 미리 정의된 예외명이며, 오라클 서버 오류인 ORA-01403에러에 대해 부여된 예외 명칭이다.
SQL> exec ojc9(1234)
No data…
2. Table Based Records(%rowtype 이용)
DECLARE
emp_rec emp%rowtype;
BEGIN
SELECT * into emp_rec
FROM emp
WHERE empno = 7369;
dbms_output.put_line('사번 : ' || emp_rec.empno);
dbms_output.put_line('이름 : ' || emp_rec.ename);
dbms_output.put_line('급여 : ' || emp_rec.sal);
END;
/
사번 : 7369
이름 : SMITH
급여 : 4500
3. Cursor-Based Records(%rowtype 이용)
DECLARE
CURSOR emp_cur is
SELECT empno, ename, sal
FROM emp;
emp_rec emp_cur%rowtype;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur into emp_rec;
EXIT WHEN emp_cur%notfound;
DBMS_OUTPUT.put_line(emp_rec.empno || ':' || emp_rec.ename
|| ':' || emp_rec.sal);
END LOOP;
CLOSE emp_cur;
END;
/
7369:SMITH:4500
7499:ALLEN:1600
……
7900:JAMES:950
7902:FORD:3000
7934:MILLER:1300
4. Table Type, Record Type을 같이 이용하는 예문
DECLARE
TYPE empRecordType IS RECORD (
empno NUMBER(4),
ename VARCHAR2(20)
);
TYPE empTableType IS TABLE OF empRecordType -- PL/SQL Table Type
INDEX BY BINARY_INTEGER;
emp_rec empRecordType;
emp_table empTableType;
BEGIN
emp_rec.empno := 1111;
emp_rec.ename := '1길동';
emp_table(1) := emp_rec;
for i in emp_table.first .. emp_table.last Loop
dbms_output.put_line(emp_table(i).empno || ':' || emp_table(i).ename);
End Loop;
END;
/
1111:1길동