개발일기/Oracle
Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 (레코드,컬렉션)
민장미
2023. 5. 15. 23:32
오라클 학습용 계정 scott 로그인:
PL/SQL: 레코드와 컬렉션
연습문제 page 458
1번은 쉬웠는데 2번에서 ㅠㅠㅠ 결국 GPT의 도움을 받았다.
레코드를 생성한 다음 그 레코드로 이루어진 연관 배열 만들고,
실행 절에 EMP테이블의 행을 하나씩 연관배열에 저장하고,
그걸 출력하는 루프문 만드는건 알았는데,
루프문 조건식을 제대로 못쓰는 바람에 ㅜㅠㅠㅜㅜㅜ 푸는 방법은 문제 보자마자 알았으니 된 걸로...
2번문제:
DECLARE
--먼저 레코드부터 생성 EMP테이블의 열을 그대로
TYPE EMP_RECORD IS RECORD(
EMPNO EMP.EMPNO%TYPE,
ENAME EMP.ENAME%TYPE,
JOB EMP.JOB%TYPE,
MGR EMP.MGR%TYPE,
HIREDATE EMP.HIREDATE%TYPE,
SAL EMP.SAL%TYPE,
COMM EMP.COMM%TYPE,
DEPTNO EMP.DEPTNO%TYPE);
--레코드를 담는 연관배열 생성 (테이블형태)
TYPE RECORD_ARR IS TABLE OF EMP_RECORD
INDEX BY PLS_INTEGER;
IDX PLS_INTEGER :=1;
REC RECORD_ARR; -- 연관배열 변수 선언
BEGIN
--EMP테이블의 행을 REC에 저장
FOR EMP IN (SELECT*FROM EMP) LOOP
--REC(IDX) = EMP 행 하나
REC(IDX).EMPNO := EMP.EMPNO;
REC(IDX).ENAME := EMP.ENAME;
REC(IDX).JOB := EMP.JOB;
REC(IDX).MGR := EMP.MGR;
REC(IDX).HIREDATE := EMP.HIREDATE;
REC(IDX).SAL := EMP.SAL;
REC(IDX).COMM := EMP.COMM;
REC(IDX).DEPTNO := EMP.DEPTNO;
IDX := IDX+1; --증감식
END LOOP;
--REC에 저장된 모든 데이터를 출력
FOR I IN 1..IDX-1 LOOP
DBMS_OUTPUT.PUT_LINE(
REC(I).EMPNO ||' : '||
REC(I).ENAME ||' : '||
REC(I).JOB ||' : '||
REC(I).MGR ||' : '||
TO_CHAR(REC(I).HIREDATE,'YY/MM/DD')||' : '||
REC(I).SAL ||' : '||
REC(I).COMM ||' : '||
REC(I).DEPTNO
);
END LOOP;
END;
/
1번 문제: 출력화면은 없음 걍 테이블 조회해서 데이터 잘 들어갔는지 확인 하면 됌
SERVEROUTPUT ON;
CREATE TABLE EMP_RECORD AS SELECT*FROM EMP WHERE 1=0;
DECLARE
TYPE EMP_RECORD IS RECORD(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2));
--변수
EMP_R EMP_RECORD;
BEGIN
EMP_R.EMPNO := 1111;
EMP_R.ENAME := 'TEST_USER';
EMP_R.JOB := 'TEST_JOB';
EMP_R.HIREDATE := TO_DATE('18/03/01','YY-MM-DD');
EMP_R.SAL := 3000;
EMP_R.COMM := NULL;
EMP_R.DEPTNO := 40;
INSERT INTO EMP_RECORD VALUES EMP_R;
END;
/
SELECT*FROM EMP_RECORD;
ROLLBACK