«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

Do it! 오라클로 배우는 데이터베이스 입문 : 연습문제 (레코드,컬렉션) 본문

개발일기/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