728x90
반응형

레퍼런스 타입 (=참조자료형)

- 레퍼런스변수 : DB테이블의 특정 칼럼으로 변수 타입을 지정할 때 사용
- 테이블에서 컬럼의 자료형이 변경되더라도, PL/SQL에서의 변수 선언 부분을 수정할 필요가 없다는 장점이 있다.
TYPE
- 컬럼 타입 선언, 컬럼(열, 칸, 필드, 항목, 속성) 단위
- 테이블이름.필드명%TYPE
ex) V_EMPNO EMP.EMPNO%TYPE => NUMBER(4, 0)
--한 개의 값

ROWTYPE
- 레코드 타입 선언, 레코드(행, 줄, 로우) 단위
- 테이블이름%ROWTYPE
ex) V_EMP EM%ROWTYPE :
--한 줄의 객체

%TYPE

--[%TYPE]
DECLARE 
    VEMPNO EMP.EMPNO%TYPE; --NUMBER(4,0)
    VENAME EMP.ENAME%TYPE; --VARCHAR2(10 BYTE)
    VDEPTNO DEPT.DEPTNO%TYPE; --NUMBER(2,0)
    VDNAME DEPT.DNAME%TYPE; --VARCHAR2(14 BYTE)
BEGIN
    --여러 줄을 받는 쿼리문인 경우 에러, ROW값 1개만 받을 수 있다.
    SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
    INTO vempno, vename, vdeptno, vdname
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO AND E.ENAME ='SMITH';
    
    DBMS_OUTPUT.PUT_LINE('사번/이름/부서번호/부서명');
    DBMS_OUTPUT.PUT_LINE('---------------------');
    DBMS_OUTPUT.PUT_LINE(VEMPNO||'/'||VENAME||'/'||VDEPTNO||'/'||VDNAME);
END;
사번/이름/부서번호/부서명
---------------------
7369/SMITH/20/RESEARCH

%ROWTYPE

DECLARE 
    VEMP EMP%ROWTYPE; 
    VDEPT DEPT%ROWTYPE;
BEGIN
    --여러 줄을 받는 쿼리문인 경우 에러, ROW값 1개만 받을 수 있다.
    --JOIN이 포함된 SELECT절에 컬럼명을 지정해줘야 한다.
    SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
    INTO VEMP.EMPNO, VEMP.ENAME, VDEPT.DEPTNO, VDEPT.DNAME
    FROM EMP E, DEPT D
    WHERE E.DEPTNO = D.DEPTNO AND E.ENAME ='SMITH';
    
    DBMS_OUTPUT.PUT_LINE('사번/이름/부서번호/부서명');
    DBMS_OUTPUT.PUT_LINE('---------------------');
    DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||VEMP.ENAME||'/'||VDEPT.DEPTNO||'/'||VDEPT.DNAME);
END;​
사번/이름/부서번호/부서명
---------------------
7369/SMITH/20/RESEARCH​

%TYPE

DECLARE
    V_DNAME DEPT.DNAME%TYPE :=0;
    V_DEPTNO DEPT.DEPTNO%TYPE :=0;
BEGIN
    V_DEPTNO := ROUND(DBMS_RANDOM.VALUE(10,40),-1);
    SELECT DEPTNO, DNAME INTO V_DEPTNO, V_DNAME  FROM DEPT
    WHERE DEPTNO = V_DEPTNO;
    
    DBMS_OUTPUT.PUT_LINE('부서번호: '||V_DEPTNO);
    
    CASE V_DEPTNO WHEN 10 THEN
        DBMS_OUTPUT.PUT_LINE('ACCOUNTING');
    WHEN 20 THEN
        DBMS_OUTPUT.PUT_LINE('RESEARCH');
    WHEN 30 THEN
        DBMS_OUTPUT.PUT_LINE('SALES');
    ELSE    
        DBMS_OUTPUT.PUT_LINE('OPERATIONS');
    END CASE; --BEGIN문 안쪽에서 직접 기술할 경우는 CASE생략 불가
END;
부서번호: 30
SALES

%ROWTYPE

DECLARE
    -- %ROWTYPE 속성으로 로우를 저장할 수 있는 레퍼런스 변수 선언
    VEMP EMP%ROWTYPE;
    ANNSAL NUMBER (7,2);
BEGIN
    --여러 줄을 받는 쿼리문인 경우 에러, ROW값 1개만 받을 수 있다.
    SELECT * INTO VEMP FROM EMP
    WHERE ENAME = 'SMITH';
    
    --변수를 테이블의 %ROWTYPE으로 하였기에
    --각 컬럼명으로 접근시에는 변수명.컬럼명으로 접근할 수 있다.
    IF VEMP.COMM IS NULL THEN
        VEMP.COMM :=0;
    END IF;
    
    --소수점 둘째 자리수에서 반올림 됨.
    ANNSAL := VEMP.SAL *12 +1.156 + VEMP.COMM;
    
    DBMS_OUTPUT.PUT_LINE('사번/이름/연봉');
    DBMS_OUTPUT.PUT_LINE('-------------');
    --자바의 객체 개념과 유사
    DBMS_OUTPUT.PUT_LINE(VEMP.EMPNO||'/'||VEMP.ENAME||'/'||ANNSAL);
END;​
사번/이름/연봉
-------------
7369/SMITH/9601.16

 

728x90
반응형

+ Recent posts