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
반응형
'[ORACLE]' 카테고리의 다른 글
[ORACLE] PL/SQL - LOOP, FOR LOOP, WHILE LOOP (0) | 2024.01.25 |
---|---|
[ORACLE] IF ~ ELSIF~ ELSE조건문 (0) | 2024.01.25 |
[ORACLE] PL/SQL - ANOYMOUS BLOCK, (0) | 2024.01.24 |
[ORACLE] 집합연산자 UNION, UNION ALL, INTERSECT, MINUS (0) | 2024.01.24 |
[ORACLE] MERGE (0) | 2024.01.23 |