프로그래밍

Oracle PL/SQL - Record

RainIron 2021. 9. 23. 16:25
반응형

* 레코드를 사용하면 데이터 타입이나 길이가 다른 여러 변수들을 논리적으로 하나의 그룹으로 묶을 수 있다.

 

1. 선언

TYPE 타입명 IS RECORD 필드목록;
레코드변수명 타입명;

필드목록은 레코드의 필드 목록을 선언하는 부분으로, 형식은 CREATE TABLE문의 칼럼 선언가 유사한 형태를 가진다.

 

(예시)

DECLARE
    TYPE emp_type IS RECORD(
        empno  NUMBER(4) NOT NULL := 0,
        ename   emp.ename%TYPE,
        job     VARCHAR2(9)
    );
    v_emp   emp_type;
BEGIN
    v_emp.empno := 9000;
    v_emp.ename := '홍길동';
    v_emp.job   := '의적';
    
    DBMS_OUTPUT.PUT_LINE('EMPNO = '|| v_emp.empno);
    DBMS_OUTPUT.PUT_LINE('ENAME = '|| v_emp.ename);
    DBMS_OUTPUT.PUT_LINE('JOB   = '|| v_emp.job);
END;

- 레코드 선언 시 각 필드에는 반드시 데이터 타입을 지정해야 한다.

 

위의 코드를 %ROWTYPE을 활용해서 작성하면

DECLARE
    v_emp   emp%ROWTYPE;
BEGIN
    v_emp.empno := 9000;
    v_emp.ename := '홍길동';
    v_emp.job   := '의적';
    
    DBMS_OUTPUT.PUT_LINE('EMPNO = '|| v_emp.empno);
    DBMS_OUTPUT.PUT_LINE('ENAME = '|| v_emp.ename);
    DBMS_OUTPUT.PUT_LINE('JOB   = '|| v_emp.job);
END;

 

2. 사용

* 주의: SQL문에 사용할 경우, 오로지 레코드 변수 하나만 지정 가능하며, 다른 레코드 변수나 스칼라 변수, 상수, 리터럴 등을 같이 사용할 수 없다.

 

- 하나의 SQL문에 RECORD를 2개 사용할 경우, 아래와 같은 오류가 발생한다.

 

" PLS-00494: coercion into multiple record targets not supported "

두 개의 레코드 변수를 사용할 수 없다!

 

- RECORD 변수와 일반 변수를 같이 사용할 경우 아래와 같은 오류가 발생한다.

" ORA-06550: ~~ PLS-00494: 중복 레코드 대상 안에 강압이 제공되지 않습니다 "

 

3. 값 할당

DECLARE
    TYPE emp_rec IS RECORD(
        empno emp.empno%TYPE,
        ename emp.ename%TYPE
    );
    
    v_emp1 emp_rec;
    v_emp2 emp_rec;
    v_emp3 emp_rec;
BEGIN
    v_emp1.empno := 9000;
    v_emp1.ename := '홍길동';
    v_emp2 := v_emp1;
    
    SELECT empno, ename INTO v_emp3
    FROM emp
    WHERE empno = 7788;
    
    DBMS_OUTPUT.PUT_LINE('EMP3 NO: '||v_emp3.empno || ', NAME: '||v_emp3.ename);
END;

4. 제약사항

- 사용장소

  1) SELECT문의 INTO절

  2) UPDATE문의 SET ROW 절에서의 =의 오른쪽

  3) INSERT문의 VALUES절

  4) RETURNING절의 INTO 서브절

- 레코드는 SELECT 리스트, WHERE절, GROUP BY절, ORDER BY절에서 사용 불가능

 

 

※ 출처: 개발자를 위한 PL/SQL 프로그래밍

반응형

'프로그래밍' 카테고리의 다른 글

Oracle PL/SQL - 동적 SQL  (0) 2021.09.24
Oracle PL/SQL - Cursor  (0) 2021.09.24
Oracle PL/SQL - Collection  (0) 2021.09.23
Eclipse Spring Package - Git 연동  (0) 2021.08.14
[MyBatis] ORM 프레임워크 활용(1)  (0) 2021.07.06