1. 데이터 모델

47
CopyRight by S. Y. Jeong 오오오오 1 . 오오오 오오 클클클클클클 클클클클 클클클클클 클클클클클 클클클 클클클 클클 클클클 클클클 클클클 클클 클클 클클클클 클클클 클클클 2. 오오오 오오 오오 EMPLOYEE #* 클클 * 클클 o 클클 DEPARTMENT #* 클클 * 클클 o 클클 ⊙ 클클클클 클클 클클클 클클클 클클클 클클 클클클클클 클클 ⊙ 클클클클 클 ) 클클 클클클클클 클 클클클 클클클클클 . ⊙ 클클클 : 클클클 클클클 클클 클클클 클클 클클클클 ( 클 : 클클 , 클클 , 클클클 ) ⊙ 클 클 : 클클클클 클클클클클 클클클클 클클 ( 클 : 클클클클클 클클클클 클클 , 클클 , 클클 , 클클클 , 클클클클클클 클 클 클클 .) ⊙ 클 클 : 클클 클클클클 클클클 클클클클 클클클클클 클클클 클클클 ( 클 : 클클클 클클 ) ⊙ 클 클 : - 클클클클 클클클 클클클 클클 - 클클클 클클클 클클클 - 클클 클클클 클클 클클클 클클클클 클클 ( 클 : * 클 o) ⊙ 클 클 : Primary Key, Foreign Key

Upload: amela-herring

Post on 03-Jan-2016

137 views

Category:

Documents


7 download

DESCRIPTION

1. 데이터 모델. 클라이언트 모델의 엔티티 모델. 엔티티 모델의 테이블 모델. 클라이언트가 생각하는 시스템모델. 서버. 디스크에 저장된 테이블. 2. 엔티티 관계 모델. EMPLOYEE #* 번호 * 이름 o 직위. DEPARTMENT #* 번호 * 이름 o 위치. ⊙ 업무사양 또는 설명을 토대로 엔티티 관계 다이어그램 생성 ⊙ 시나리오 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

1

1. 데이터 모델

클라이언트가생각하는 시스템모델

클라이언트 모델의엔티티 모델

엔티티 모델의테이블 모델

서버

디스크에 저장된테이블

2. 엔티티 관계 모델

EMPLOYEE #* 번호 * 이름 o 직위

DEPARTMENT #* 번호 * 이름 o 위치

⊙ 업무사양 또는 설명을 토대로 엔티티 관계 다이어그램 생성⊙ 시나리오 예 ) 사원 한명이상을 한 부서에 할당합니다 .

⊙ 엔티티 : 알려질 필요가 있는 정보에 대한 주요사항 ( 예 : 부서 , 사원 , 원장등 )⊙ 속 성 : 엔티티를 설명하거나 제한하는 사항 ( 예 : 사원이라는 엔티티는 사번 , 이름 , 직위 , 입사일 , 부서코드등이 될 수 있다 .)⊙ 관 계 : 선택 가능성과 등급을 나타내는 엔티티간의 명명된 연관성 ( 예 : 사원과 부서 )

⊙ 규 칙 : - 하나뿐인 고유한 엔티티 이름 - 엔티티 이름은 대문자 - 필수 속성과 선택 속성을 구분하여 표기 ( 예 : * 나 o)⊙ 기 타 : Primary Key, Foreign Key

Page 2: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

2

3. SQL 문

SELECT 데이터 검색

INSERTUPDATE DML( 데이터 조작어 )DELETE

CREATEALTERDROP DDL( 데이터 정의어 )RENAMETRUNCATE

COMMITROLLBACK TCL( 트랜잭션 제어 )SAVEPOINT

GRANTREVOKE DCL( 데이터 제어 )

▣ 기본 SELECT 문 SELECT [DISTINCT] {*, column [alias], …..} FROM table ;

▣ SQL 문 작성 ▪ SQL 문은 대소문자 구분안함 ▪ SQL 문은 하나이상의 행에 입력할 수 있다 . ▪ 키워드 ( 예약어 ) 는 약어로 쓰거나 다음행에 나눠쓸 수 없다 . ▪ 절은 일반적으로 서로 다른 행에 쓴다 . ▪ 탭과 들여쓰기를 사용하면 좀 더 읽기 쉬운 코드를 작성할 수 있다 .

▣ SQL 문 실행 ▪ 마지막 절의 끝에 세미콜론 (;) 을 입력한다 . ▪ 버퍼의 마지막 행에 슬래시 (/) 를 입력한다 . ▪ SQL 프롬프트에 슬래시 (/) 를 입력한다 . ▪ SQL 프롬프트에서 SQL*Plus RUN 명령을 실행한다 .

▣ 모든 열 선택 SELECT * FROM dept;

Page 3: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

3

▣ 특정 열 선택 SELECT deptno, dept_name FROM dept ; ▣ 열 머리글 기본값 ▪ 기본 맞춤 - 왼 쪽 : 날짜 및 문자 데이터 - 오른쪽 : 숫자 데이터 ▪ 기본표시 : 대문자 ▣ 산술식 ▪ SQL 문에서는 FROM 절을 제외한 모든 절에서 산술연산자를 사용할 수 있다 . ▪ 연산자 : *, /, +, - SELECT ename, gikgub, sal, (sal + 1000) * 10 FROM emp WHERE sal > gikgub * 10000 ; ▣ 널 (NULL) 값 정의 ▪ NULL 값은 알 수 없는 값으로서 사용 , 할당 및 작용 불가 . ▪ NULL 은 0 또는 공백 (SPACE) 와 다름 . ▣ 산술식의 널 값 ▪ NULL 값의 산술식은 NULL 값 ▣ 열 별칭 정의 (ALIAS) ▪ 열 머리글 이름 변경 ▪ 계산시 유용 ▪ 열 이름 바로 다음에 AS 키워드 사용 ▪ 공백 또는 특수문자가 있거나 대소문자 구분시 큰 따옴표 사용 SELECT ename AS name, sal salary FROM emp ; ▣ 연결 연산자 ▪ 열 또는 문자열 연결 ▪ 두개의 세로선 (||) 으로 연결 ▪ 문자식인 결과 열을 생성합니다 . SELECT ename || job as employee FROM emp; ▣ 리터럴 문자열 ▪ 리터럴은 SELECT 목록에 포함된 문자 , 숫자 또는 날짜임 ▪ 날짜 및 문자 리터럴 값은 작은 따옴표 사용 ▪ 각 문자열은 각 행이 반환될 때마다 한번 출력됨 SELECT ename || ‘ is a ‘ || job FROM emp ; ▣ 중복행 제거 SELECT 절에서 DISTINCT 키워드를 사용하여 중복행 제거 SELECT DISTINCT deptno FROM emp;

Page 4: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

4

▣ SQL*PLUS ▪ SQL*PLUS LOGIN ▪ TABLE 구조 표시 ▪ SQL 문 편집 ▪ SQL*PLUS 에서 SQL 을 실행 ▪ 저장한 파일 실행 ▪ 파일에서 버퍼로 명령을 로드하여 편집▣ TABLE 구조표시 ▪ DESC tablename ▪ DATA TYPE

▣ SQL*PLUS 편집 명령 ▪ A[PPEND] text : text 를 현재 행의 끝에 추가 ▪ C[HANGE] /old/new : 현재 행에서 old 텍스트를 new로 바꿈 ( 공백없이 ) ▪ C[HANGE] / text / : 현재 행에서 text 를 삭제 ▪ CL[EAR] BUFF[ER] : SQL 버퍼에서 모든 행을 삭제 ▪ DEL : 현재 행 삭제 ▪ DEL n : n 행 삭제 ▪ DEL m n : m 행부터 n 행까지 삭제 ▪ I[NPUT] : 행 수에 제한없이 삽입 ▪ I[NPUT] text : 현 행 다음에 text 를 구성하는 한 행을 삽입 ▪ L[IST] : SQL 버퍼의 모든 행을 나열 ▪ L[IST] n : 한 행을 나열 ▪ L[IST] m n : 행의 범위 나열 ▪ R[UN] : 버퍼의 현재 SQL 문을 나열하고 실행 ▪ n : 현재 행으로 만들 행 지정 ▪ n text : n 행을 text 로 바꿈 ▪ 0 text : 1 행 앞에 한 행 삽입 ▪ 현재 행 끝에 하이픈 (-) 을 입력하여 다음행에 계속▣ SQL*Plus 파일 명령 ▪ SAV[E] filename : SQL 버퍼의 현재 내용을 파일에 저장 . APPEND / REPLACE ▪ GET filename : 저장한 파일 내용을 버퍼에 Load ▪ STA[RT] filename : 이전에 저장한 파일 실행 ▪ @ filename : START 와 동일 ▪ ED[IT] : 편집기를 호출하여 afiedt.buf라는 파일에 버퍼내용 저장 ▪ ED[IT] [filename] : 편집기를 호출하여 저장된 파일의 내용을 편집 ▪ SPO[OL] [filename | OFF | OUT] : 질의 결과를 파일에 저장 . OFF 는 스풀파일을 닫고 OUT 은 스풀파일 닫은 후 파일결과를 Print.

NUMBER(p,s) 최대자릿수 p 소수점 s째 자리까지 표기하는 숫자값VARCHAR2(s) 최대 크기가 s 인 가변 길이 문자 값DATE 날짜 및 시간 값CHAR(s) 크기가 s 인 고정길이 문자 값

Page 5: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

5

4. 데이터 제한 및 정렬▣ WHERE 절 사용 ▪ FROM 절 다음에 기술▣ 문자열 및 날짜 ▪ 문자열 및 날짜값은 작은 따옴표 사용 ▪ 문자 값은 대소문자를 구분하며 날짜 값은 형식을 구분 ▪ 기본 날짜 형식은 DD-MON-YY▣ 비교 연산자 ▪ =, >, >=, <, <=, <> ▪ BETWEEN ~ AND ~ , IN(list), LIKE, IS NULL ▪ IN 은 OR 조건과 같다 (단지 Logic 을 간단하게 표현 ) ▪ LIKE 연산자는 “ %” 또는 “ _”를 사용 ( 대소문자 구분 ) ‘▪ _’를 문자열로 인식하고 싶을때 ‘ _’ 앞에 역 슬래쉬 사용 ▪ AND, OR, NOT 연산자 ( NOT IN, NOT BETWEEN ~ , NOT LIKE, IS NOT NULL ) SELECT emp_no, emp_name, salary FROM emp_table WHERE dept in (‘4620’,’4718’) AND salary BETWEEN 1000 AND 1500 AND emp_name LIKE ‘정 %’ AND penalty IS NULL ; ▪ 연산자 우선순위 ( 모든 비교연산자 , NOT, AND, OR )

예제 1) SELECT ename, job, sal FROM emp WHERE job = ‘SALEMAN’ OR job = ‘PRESIDENT’ AND sal > 1500 ;

예제 2) SELECT ename, job, sal FROM emp WHERE (job = ‘SALEMAN’ OR job = ‘PRESIDENT’) AND sal > 1500 ;

해설 : 예제 1 은 우선순위에 의해 PRESIDENT 이면서 봉급이 1500 보다 크거나 SALEMAN 인 데이타 1. 비교 연산자 봉금 1500 보다 큰 조건 실행 2. AND 연산자 PRESIDENT 실행 3. OR 조건 SALEMAN 실행

예제 2 는 SALEMAN 이거나 PRESIDENT 이면서 봉급이 1500 보다 큰 데이타

Page 6: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

6

▣ ORDER BY 절 ▪ ASC : 오름차순 , 기본값 ▪ DESC : 내림차순 ▪ ORDER BY 절은 SELECT 문의 가장 끝에 위치 ▪ Let the students know that you can also sort by a column number in the SELECT list. SELECT ename, sal FROM emp ORDER BY sal desc ; => ORDER BY 2 DESC ; ▪ Alias 명으로 정렬 가능 ▪ 여러 컬럼이 정렬될때 OREDR BY 절에 기술한 순서로 정렬됨

5. 단일행 함수

▣ 문자 함수 ▪ LOWER : 알파벳 값을 소문자로 변환 ▪ UPPER : 알파벳 값을 대문자로 변환 ▪ INITCAP : 알파벳 값의 첫 문자를 대문자로 변환 ▪ CONCAT : 첫번째 문자 값을 두번째 문자값과 연결 ( = CONCAT ) ▪ SUBSTR : 문자 값의 위치 m 에서 n까지 지정된 문자를 반환 (m < 0 면 문자 끝에서부터 ) ▪ LENGTH : 값의 문자수 반환 ▪ INSTR : 명명된 문자의 위치를 반환 ▪ LPAD : 전체 길이가 n 인 문자열 값을 오른쪽 정렬하고 나머지 공간은 선택한 문자로 채운다 . ( RPAD ) ▪ TRIM : 문자열에서 머리글이나 꼬리말 또는 모두 자를 수 있다 .

SELECT ename, concat(ename, job), length(ename), instr(ename, ‘A’) FROM emp WHERE substr(job, 1, 5) = ‘SALES’ ;

함 수 결 과

CONCAT(‘Good’, ‘String’) GoodString

SUBSTR(‘String’, 1, 3) Str

LENGTH(‘String’) 6

INSTR(‘String’, ‘r’) 3

LPAD(sal, 10, ‘*’) ******5000

TRIM(‘S’ FROM ‘SSMITH’) MITH

Page 7: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

7

▣ 숫자 함수 ▪ ROUND : 지정한 소수점 자리로 값을 반올림 . ROUND(45.926, 2) => 45.93 ▪ TRUNC : 지정한 소수점 자리까지 남기고 값을 버림 . TRUNC(45.926, 2) => 45.92 ▪ MOD : 나눗셈의 나머지 반환 . MOD(1600, 300) => 100▣ 날짜 사용 ▪ SYSDATE : 날짜와 시간을 반환하는 함수 ▪ DUAL : Dummy Table ▪ 날짜 계산에 산술식 사용 가능 ▪ MONTHS_BETWEEN : 두 날짜간의 달 수 ▪ ADD_MONTHS : 날짜에 달 수 더하기 ▪ NEXT_DAY : 지정한 날짜의 다음 날 ▪ LAST_DAY : 해당 달의 마지막 날 ▪ ROUND : 날짜 반올림 ▪ TRUNC : 날짜 버림

▣ 암시적 데이터 유형 변환 ▪ 할당문에 사용되는 값의 데이터 유형을 할당 대상의 데이터 유형으로 변환 ▪ VARCHAR2 또는 CHAR => NUMBER ▪ VARCHAR2 또는 CHAR => DATE ▪ NUMBER => VARCHAR2 ▪ DATE => VARCHAR2

함 수 결 과

MONTHS_BETWEEN(’01-SEP-95’,’11-JAN-94’) 19.6774194

ADD_MONTHS(’11-JAN-94’, 6) 11-JUL-94

NEXT_DAY(’01-SEP-95’, ‘FRIDAY’) 08-SEP-95

LAST_DAY(’01-SEP-95’) 30-SEP-95

ROUND(’25-JUL-95’, ‘MONTH’) 01-AUG-95

ROUND(’25-JUL-95’, ‘YEAR’) 01-JAN-96

TRUNC(’25-JUL-95’, ‘MONTH’) 01-JUL-95

TRUNC(’25-JUL-95’, ‘YEAR’) 01-JAN-95

Page 8: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

8

▣ 명시적 데이터 유형 변환

▪ TO_CHAR(date, ‘format’)

YYYY : 네자리년도 , YEAR : 년도 ( 문자 ), MM : 두자리 값으로 나타낸 달

MONTH : 달 전체이름 ( 문자 ), DY : 영문요일 ( 세자약어 ), DAY : 요일 전체 이름

HH24:MI:SS AM => 15:45:32 PM, DD “of” MONTH => 12 of OCTOBER

ddspth : 일자를 문자로 표기 => fourteenth

▪ TO_CHAR(number, ‘fmt’)

9 : 숫자를 표시 0: 0 를 강제로 표시 $ : 부동 $ 기호를 넣습니다

L : 부동 지역 통화기호를 사용 . : 소수점 출력 , : 천단위 구분자 사용

MI : 오른쪽에 음수표시 PR : 음수를 괄호로 표시 B : 0 값대신 공백으로 표시

▣ NVL 함수

▪ NVL(comm, 0) NVL(hiredate, ‘19990101’) NVL(name, ‘jsy’)▪ ▪

▪ 산술 연산시 NULL 값의 계산은 NULL 로 나오기 때문에 반드시 숫자로 변환

▣ DECODE 함수

▪ CASE 또는 IF-THEN-ELSE 문의 역할

SELECT name, sal,

DECODE(TRUNC(sal/1000, 0), 0, 0.00,

1, 0.09,

2, 0.20,

3, 0.30,

0.40) TAX_RATE

FROM emp ;

Page 9: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

9

6. 여러 테이블의 데이터 표시▣ 조인 (JOIN) 이란

▪ 여러 테이블의 데이터를 질의합니다 .

▪ WHERE 절에서 조인 조건을 작성

▪ 동일한 열 이름이 여러 테이블에 있는 경우 열 이름에 테이블 이름 사용

▣ 카티시안 곱

▪ 생성 조건 : 1. 조인조건 생략시 2. 조인 조건이 부적합한 경우

3. 첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인된 경우

▣ 조인유형

▪ 등가조인 : 기본키와 외래키 (foreign 키 ) 의 조인 . 확실히 식별 가능

▪ 비등가조인 : BETWEEN 이나 <=, >= 를 사용하여 검색 . 데이터는 중복되어 SELECT 안됨

▪ 포괄조인 (OUTJOIN) : 1. 포괄 조인 연산자는 더하기 기호 (+)

2. 정보가 부족한 테이블에 (+) 를 부친다 .

3. OUTJOIN 을 포함하는 조건은 IN 연산자를 사용할 수 없다 .

▪ 자체조인 : 자기 테이블 끼리 조인 .

7. 그룹함수를 사용한 집계

▣ 그룹함수의 종류

▪ AVG : 값의 평균이며 널 값은 무시 . 널 행수 포함 평균 계산시 NVL 함수 사용

▪ COUNT : 행 수 . COUTN(*) -> 널 값 포함 ,

COUNT( [DISTINCT] column_name) -> null 값은 무시함 [중복무시 ]

▪ MAX : 컬럼의 최대값

▪ MIN : 컬럼의 최소값

▪ STDDEV : 표준편차

▪ SUM : 컬럼의 합계값이며 널 값 무시

▪ VARIANCE : 분산이며 널 값 무시

SELECT AVG(nvl(sal, 0))

SELECT COUNT(DISTINCT e_name)

SELECT MAX(sal) SELECT STDDEV(sal) SELECT VARIANCE(sal)

Page 10: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

10

▣ 데이터 그룹 생성

▪ GROUP BY 절 사용

▪ 그룹함수외에 다른 컬럼 SELECT 시 반드시 GROUP BY 절 사용해야함 .

▪ GROUP BY 열을 SELECT 목록에 포함시키지 않아도 됨

SELECT AVG(sal) FROM emp GROUP BY deptno ;

▪ WHERE 절을 사용하여 그룹을 제한할 수 없음 .

오류 ) SELECT deptno, avg(sal) FROM emp WHERE avg(sal) > 2000 groupby deptno;

정정 ) select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000 ;

▪ HAVING 절 사용하여 GROUP BY 절을 제외시킬 수 있음

SELECT job, sum(sal)

FROM emp

WHERE job NOT LIKE ‘sales%’

GROUP BY job

HAVING sum(sal) > 5000

ORDER BY SUM(sal) ;

8. 하위 질의▣ 하위 질의 사용 지침

▪ 하위 질의를 괄호로 묶는다

▪ 비교 연산자의 오른쪽에 하위 질의를 넣는다

▪ 하위 질의에는 ORDER BY 절을 추가하지 마십시오 . 하나의 SELECT 문에는 하나의

ORDER BY 절을 사용할 수 있음 .

▪ 단일 행 하위질의에는 단일행 연산자를 사용한다 .

▪ 여러 행 하위 질의에는 여러 행 연산자를 사용한다 .

▣ 하위 질의 유형

▪ WHERE 절이나 HAVING 절에 조건으로 SUBQUERY 사용 .

▪ 비교 연산자 사용시 SUB QUERY 에서 RETURN 하는 값이 단일값이여야 함 .

SELECT deptno, MIN(sal) FROM emp GROUP BY deptno

HAVING MIN(sal) > ( SELECT MIN(sal)

FROM emp WHERE deptno = 20 ) ;

Page 11: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

11

▣ 여러 행의 하위질의

▪ 여러 행을 반환

▪ 여러 행 비교 연산자 사용

▪ IN

SELECT ename, sal, deptno

FROM emp

WHERE sal IN ( SELECT MIN(sal) FROM emp GROUP BY deptno ) ;

▪ ANY

SELECT empno, ename, job

FROM emp

WHERE sal < ANY ( SELECT sal FROM emp WHERE job = ‘CLERK’)

AND job <> ‘CLERK’ ;

하위질의 값이 950, 800, 1300 일때 이 쿼리는 1300 보다 적은 사무원이 아닌 사원표시 .

- < ANY 는 최대값보다 적음 . > ANY 는 최소값보다 큼 . = ANY 는 IN 과 동일 .

▪ ALL

< ALL 은 최소값보다 적음 . > ALL 는 최대값보다 큼 .

▣ 여러 열 하위 질의 사용

▪ 쌍 비교

SELECT ordid, prodid, qty

FROM item

WHERE (prodid, qty) IN ( SELECT prodid, qty

FROM item

WHERE ordid = 605 )

AND ordid <> 605 ;

▪ 비쌍 비교

SELECT ordid, prodid, qty

FROM item

WHERE prodid IN ( SELECT prodid FROM item WHERE ordid = 605 )

AND qty IN ( SELECT qty FROM item WHERE ordid = 605)

AND ordid <> 605 ;

Page 12: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

12

9. 출력관련▣ & 치환변수 ▪ 앰퍼샌드 (&) 가 접두어로 붙은 변수를 사용하여 사용자에게 값을 묻습니다 . SELECT empno, ename FROM emp WHERE empno = &employee_num ;

▪ SET VERIFY 명령 사용 : SQL*PLUS 가 치환변수를 값으로 바꾸기 전후의 명령 텍스트 표시를 토글 SQL> select * 2 from bdjmst 3 where jmcode = ‘&in_jmcode’ ; Enter value for in_jmcode: kkk old 3: where jmcode = &in_jmcode new 3: where jmcode = 'kkk'

▪ 치환변수의 타입이 스트링시 작은 따옴표로 묶어야 하며 UPPER 와 LOWER 와 같은 함수도 사용 가능 . 예 ) UPPER(‘&job_title’)

▪ 치환 변수에 사용할 수 있는 항목 - WHERE 조건 - ORDER BY 절 - 열 표현식 - 테이블 이름 - 전체 SELECT 문 SQL> select jmcode, s_jmname 2 from &table 3 where &conditon 4 order by &order_column SQL> / Enter value for table: bdjmst old 2: from &table new 2: from bdjmst Enter value for conditon: jmcode = 'kkk' old 3: where &conditon new 3: where jmcode = 'kkk' Enter value for order_column: jmcode old 4: order by &order_column new 4: order by jmcode

Page 13: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

13

▣ && 치환변수 사용 ▪ 같은 변수 값을 사용하고자 할때 한번만 입력하고 나머지는 재 사용할때 사용 SELECT jmcode, &&column FROM bdjmst ORDER BY &column ; 단 , WHERE 조건에 &를 사용하고 SELECT 문에는 &&를 사용한다 .

▣ 사용자 변수 정의 ▪ DEFINE : CHAR 데이터 유형의 사용자 변수 생성 ▪ ACCEPT : 사용자 입력 내용을 읽어 변수로 저장 ▪ 공백을 포함하는 변수를 미리 정의하려면 DEFINE 명령을 사용할때 그 값을 작은 따옴표로 묶어야 한다 .▣ ACCEPT 명령 ▪ 사용자 입력을 받아 들일 때 사용자가 정의하는 프롬프트를 생성 ▪ NUMBER 또는 DATE 데이터 유형의 변수를 명시적으로 정의 ▪ 보안상의 이유로 사용자 입력을 숨김 ▪ ACCEPT variable [datatype] [FORMAT format] [PROMPT text] [HIDE] SQL> accept in_order prompt 'sorted column: ' sorted column: s_jmname SQL> select jmcode, s_jmname 2 from bdjmst 3 where rownum <= 10 4 order by &in_order SQL> / JMCODE S_JMNAME ------------ ------------------ KR3201014K10 국민카드 426▣ DEFINE 및 UNDEFINE 명령 ▪ 정의된 변수는 다음과 같은 경우에 손실됨 - UNDEFINE 명령을 사용하여 변수를 지운 경우 - SQL*Plus 를 종료한 경우 ▪ DEFINE 명령으로 변경내용을 확인할 수 있습니다 . ▪ 모든 세션에 대해 변수를 정의하려면 시작 시 변수가 생성되도록 login.sql 파일을 수정하십시요▣ DEFINE 명령 사용 SQL> define in_order = s_jmname SQL> select jmcode, s_jmname 2 from bdjmst 3 where rownum <= 10 4 order by &in_order 5 / old 4: order by &in_order new 4: order by s_jmname ……… 10 rows selected.

Page 14: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

14

▣ DEFINE 명령으로 변경된 내용 확인 SQL> define in_order DEFINE IN_ORDER = "s_jmname" (CHAR) ▣ 사용자가 SQL*Plus 환경 정의 ▪ SET 명령을 사용하여 현재 SESSION 제어 SET system_variable value ▪ SHOW 명령을 사용하여 설정한 내용을 확인 SQL> show echo ▪ SET 명령변수

▣ 사용자가 정의한 내용을 login.sql 파일에 저장 ▪ login.sql 파일은 로그인 시 구현되는 표준 SET 및 기타 SQL*Plus 명령을 포함합니다 . ▪ login.sql 을 수정하여 추가 SET 명령을 포함할 수 있습니다 . ▣ COLUMN 명령 ▪ 형식 : COL[UMN] [ {column|alias} [option] ] ▪ 옵션 - CLE[AR] : 열 형식을 지움 - FOR[MAT] format : 형식 모델을 사용하여 열 표시를 변경함 - HEA[DING] text : 열 머리글을 설정 - JUS[TIFY] {align} : 열 머리글 왼쪽 , 가운데 또는 오른쪽 정렬 - NOPRI[NT] : 열을 숨김 - NUL[L] text : 널 값으로 표시되는 텍스트를 지정함 - PRI[NT] : 열을 표시 - TRU[NCATE] : 첫 행 끝에 표시되는 문자열을 잘라 버림 - WRA[PPEND] : 문자열의 끝을 다음 행으로 줄바꿈함

SET 변수 및 값 설 명

ARRAY[SIZE] {20 | n} 데이터베이스 데이터 인출 크기를 설정

COLSEP {_ | text} 열사이에 출력할 텍스트를 설정 ( 기본값은 공백한칸 )

FEED[BACK] {6|n|OFF|ON} 질의가 실행된 후 결과를 표시 . 예 : 10 rows selected.

HEA[DING] {OFF|ON} 보고서에 열 머리글 표시 여부 결정

LIN[ESIZE] {80|n} 보고서에 대한 행 당 문자수를 n 으로 설정

LONG {80|n} LONG 값을 표시하는 최대 너비 설정

PAGES[IZE] {24|n} 출력 페이지당 행 수 지정

PAU[SE] {OFF|ON|text} Row Data 의 터미널 Scroll 제어 (Return Key 시 실행 )

TERM[OUT] {OFF|ON} 화면에 출력결과 표시여부 결정 (? 테스트 시 차이 없음 )

Page 15: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

15

▣ BREAK 명령 사용 ▪ BREAK ON column [|alias|row] [skip n|dup|page] ON .. [ON report] page : 구분 값이 변경될 때 새 페이지로 구분 skip n : 구분 값이 변경될 때 n 개 행을 건너뜀 dup : 중복 값을 표시 ▪ 중복을 제거하고 행을 구분 SQL> BREAK ON ename ON job ▪ 구분 값을 기준으로 행을 구분 SQL> BREAK ON ename SKIP 4 ON job SKIP 2 ▪ CLEAR 명령을 사용하여 모든 BREAK 설정을 지움 SQL> CLEAR BREAK▣ TTITLE 및 BTITLE 명령사용 ▪ 머리글과 바닥글을 표시 TTI[TLE] [text|OFF|ON] ▪ 보고서 머리글을 설정합니다 . SQL> TTITLE ‘Salary|Report’ : 세로선 (|) 을 사용하여 제목의 텍스트를 여러 행에 나눠 쓸 수 있음 . ▪ 보고서 바닥글을 설정 SQL> BTITLE ‘Confidential’▣ 스크립트 파일을 작성하여 보고서 실행 1. SQL SELECT 문을 작성함 : BREAK 를 사용하려면 관련 ORDER BY 절을 포함해야 함 2. SELECT 문을 스크립트 파일에 저장함 3. 스크립트 파일을 편집기로 읽어 들임 4. SELECT 문 앞에 형식 명령을 추가함 5. SELECT 문 다음에 종료 문자가 오는지 확인함 ( ; 이나 / 가 옴 ) 6. SELECT 문 다음에 있는 형식 명령을 지움 7. 변경한 스크립트 파일을 저장 8. SQL*Plus 에서 START 파일이름 또는 @파일이름을 입력하여 스크립트 파일을 실행 ▪ REM 은 SQL*Plus 에서 주 또는 주석을 나타냄

Page 16: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

16

10. 데이터 조작 ▣ 데이터 조작어 ▪ INSERT 문 : 치환 매개변수를 사용하여 대화식 스크립트 가능 (&) : ACCEPT 사용가능 ▪ UPDATE 문 : 여러 열 하위 질의를 사용한 갱신 SQL> UPDATE emp SET (job, deptno) = ( SELECT job, deptno FROM emp WHERE empno = ‘46346’) WHERE job = ( SELECT job FROM emp WHERE empno = ‘46346’ ); ▪ DELETE 문 ▣ 트랜잭션 제어 ▪ COMMIT ▪ SAVEPOINT name : 현재 트랜잭션 내에 저장점을 표시 SQL> UPDATE … SQL> SAVEPOINT update_done ; Savepoint created. SQL> INSERT ….. SQL> ROLLBACK TO update_done ; Rollback complete. ▪ ROLLBACK [TO SAVEPOINT name] : 지정된 저장점으로 롤백

11. 테이블 생성 및 관리 ▣ 데이터베이스 객체 ▪ 테이블 : 기본 저장단위며 행과 열로 구성 ▪ 뷰 : 하나 이상의 테이블에서 데이터 부분집합을 논리적으로 표시 ▪ 시퀀스 : 기본 키 값을 생성 ▪ 인덱스 : 효율적으로 질의할 수 있음 ▪ 동의어 : 객체에 다른 이름을 제공 ▣ 이름 지정 규칙 ▪ 문자로 시작 ▪ 1~30 자까지 가능 ▪ A~Z, a~z, 0~9, _, $, #만 포함해야 합니다 . ▪ 동일한 사용자가 소유한 다른 객체의 이름과 중복되지 않아야 함 ▪ Oracle Server 의 예약어가 아니어야 합니다 . ▣ CREATE TABLE 문 ▪ CREATE TABLE 권한 ▪ 저장 영역이 필요 ▪ 다음을 지정 - 테이블 이름 , 열의 이름 , 데이터 유형 및 크기

Page 17: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

17

CREATE [GLOBAL temporary] TABLE [schemea.]table (column datatype [DEFAULT expr] [, …..]); - GLOBAL TEMPORARY : 테이블을 임시 테이블로 지정하고 테이블 정의를 모든 세션에서 볼 수 있도록 지정 . 임시 테이블의 데이터는 테이블에 데이터를 삽입하는 세션에서만 볼 수 있다 . - schema : 소유자 이름과 동일 - table : 테이블 이름 - DEFAULT expr : INSERT 문에서 값을 생략하면 기본값을 지정 - column : 열 이름 - datatype : 열의 데이터 유형 및 길이 ▪ 테이블 생성 확인 SQL> DESCRIBE dept SQL> DESC dept ▣ 오라클 데이터베이스의 테이블 ▪ 사용자 테이블 - 사용자가 생성 및 유지관리하는 테이블의 모음 - 사용자 정보 포함 ▪ 데이터 딕셔너리 - Oracle Server 가 생성 및 유지관리하는 테이블의 모음 - 데이터베이스 정보를 포함 - 사용자 이름 , 사용자 권한 , 데이터베이스 객체이름 , 테이블 제약조건 , 감사정보 등 포함

▣ 데이터 딕셔너리 질의 ▪ 사용자가 소유한 개별 객체 유형 SQL> SELECT * FROM user_tables ; ▪ 사용자가 소유한 테이블 , 뷰 , 동의어 및 시퀀스를 조회 SQL> SELECT DISTINCT object_type FROM user_objects ; ▪ 사용작 소유한 테이블을 설명 SQL> SELECT * FROM user_catalog ;

접두어 설 명

USER_ 사용자가 소유하는 객체에 관한 정보 포함

ALL_ 사용자가 사용할 수 있는 모든 테이블에 관한 정보 포함

DBA_ 제한된 뷰로 DBA Roll 을 할당 받은 사용자만 액세스할 수 있음

V$_ 동적 성능 뷰 , 데이터베이스 서버 성능 및 잠금에 관한 정보를 포함

Page 18: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

18

▣ 데이터 유형

▣ 하위 질의를 사용한 테이블 생성 ▪ CREATE TABLE 문과 AS subquery 옵션을 결합하여 테이블을 생성하고 행을 삽입 CREATE TABLE table [(column, column, ….)] AS subquery ; ▪ 지정한 열 수를 하위 질의 열 수와 일치 시킴 ▪ 열 이름 및 기본값을 사용하여 열을 정의함 ▣ ALTER TABLE 문 ▪ 새 열 추가 ▪ 새 열의 기본값 정의 ALTER TABLE table ADD (column datatype [DEFAULT expr] [, column datatype] …..); ▪ 기존 열의 데이터 유형 , 크기 및 기본 값을 변경 ▪ 기본 값ㅇ르 변경하면 변경 이후에 테이블에 삽입되는 항목에만 영향을 줌 SQL> ALTER TABLE dept30 MODIFY (ename VARCHAR2(15)); ▪ 테이블에서 더 이상 필요하지 않은 열을 한번에 한번씩 삭제 SQL> ALTER TABLE dept30 DROP COLUMN job ;

데이터 유형 설 명

VARCHAR2(size) 가변 길이 문자 데이터

CHAR(size) 고정 길이 문자 데이터

NUMBER( p, s) 가변 길이 숫자 데이터

DATE 날짜 및 시간 값

LONG 최고 2GB 의 가변 길이 문자 데이터

CLOB 최고 4GB 의 단일 바이트 문자 데이터

RAW 및 LONG RAW 원시 이진 데이터

BLOB 최고 4GB 의 이진 데이터

BFILE 외부파일에 저장된 이진 데이터 ( 최고 4GB)

Page 19: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

19

▣ SET UNUSED 옵션 (Oracle 8. i 에서 사용할 수 있음 ) ▪ SET UNUSED 옵션을 사용하여 하나 이상의 열을 사용되지 않았음으로 표시 ▪ DROP UNUSED COLUMS 옵션을 사용하여 UNUSED 로 표시된 열을 제거 SQL> ALTER TABLE table SET UNUSED (column) ; 또는 ALTER TABLE table SET UNUSED COLUMN column ;

SQL> ALTER TABLE table DROP UNUSED COLUMNS ; ▣ 테이블 삭제 SQL> DROP TABLE dept30 ; ▣ 객체이름 변경 ▪ 테이블 , 뷰 , 시퀀스 또는 동의어의 이름을 변경하려면 RENAME 문을 실행 SQL> RENAME dept TO department ; ▣ 테이블 절단 ▪ 테이블에서 모든 행을 제거 ▪ 해당 테이블이 사용하는 저장 공간을 해제 ▪ TRUNCATE 를 사용한 행 제거 작업은 롤백할 수 없음 SQL> TRUNCATE TABLE department ; ▣ 테이블에 주석 추가 ▪ COMMENT 문을 사용하여 테이블 또는 열에 주석을 추가할 수 있다 ▪ 주석은 데이터 딕셔너리 뷰를 통해 확인 SQL> COMMENT ON TABLE emp IS ‘Employee Information’ ; - ALL_COL_COMMENTS - USER_COL_COMMENTS - ALL_TAB_COMMENTS - USER_TAB_COMMETS

12. 제약조건 포함 ▪ 제약조건은 테이블 레벨로 규칙을 적용 ▪ 제약조건은 종속된 테이블의 삭제를 방지 ▪ 오라클에서 제공하는 제약조건의 유형 - NOT NULL - UNIQUE - PRIMARY KEY - FOREIGN KEY - CHECK ▣ 제약조건의 지침 ▪ 제약조건에 이름지정하지 않으면 SYS_Cn형식의 이름 자동부여 ▪ 제약조건 생성 시기 : 테이블 생성 시 / 테이블 생성 후 ▪ 열 레벨 또는 테이블 레벨로 제약조건 정의 ▪ 데이터 딕셔너리에 있는 제약 조건 조회 (USER_CONSTRAINTS)

Page 20: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

20

▣ 제약 조건 정의 CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [column_constraint], …… [table_constraint] [, ….]) ; CREATE TABLE emp ( emp_no NUMBER(4), ename VARCHAR2(10), …. deptno NUMBER(2) NOT NULL, CONSTRAINT emp_pk PRIMARY KEY (EMP_NO)); ▣ 제약 조건 정의 ▪ 열 제약 조건 레벨 column [CONSTRAINT constraint_name] constraint_type, ▪ 테이블 제약 조건 레벨 column, …. [CONSTRAINT constraint_name] constraint_type (column, …), ▣ NOT NULL 제약 조건 : 해당 열이 널 값을 허용하지 않습니다 . : 예제 ) deptno NUMBER(7,2) NOT NULL, 이나 deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL, ▣ UNIQUE KEY 제약 조건 : 열 또는 열 집합의 모든 값이 고유하도록 지정 SQL> CREATE TABLE dept ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), CONSTRAINT dept_dname_uk UNIQUE(dname)); ▣ PRIMARY KEY 제약 조건 SQL> CREATE TABLE dept ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13), CONSTRAINT dept_dname_uk UNIQUE (dname), CONSTRAINT dept_deptno_pk PRIMARY KEY (deptno)); ▣ FOREIGN KEY 제약 조건 : 참조 무결성 제약 조건은 열 또는 열 조합을 외래키로 지정하고 동일한 테이블이나 다른 테이블에 있는 기본 키 또는 고유 키와의 관계를 설정함 . SQL> CREATE TABLE emp ( empno NUMBER(4), ename VARCHAR2(10) NOT NULL, …… deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno));

Page 21: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

21

▣ FOREIGN KEY 제약 조건 키워드 ▪ FOREIGN KEY : 테이블 제약 조건 레벨로 하위 테이블의 열을 정의 ▪ REFERENCES : 상위 테이블의 열 및 테이블을 나타냄 ▪ ON DELETE CASCADE : 상위 테이블 삭제되면 하위 테이블의 종속 행도 삭제됨 ▣ CHECK 제약 조건 ▪ 각 행이 만족해야 하는 조건을 정의 ▪ 허용되지 않는 표현식 : - CURRVAL, NEXTVAL, LEVEL 및 ROWNUM 의사 열 참조 - SYSDATE, UID, USER 및 USERENV 함수 호출 - 다른 행의 다른 값을 참조하는 질의 …, deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99), … ▣ 제약 조건 추가 ALTER TABLE table ADD [CONSTRAINT constraint] type (column) ; ▪ 제약 조건을 추가 또는 삭제할 수 있지만 수정할 수는 없습니다 . ▪ 제약 조건을 설정 또는 해제합니다 . ▪ MODIFY 절을 사용하여 NOT NULL 제약 조건을 추가합니다 . SQL> ALTER TABLE emp ADD CONSTRAINT emp_mgr_fk FOREIGN KEY (mgr) REFERENCES emp(empno); ▣ 제약 조건 삭제 ▪ EMP 테이블에서 관리자 제약 조건을 삭제 SQL> ALTER TABLE emp DROP CONSTRAINT emp_mgr_fk ; ▪ DEPT 테이블에서 PRIMARY KEY 제약조건을 삭제하고 EMP.DEPTNO 열에서 연관된 FOREIGN KEY 제약 조건을 삭제 SQL> ALTER TABLE dept DROP PRIMARY KEY CASCADE ; ▣ 제약 조건 해제 ▪ ALTER TABLE 문의 DISABLE 절을 실행하여 무결성 제약 조건을 해제합니다 . ▪ CASCADE 옵션을 적용하여 종속 무결성 제약 조건을 해제합니다 . SQL> ALTER TABLE emp DISABLE CONSTRAINT emp_empno_pk CASCADE ; ▣ 제약 조건 설정 ▪ ENALBE 절을 사용하여 현재 테이블 정의에 해제되어 있는 무결성 제약 조건을 설정 SQL> ALTER TABLE emp ENABLE CONSTRAINT emp_empno_pk ; ▣ 계단식 제약 조건 ▪ CASCADE CONSTRAINTS 절은 DROP COLUMN 절과 함께 사용됨 ▪ CASCADE CONSTRAINTS 절은 삭제된 열에 정의된 기본 키와 고유 키를 참조하는 모든 참조 무결성 제약 조건을 삭제함 .

Page 22: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

22

▣ 제약 조건 보기 : USER_CONSTRAINTS 테이블을 질의하여 모든 제약 조건의 정의 및 이름을 조회 SQL> SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table _name = ‘EMP’ ; ▪ C 는 CHECK 를 P 는 PRIMARY KEY 를 R 는 참조 무결성을 U 는 UNIQUE KEY 를 나타냄 ▪ NOT NULL 제약 조건은 사실상 CHECK 제약 조건입니다 . ▣ 제약 조건과 연관된 열 보기 ▪ USER_CONS_COLUMNS 뷰를 통해 제약 조건 이름과 연관된 열을 조회한다 . SQL> SELECT constraint_name, column_name FROM user_cons_columns WHERE table_name = ‘EMP’ ;

13. VIEW 생성 ▣ 데이터베이스 객체 종류 ▪ 테이블 : 기본 저장단위로서 행과 열로 구성됨 ▪ 뷰 : 하나 이상의 테이블에서 데이터의 부분집합을 논리적으로 표시 ▪ 시퀀스 : 기본 키 값을 생성 ▪ 인덱스 : 효율적으로 질의할 수 있음 ▪ 동의어 : 객체의 다른 이름 ▣ 뷰 사용 목적 ▪ 데이터 액세스를 제한하기 위해 ▪ 복잡한 질의를 쉽게 작성하기 위해 ▪ 데이터 독립을 허용하기 위해 ▪ 동일한 데이터로부터 다양한 결과를 얻기위해 ▣ 뷰 생성 ▪ CREATE VIEW 문에 하위 질의를 포함시킴 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]…)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY]; ▪ 하위질의는 복합 SELECT 구문을 포함 ▪ 하위질의는 ORDER BY 절을 포함할 수 없음 ▪ OR REPLACE 뷰가 이미 있어도 다시 생성함 ▪ FORCE 기본 테이블의 존재여부에 관계없이 뷰를 생성 ▪ NOFORCE 기본 테이블이 있는 경우만 뷰를 생성 ▪ WITH CHECK OPTION 뷰를 통해 액세스할 수 있는 행만 삽입 또는 갱신할 수 있도록 지정 ▪ WITH READ ONLY 이 뷰를 통해서는 DML 작업을 수행할 수 없음 ▪ USER_VIEWS 데이터 딕셔너리를 통해 뷰의 이름 및 정의를 볼 수 있음 ▣ 뷰를 통한 DML 작업 수행에 관한 규칙 ▪ 단순 뷰를 통해 DML 작업을 수행할 수 있음 ▪ 뷰가 다음을 포함한 경우 행을 제거할 수 없음 - 그룹함수 - GROUP BY 절 - DISTINCT 키워드 - 의사 열 ROWNUM 키워드

Page 23: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

23

▣ 뷰를 통한 DML 작업 수행에 관한 규칙 ▪ 뷰가 다음을 포함하는 경우 데이터를 수정할 수 없음 - 이전 슬라이드에 언급된 모든 조건 - 표현식에 의해 정의된 열 ( 예 : SAL * 12 ) - ROWNUM 의사 열 ▪ 다음과 같은 경우 데이터를 추가할 수 없음 - 뷰가 이에서 언급한 조건 또는 이전 슬라이드에서 언급한 조건을 포함하는 경우 - 기본 테이블에서 뷰에 의해 선택되지 않은 열에 NOT NULL 제약 조건이 있는 경우 ▣ WITH CHECK OPTION 절 사용 ▪ 뷰를 통한 DML 작업이 뷰의 도메인 내에서 수행됨 ▪ 뷰를 통한 삽입 및 갱신 작업이 뷰가 선택할 수 없는 행은 생성하지 않으며 삽입 또는 갱신 되는 데이터에 대해 무결성 제약 조건을 적용하고 데이터의 유효성을 검사할 수 있음 . ▣ DML 작업 거부 ▪ 뷰 정의에 WITH READ ONLY 옵션을 추가하여 DML 작업을 거부할 수 있음 . ▣ 뷰 제거 ▪ DROP VIEW view_name ; ▣ 인라인 뷰 SELECT a.ename, a.sal, a.deptno, b.maxsal FROM emp a, (SELECT deptno, max(sal) maxsal FROM emp GROUP BY deptno ) b WHERE a.deptno = b.deptno AND a.sal < b.maxsal ;

14. 기타 데이터베이스 객체 ▣ 시퀀스란 ? ▪ 고유번호를 자동으로 생성 ▪ 공유 가능한 객체 ▪ 일반적으로 기본 키 값을 생성하는데 사용됩니다 . ▪ 응용 프로그램 코드를 대체합니다 . ▪ 시퀀스 값을 메모리에 캐시하면 액세스 효율이 높아집니다 . ▣ CREATE SEQUENCE 문 ▪ 시퀀스를 정의하여 시퀀스 번호를 자동으로 생성함 CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] {{CACHE n | NOCACHE}]; - CYCLE : 시퀀스가 최대값 또는 최소값에 도달한 후 추가 값의 생성여부 지정 - CACHE : 오라클 서버가 미리 할당하여 메모리에 저장할 값의 개수를 지정 .

Page 24: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

24

▣ 시퀀스 확인 ▪ USER_SEQUENCES 데이터 딕셔너리 테이블에서 시퀀스 값을 확인 SQL> SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences ;

▪ LAST_NUMBER 열에는 사용 가능한 다음 시퀀스 번호가 표시 ▣ NEXTVAL 및 CURRVAL 의사 열 ▪ NEXTVAL 은 사용 가능한 다음 시퀀스 값을 반환함 ▪ NEXTVAL 은 시퀀스 값을 참조할 때마다 고유한 값을 반환 ▪ CURRVAL 은 현재 시퀀스 값을 반환 ▪ 다음에서는 NEXTVAL 및 CURRVAL 을 사용할 수 없음 - 뷰의 SELECT 목록 - DISTINCT 키워드가 있는 SELECT 문 - GROUP BY, HAVING, ORDER BY 절이 있는 SELECT 문 - SELECT, DELETE, UPDATE 문의 하위질의 - CREATE TABLE 또는 ALTER TABLE 문의 DEFAULT 표현식 SQL> INSERT INTO dept(deptno, dname, loc) VALUES (dept_deptno.nextval, ‘MARKETING’, ‘LA’); ▣ 시퀀스 수정 ▪ 시퀀스 소유자이거나 시퀀스에 대한 ALTER 권한이 있어야 한다 . ▪ 이후 시퀀스 번호에만 영향을 준다 ▪ 시퀀스를 다른 번호로 다시 시작하려면 시퀀스를 삭제한 후 다시 생성해야 한다 . ▪ 일부 검증이 수행된다 .( 예 : 새로은 MAXVALUE 값을 현재 시퀀스번호보다 작을 순 없다 . ▪ START WITH옵션은 ALTER SEQUENCE 를 사용하여 변경할 수 없다 . SQL> ALTER SEQUENCE dept_deptno INCERMENT BY 1 ~~~~~; ▪ 시퀀스 제거는 SQL> DROP SEQUENCE dept_deptno ; ▣ 인덱스 정의 ▪ 스키마 객체입니다 . ▪ 포인터를 사용하여 행 검색 속도를 높이기 위해 Oracle Sever 가 사용 ▪ 데이터 위치를 빠르게 찾는 신속한 경로 액세스 방법을 사용하여 디스크 I/O 를 줄일 수 있음 ▪ 인덱스화된 테이블과 독립되어 존재함 ▪ 오라클 서버에 의해 사용되며 자동으로 유지관리됨 ▣ 인덱스 생성 ▪ 하나 이상의 열에 대한 인덱스를 생성 CREATE INDEX index ON table ( column[, column]…); ▪ 열이 WHERE 절 또는 조인 조건에서 자주 사용되는 경우 ▪ 열에 광범위한 값이 포함된 경우 ▪ 열에 널 값이 많이 포함된 경우 ▪ WHERE 절 또는 조인 조건에서 두개 이상의 열이 함께 자주 사용되는 경우 ▪ 큰 테이블에서 대부분의 질의에 의해 검색되는 범위가 2% ~ 4% 미만인 경우

Page 25: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

25

▣ 인덱스를 생성하지 않은 경우 ▪ 테이블이 작은 경우 ▪ 열이 질의의 조건으로 자주 사용되지 않는 경우 ▪ 대부분의 질의에 의해 검색되는 행이 2%~4% 이상인 경우 ▪ 테이블이 자주 갱신되는 경우 ▣ 인덱스 확인 ▪ USER_INDEXES 데이터 딕셔너리 뷰는 인덱스 이름 및 고유성을 포함 ▪ USER_IND_COLUMNS 뷰는 인덱스 이름 , 테이블 이름 및 열 이름을 포함함 ▣ 함수 기반 인덱스 ▪ 함수 기반 인덱스는 표현식을 기반으로 하는 인덱스입니다 . ▪ 인덱스 표현식은 테이블 열 , 상수 , SQL 함수 및 사용자가 정의한 함수에서 생성됨 SQL> CREATE INDEX uppercase_idx ON emp ( UPPER(ename) ); ▪ 인덱스 제거는 SQL> DROP INDEX index ; ▪ 인덱스를 삭제하려면 인덱스 소유자이거나 DROP ANY INDEX 권한이 있어야 함 ▣ 동의어 ▪ 다른 사용자가 소유한 테이블을 참조함 ▪ 긴 객체 이름을 짧게 만듦 SQL> CREATE [PUBLIC] SYNONYM sysnoym_name FOR object ; ▣ 동의어 생성 및 제거 ▪ DEPT_SUM_VU 뷰의 간략한 이름을 생성함 . SQL> CREATE SYNONYM d_sum FOR dept_sum_vu ; ▪ 동의어를 삭제합니다 . SQL> DROP SYNONYM d_sum ;

15. 사용자 엑세스 제어 ▣ 권한 ▪ 데이터베이스 보안 : 시스템 보안 , 데이터 보안 ▪ 시스템권한 : 데이터베이스를 액세스할 수 있음 . ▪ 객체권한 : 데이터베이스 객체 내용을 조작할 수 있음 ▪ 스키마 : 테이블 , 뷰 , 시퀀스 등과 같은 객체의 모음 ▣ 시스템 권한 ▪ 80 가지 이상의 권한을 사용할 수 있음 ▪ DBA 는 다음과 같은 상위 레벨 시스템 권한을 갖습니다 . ( 새 사용자 생성 , 사용자 제거 , 테이블 제거 , 테이블 백업 ) ▣ 사용자 생성 ▪ DBA 는 CREATE USER 문을 사용하여 사용자를 생성함 . SQL> CREATE USER user_id IDENTIFIED BY password ; ▣ 사용자 시스템 권한 ▪ DBA 는 생성된 사용자에게 특정 시스템 권한을 부여할 수 있음 SQL> GRANT privilege [, privilege…] TO user [, user…] ;

Page 26: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

26

▪ 응용 프로그램 개발자는 다음과 같은 시스템 권한을 갖습니다 . - CREATE SESSION : 데이터베이스에 연결합니다 . - CREATE TABLE : 사용자의 스키마에 테이블을 생성 - CREATE SEQUENCE : 사용자의 스키마에 시퀀스를 생성 - CREATE VIEW : 사용자의 스키마에 뷰를 생성 - CREATE PROCEDURE : 사용자의 스키마에 내장 프로시저 , 함수 또는 패키지를 저장 ▣ 시스템 권한 부여 ▪ DBA 는 사용자에게 특정 시스템 권한을 부여할 수 있음 SQL> GRANT create table, create sequence, create view TO scott ; ▣ 롤 생성 및 권한 부여 롤은 사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹으로서 롤을 사용하 면 권한 부여 및 취소를 쉽게 수행하고 유지관리할 수 있음 SQL> CREATE ROLE manager; SQL> GRANT create table, create view TO manager ; SQL> GRANT manager TO scott, bfx ; ▣ 암호변경 ▪ DBA 는 사용자 계정을 생성하고 암호를 초기화함 . ▪ ALTER USER 문을 사용하여 암호를 변경할 수 있슴 . SQL> ALTER USER scott IDENTIFIED BY tiger ; ▣ 객체 권한 ▪ 객체 권한은 객체마다 다릅니다 ▪ 소유자는 객체에 대한 모든 권한을 갖습니다 . ▪ 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있습니다 . SQL> GRANT object_priv [(columns)] => 부여할 객체 권한 / 부여할 테이블 또는 열 ON object => 권한을 부여할 객체 TO {user|role|PUBLIC} => 권한을 부여받을 사용자 [WITH GRANT OPTION]; => 다른 사용자에게 받은 권한 부여가능 ▣ 객체 권한 부여 ▪ 테이블에 대한 권한을 부여 SQL> GRANT select, update(dname, loc) ON dept TO scott ; ▣ WITH GRANT OPTION 및 PUBLIC 키워드 사용 ▪ WITH GRANT OPTION 권한을 부여 받은 사용자는 권한을 다른 사용자 및 롤에 전달할 수 있는데 권한 부여자의 권한이 취소되면 WITH GRANT OPTION 을 통해 부여된 객체 권한도 취소된다 . ▪ PUBLIC 키워드를 사용하여 모든 사용자에게 엑세스 권한을 부여할 수 있다 .

Page 27: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

27

▣ 부여된 권한 확인

▣ 객체 권한 취소 방법 ▪ REVOKE 문을 사용하여 다른 사용자에게 부여된 권한을 취소합니다 . ▪ WITH GRANT OPTION 을 통해 다른 사용자에게 부여된 권한도 취소됩니다 . SQL> REVOKE {privilege [, privilege…] | ALL} ON object FROM {user[, user…..] | role | PUBLIC} [CASCADE CONSTRAINTS] ; SQL> REVOKE select, insert ON dept FROM scott ;

16. 변수 선언 ▣ PL/SQL 블록 구조 ▪ DECLARE – 선택사항 - 변수 , 커서 , 사용자가 정의한 예외사항 ▪ BEGIN – 필수 - SQL 문 - PL/SQL 문 ▪ EXCEPTION – 선택사항 오류가 발생할 때의 수행작업 ▪ END ; - 필수 DECLARE v_variable VARCHAR2(5); BEGIN SELECT column INTO v_variable FROM table_name ; EXCEPTION WHEN exception_name THEN ……. END ;

데이터 딕셔너리 테이블 설 명

ROLE_SYS_PRIVS 롤에 부여된 시스템 권한입니다

ROLE_TAB_PRIVS 롤에 부여된 테이블 권한입니다

USER_TAB_PRIVS_MADE

사용자 객체에 대해 부여된 객체 권한입니다 .

USER_TAB_PRIVS_RECD

사용자에게 부여된 객체 권한입니다 .

USER_COL_PRIVS_MADE

사용자 객체의 열에 대해 부여된 객체 권한입니다 .

USER_COL_PRIVS_RECD

특정 열에 대해 사용자에게 부여된 객체 권한입니다 .

USER_ROLE_PRIVS 사용자가 액세스할 수 있는 롤입니다 .

Page 28: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

28

▣ 블록유형 ▪ 블록유형 : PL/SQL 의 모든 단위는 하나 이상의 블록으로 구성되며 이러한 블럭은 완전히 분리되거나 , 다른 블럭안에 중첩될 수 있다 ▪ 익명블럭 : 익명블럭은 이름이 지정되지 않은 블록 [DECLARE] …. BEGIN -- STATEMENTS [EXCEPTION] END ; ▪ 하위프로그램 : 매개변수를 사용할 수 있는 명명된 PL/SQL 블럭이며 호출할 수 있다 . 하위프로그램을 프로시저나 함수로 선언할 수 있다 . - 프로시저 PROCEDURE proc_name IS BEGIN -- STATEMENTS [EXCEPTION] END ; - 함수 FUNCTION fun_name RETURN datatype IS BEGIN -- STATEMENTS RETURN value ; [EXCEPTION] END ; ▣ 변수 사용 다음의 경우에 변수를 사용합니다 . - 데이터 임시 저장 - 저장된 값 조작 - 재 사용 - 유지 관리의 용이성 ▣ PL/SQL 에서 변수 처리 ▪ 선언 부분에서 변수를 선언하고 초기화합니다 . ▪ 실행 부분에서 변수에 새 값을 할당합니다 . ▪ 매개변수를 통해 값을 PL/SQL 블록에 전달합니다 . ▪ 출력 변수를 통해 결과를 봅니다 . ▣ 변수유형 ▪ 사진의 데이터 유형은 BLOB ▪ 연설 텍스트의 데이터 유형은 LONG RAW ▪ 영화의 데이터 유형은 BFILE ▪ 이름은 VARCHAR2

Page 29: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

29

▣ PL/SQL 변수 선언 ▪ 구문 identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]; ▪ 예제 Declare v_date CHAR(8); v_deptno NUMBER(2) NOT NULL := 10 ; v_location VARCHAR2(13) := ‘Korea’ ; c_comm CONSTANT NUMBER := 1400 ; ▪ 이름 지정 규칙을 따른다 . - 서로 다른 블록에 있는 두 변수는 동일한 이름을 가질 수 있다 - 변수이름은 블록에서 사용되는 테이블의 열의 이름과 동일하면 안된다 . ▪ NOT NULL 및 CONSTANT 로 지정된 변수를 초기화한다 . ▪ 할당연산자 (:=) 또는 DEFAULT 예약어를 사용하여 식별자를 초기화 ▪ 식별자를 한 행에 하나씩 선언 ▣ 기본 스칼라 데이터 유형 ▪ VARCHAR2 (maximum_length) ▪ NUMBER [(precision, scale)] ▪ DATE ▪ CHAR [(maximum_length)] ▪ LONG ▪ LONG RAW : 이진 데이터 및 바이트 문자열의 기본 유형이며 최대 길이는 32,760byte. ▪ BOOLEAN ▪ BINARY_INTEGER : -2,147,483,647과 2,147,483,647 사이에 있는 정수의 기본 유형 ▪ PLS_INTEGER : -2,147,483,647과 2,147,483,647 사이에 있는 부호표시 정수의 기본유형 ▣ %TYPE 속성 ▪ 다음에 따라 변수를 선언합니다 . - 데이터 베이스 열 정의 - 이전에 선언한 다른 변수 ▪ %TYPE 에 다음을 접두어로 붙입니다 . - 데이터베이스 테이블 및 열 - 이전에 선언한 변수 이름 ▣ %TYPE 속성을 사용하여 변수 선언 v_name emp.ename%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10; ▣ LOB 데이터 유형 변수 ▪ CLOB(Character Large Object) : 단인 바이트 문자 데이터의 대형블록을 저장 (책 ) ▪ BLOB(Binary Large Object) : 대형 이진 객체를 DB 에 행 내에 순서대로 또는 행 외부에 무순서 저장 ( 사진 ) ▪ BFILE(Binary FILE) : 대형 이진 객체를 DB 외부에 있는 운영 체제 파일에 저장 (영화 ) ▪ NCLOB(National language Character Large Object) : 단일 바이트 또는 고정 너비 멀티 바이트 NCHAR 데이터를 데이터베이스에 순서대로 또는 순서없이 저장합니다 .

Page 30: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

30

▣ 바이드 변수 ▪ 바이드 변수는 호스트 환경에서 선언한 변수로서 런타임 값 ( 숫자 또는 문자 ) 을 하나 이상의 PL/SQL 프로그램과 주고 받는데 사용합니다 . PL/SQL 프로그램은 바인드 변수를 다른 변수와 마찬가지로 사용합니다 . ▪ 바이드 변수 생성 - VARIABLE return_code NUMBER - VARIABLE return_name VARCHAR2(30) ▪ SQL*Plus 환경에서는 PRINT 명령을 사용하여 바이드 변수의 현재 값을 표시할 수 있다 SQL> VARIABLE rtn_data VARCHAR2(31); SQL> BEGIN SELECT s_jmname INTO :rtn_data FROM bdjmst WHERE jmcode = ‘xxxxxxx’ ; END ; / SQL> PRINT rtn_data ; ▣ 비 PL/SQL 변수 참조 ▪ 변수에 값 할당 호스트 변수를 참조하려면 참조대상에 콜론 (:) 을 접두어로 붙여 선언된 PL/SQL 변수와 구분 예제 ) VARIABLE g_monthly_sal NUMBER ACCEPT p_annual_sal PROMPT ‘Please enter the annual salary: ‘

DECLARE v_sal NUMBER(9,2) := &p_annual_sal ; BEGIN :g_monthly_sal := v_sal /12 ; END ; /

PRINT g_monthly_sal

▣ DBMS_OUTPUT.PUT_LINE ▪ Oracle 지원 패키지 프로시저입니다 . ▪ PL/SQL 블록에서 데이터를 표시하는 또 하나의 방법입니다 . ▪ SET SERVEROUTPUT ON 을 사용하여 SQL*Plus 에서 사용 가능하도록 설정합니다 . SET SERVEROUTPUT ON ACCEPT p_annual_sal PROMPT ‘Please enter the annual salary: ‘ DECLARE v_sal NUMBER(9,2) := &p_annual_sal ; BEGIN v_sal := v_sal / 12 ; DBMS_OUTPUT.PUT_LINE (‘The monthly salary is ‘ || TO_CHAR(v_sal)); END ; /

Page 31: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

31

17. 실행문 작성 ▣ PL/SQL 블록 구문 및 지침 ▪ 명령문은 여러 행에 나누어 쓸 수 있습니다 . ▪ PL/SQL 블록은 행에 슬래시 (/) 가 있으면 종결됩니다 . ▪ 렉시칼 단위를 구분하는 기준은 다음과 같습니다 . 공백 , 구분자 , 식별자 , 리터럴 , 주석 식별자 ▪ 최고 30 자까지 가능합니다 . ▪ 예약어는 큰 따옴표로 묶어야 합니다 . ▪ 영문자로 시작해야 합니다 . ▪ 데이터베이스 테이블 열 이름과 동일하면 안됩니다 . 리터럴 ▪ 문자 및 날짜 리터럴은 작은 따옴표로 묶어야 합니다 . ▪ 숫자는 단순 값이나 과학적 표기법으로 나타낼 수 있습니다 . ▣ 코드에 주석달기 ▪ 단일 행 주석에는 대시 두 개 (--) 를 접두어로 붙입니다 . ▪ 여러 행 주석은 기호 /* 와 */ 사이에 작성한다 . ▣ PL/SQL 의 SQL 함수 ▪ 다음은 프로시저 문에서 사용할 수 있습니다 . 단일 행 숫자 , 단일 행 문자 , 데이터 유형 변환 , 날짜 ▪ 다음은 프로시저 문에서 사용할 수 없음 DECODE, 그룹함수 (AVG, MIN, MAX, COUNT, SUM, STDDEV, VARIANCE) - 그룹 함수는 테이블의 행 그룹에 적용되므로 PL/SQL 블록의 SQL 문에서만 사용가능 . ▣ 데이터 유형 변환 ▪ TO_CHAR TO_DATE TO_NUMBER▪ ▪

▣ 중첩 블록 및 변수 범위 ▪ 실행문이 사용 가능한 경우 언제라도 명령문을 중첩할 수 있다 . ▪ 중첩 블록은 하나의 명령문이 된다 . ▪ EXCEPTION 섹션은 중첩 블록을 포함할 수 있다 . ▪ 객체의 범위는 객체를 참조할 수 있는 프로그램 영역이다 . ▪ 블록은 상위 블록을 조회할 수 있다 . ▪ 블록은 하위 블록을 조회할 수 없다 . ▣ PL/SQL 의 연산자 ▪ NULL 을 포함하는 비교 결과는 항상 NULL 이다 ▪ NULL 에 논리 연산자 NOT 을 적용하면 결과는 NULL 이 된다 ▪ 조건 제어문에서 조건의 결과가 NULL 이면 연관된 일련의 명령문이 실행되지 않는다 ▣ 프로그래밍 지침 ▪ 주석을 사용하여 코드 문서화 ▪ 코드에 대해 대소문자 규칙 개발 예 ) SQL 문 – 대문자 , PL/SQL 키워드 – 대문자 , 데이터 유형 – 대문자 , 식별자와 매개변수 – 소문자 , 데이터베이스 테이블과 열 - 소문자 ▪ 식별자와 기타 객체에 대한 이름 지정 규칙 개발 ▪ 들여쓰기를 사용하여 가독성 향상

Page 32: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

32

▣ 코드 이름 지정 규칙 ▪ 지역변수와 공식 매개변수의 이름은 데이터베이스 테이블의 이름보다 우선순위가 높다 ▪ 열의 이름은 지역변수의 이름보다 우선순위가 높다 .

18. Oracle Server 를 사용한 대화식 처리 ▣ PL/SQL 의 SELECT 문 DECLARE v_deptno NUMBER(2); v_loc VARCHAR2(15); BEGIN SELECT deptno, loc INTO v_deptno, v_loc FROM dept WHERE dname = ‘SALES’ ; END ; ▣ PL/SQL 에서 데이터 검색 DECLARE v_sum_sal emp.sal%TYPE; v_deptno NUMBER NOT NULL := 10; BEGIN SELECT SUM(sal) INTO v_sum_sal FROM emp WHERE deptno = v_deptno ; END ; ▣ PL/SQL 을 사용하여 데이터 조작 BEGIN INSERT INTO emp(empno, empname, job, sal) VALUES (empno_sequence.NEXTVAL, ‘JEONG’, ‘PROGRAMMER’, 2400); END ; ▣ COMMIT 문과 ROLLBACK 문 ▪ 첫번째 DML 명령으로 트랜잭션을 초기화하여 COMMIT 또는 ROLLBACK 을 수행함 ▪ COMMIT 및 ROLLBACK SQL 문을 사용하여 트랜잭션을 명시적으로 종료함 COMMIT [WORK]; SAVEPOINT savepoint_name ; ROLLBACK [WORK] ; ROLLBACK [WORK] TO [SAVEPOINT] savepoint_name ; ▪ 블록에 명시적 잠금 명령 ( 예 : LOCK TABLE 및 SELECT …. FOR UPDATE) 을 포함할 수도 있습니다 .

Page 33: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

33

▣ SQL 커서 속성 ▪ SQL 커서 속성을 사용하면 SQL 문의 결과를 테스트할 수 있습니다 .

▪ 블록의 EXCEPTION 섹션에서 SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND, SQL%ISOPEN 속성을 사용하여 데이터 조작문의 실행 부분에 대한 정보를 모을 수 있다 . VARIABLE rows_deleted VARCHAR2(30) DECLARE v_ordid NUMBER := 65 ; BEGIN DELETE FROM item WHERE ordid = v_ordid; :rows_deleted := (SQL%ROWCOUNT || ‘ rows deleted.’) ; END ; / PRINT rows_deleted

19. 제어구조 작성 ▣ IF 문 ▪ 구문 IF condition THEN statements ; [ELSEIF condition THEN statements; ] [ELSE statements;] END IF ;

IF v_start > 100 THEN v_start := 2 * v_start ; ELSEIF v_start >= 50 THEN v_start := .5 * v_start ; ELSE v_start := .1 * v_start ; END IF ;

SQL%ROWCOUNT 가장 최근의 SQL 문이 적용된 행의 개수 ( 정수 값 ) 입니다

SQL%FOUND 가장 최근의 SQL 문이 하나 이상의 행에 적용된 경우 TRUE

SQL%NOTFOUND 가장 최근의 SQL 문이 적용된 행이 없는 경우 TRUE 평가

SQL%ISOPEN PL/SQL 은 암시적 커서를 실행 후 바로 종료하므로 FALSE

Page 34: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

34

▣ 기본 루프 (LOOP) ▪ 구문 LOOP statement1 ; ….. EXIT [WHEN condition] ; END LOOP ; ▪ 예제 DECLARE v_ordid item.ordid%TYPE := 601 ; v_count NUMBER2) := 1 ; BEGIN LOOP INSERT INTO item(ordid, itemid) VALUES (v_ordid, v_count) ; v_count := v_count + 1 ; EXIT WHEN v_count > 10 ; END LOOP ; END ; ▣ FOR LOOP ▪ 구문 FOR counter IN [REVERSE] lower_bound..upper_bound LOOP statement1; …… END LOOP; ▪ 카운터는 루프 내에서만 참조할 수 있으며 루프 밖에서는 정의되지 않습니다 . ▪ 카운터의 기존 값을 참조하려면 표현식을 사용하십시요 ▪ 카운터를 할당 대상으로 참조하지 마십시오 DECLARE v_lower NUMBER := 1 ; v_upper NUMBER := 100; BEGIN FOR i IN v_lower..v_upper LOOP …… END LOOP ; END; ▣ WHILE LOOP ACCEPT p_new_order PROMPT ‘Enter the order number: ‘ ACCEPT p_items PROMPT ‘Enter the number of items in this order: ‘ DECLARE v_count NUMBER(2) := 1 ; BEGIN WHILE v_count <= &p_items LOOP …… v_count := v_count + 1 ; END LOOP ; END ;

Page 35: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

35

▣ 중첩 루프 및 레이블 BEGIN << Outer_loop>> -- 레이블 LOOP v_counter := v_counter + 1 ; EXIT WHEN v_counter > 10 ; << Inner_loop>> LOOP ……. EXIT Outer_loop WHEN total_done = ‘YES’ ; -- Leave both loops EXIT WHEN inner_done = ‘YES’ ; -- Leave inner loop only ….. END LOOP Inner_loop ; … END LOOP Outer_loop; END;

20. 조합 데이터 유형 사용 ▣ 조합 데이터 유형 ▪ 조합 데이터 유형에는 RECORD, TABLE, NESTED TABLE 및 VARRAY 등이 있슴 ▣ PL/SQL 레코드 ▪ 필드라고 불리는 PL/SQL 테이블 , 레코드 , 임의의 스칼라 데이터 유형 중 하나 이상의 구성요소를 포함해야 함 ▪ 3GL 의 레코드 구조와 유사함 ▪ 데이터베이스 테이블의 행과 동일하지 않습니다 . ▪ 필드 모음을 하나의 논리 단위로 처리합니다 . ▪ 테이블에서 데이터 행을 인출하여 처리하는데 편리합니다 . ▪ 사원이름 , 급여 , 입사일 등과 같은 필드를 포함하는 레코드의 경우에는 데이터를 하나의 논리 단위로 처리할 수 있다 ▣ PL/SQL 레코드 생성 ▪ 구문 TYPE type_name IS RECORD (field_declaration[, field_declaration]… ); identifier type_name ; 여기서 field_declaration 은 다음과 같습니다 . field_name {field_type | variable%TYPE | table.column%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr] ▪ type_name : 레코드 유형의 이름이며 레코드를 선언할 때 이 식별자 사용 ▪ field_name : 레코드 필드의 이름 ▪ field_type : 필드의 데이터 유형이며 REF CURSOR 를 제외한 모든 PL/SQL 데이터 유형을 나타냄 . %TYPE 과 %ROWTYPE 속성을 사용할 수 있다 ▪ expr : field_type 또는 초기값 ▪ NOT NULL 제약조건이 있는 필드에는 널을 할당할 수 없으므로 NOT NULL 필드는 반드시 초기화 해야 함

Page 36: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

36

▣ PL/SQL 레코드 생성 ▪ 신입사원의 이름 , 직위 , 급여등을 저장할 변수를 선언 ▪ NOT NULL 제약조건을 추가할 수 있으며 반드시 초기화 하여야 합니다 . ▪ 예제 … TYPE emp_record_type IS RECORD (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER(7,2), dept emp.dept%TYPE); emp_record emp_record_type ; … ▪ 레코드 참조 record_name.field_name ▣ %ROWTYPE 속성 ▪ 데이터베이스 테이블 또는 뷰의 열 모음에 따라 변수를 선언합니다 . ▪ %ROWTYPE 에 데이터베이스 테이블 이름을 접두어로 붙입니다 . ▪ 레코드 필드의 이름과 데이터 유형은 테이블 또는 뷰의 열에서 가져옵니다 ▪ 선언 DECLARE emp_record emp%ROWTYPE ; ▪ 참조 emp_reocord.sal := 1000 ; ▪ 예제 DECLARE emp_rec emp%ROWTYPE ; BEGIN SELECT * INTO emp_rec FROM emp WHERE empno = &emp_num ; INSERT INTO retired_emp(emp, name, job, mgr, hiredate, leavedate) VALUES (emp_rec.emp, emp_rec.name, emp_rec.job, emp_rec.mgr, emp_tec.hiredate, sysdate ); COMMIT ; END ; ▣ PL/SQL 테이블 ▪ 다음 두개의 구성요소로 구성됨 - BINARY_INTEGER 데이터 유형의 기본 키 - 스칼라 또는 레코드 데이터 유형의열 ▪ 크기 제한이 없으므로 동적으로 증가한다 ▪ 테이블 유형의 객체를 PL/SQL 테이블이라고 하며 테이터베이스 테이블로 모델링된다 . ( 데이터베이스 테이블과 동일하지 않음 ) ▪ 배열과 유사함

Page 37: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

37

▣ PL/SQL 테이블 생성 ▪ 구문 TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE } [NOT NULL] [INDEX BY BINARY_INTEGER] ; identifier type_name ; ▪ 테이블의 데이터 유형을 선언 ▪ 예제 … TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; ename_table ename_table_type ; … ▪ PL/SQL 테이블 구조 기본키 열

BINARY_INTEGER 스칼라 ▪ PL/SQL 테이블에는 하나의 열과 하나의 기본 키가 있는데 둘 중 어느 것에도 이름을 지정할 수 없습니다 . 열은 스칼라 또는 레코드 데이터 유형일 수 있지만 기본 키는 BINARY_INTEGER 유형이어야 합니다 . ▣ PL/SQL 테이블 생성 DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; ename_table ename_table_type; BEGIN ename_table(1) := ‘CAMERON’ ; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN INSERT INTO …. END; ▪ table.EXISTS(I) 문은 인덱스 I 가 있는 행이 적어도 하나 이상 반환되어야 TRUE 를 반환합니다 . EXISTS 문을 사용하여 존재하지 않는 테이블 요소를 참조할 때 발생하는 오류를 방지합니다 .

… …

1 Jones

2 Smith

3 Maduro

… …

Page 38: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

38

▣ PL/SQL 테이블 메소드 사용 다음 메소드를 사용해서 PL/SQL 테이블을 쉽게 사용할 수 있습니다 .

▣ 레코드로 구성된 PL/SQL 테이블 ▪ 허용된 PL/SQL 데이터 유형을 사용하여 테이블 변수를 정의 ▪ 부서정보를 저장할 PL/SQL 변수를 선언 ▪ 예제 DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; dept_table dept_table_type ; ▣ 레코드로 구성된 PL/SQL 테이블 예제 DECLARE TYPE emp_table_type IS TABLE OF emp.Ename%TYPE INDEX BY BINARY_INTEGER ; e_table e_table_type ; BEGIN e_tab(1) := ‘SMITH’ ; UPDATE emp SET sal = 1.1 * sal WHERE Ename = e_tab(1) ; COMMIT ; END ; /

메소드 설명

EXISTS(n) PL/SQL 테이블에 n 번째 요소가 존재하면 TRUE 를 반환합니다 .

COUNT 현재 PL/SQL 테이블에 있는 요소 수를 반환합니다 .

FIRST / LAST PL/SQL 테이블의 첫번째와 마지막 인덱스 번호를 반환 . 없으면 NULL

PRIOR(n) PL/SQL 테이블에서 인덱스 n 앞의 인덱스 번호를 반환

NEXT(n) PL/SQL 테이블에서 인덱스 n 다음의 인덱스 번호를 반환

EXTEND(n,I) PL/SQL 테이블의 크기를 늘립니다 .EXTEND 는 PL/SQL 테이블에 널 요소를 한 추가합니다 .EXTEND(n) 은 PL/SQL 테이블에 널 요소를 n 개 추가합니다EXTEND(n,I) 는 PL/SQL 테이블에 I 번째 요소의 복사본을 n 개 추가함

TRIM TRIM 은 PL/SQL 테이블의 끝에서 요소를 하나 제거합니다 .TRIM(n) 은 PL/SQL 테이블의 끝에서 요소를 n 개 제거합니다

DELETE DELETE 는 PL/SQL 테이블에서 모든 요소를 제거합니다DELETE(n) 은 PL/SQL 테이블에서 n 번째 요소를 제거합니다DELETE(m,n) 은 테이블 범위에서 m..n 에 있는 모든 요소를 제거함

Page 39: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

39

21. 명시적 커서 작성 ▣ 명시적 커서 제어 ( 프로그래머가 선언 )

▣ 커서선언 ▪ 구문 CURSOR cursor_name IS select_statement ; ▪ 커서 선언 부분에 INTO 절을 포함시키지 마십시오 ▪ 특정 시퀀스로 행을 처리해야 하는 경우 질의에 ORDER BY 절을 사용하십시오 ▪ 예제 DECLARE v_empno emp.empno%TYPE ; v_ename emp.ename%TYPE ; CURSOR emp_cur IS SELECT empno, ename FROM emp ; BEGIN … ▣ 커서열기 OPEN cursor_name ; ▪ 커서를 열어 질의를 실행하고 활성집합을 식별함 ▪ 질의에 의해 반환되는 행이 없으면 예외사항이 발생하지 않습니다 ▪ 커서 속성을 사용하여 인출 후의 결과를 테스트합니다 ▪ OPEN 의 역할 - 중요한 처리정보를 포함하는 컨텍스트 영역에 대한 메모리를 동적으로 할당 - SELECT 문의 구문을 분석 - 입력 변수를 바인드함 . 즉 , 해당 메모리 주소를 확보하여 입력 변수의 값을 설정 - 활성집합 , 즉 검색조건을 만족하는 행 집합을 식별합니다 . OPEN 문을 실행하면 활성 집합의 행을 변수로 가져오지 않습니다 . - 포인터 위치를 활성 집합의 첫번째 행 앞으로 지정함 . ▪ FOR UPDATE 절을 사용하여 커서를 선언한 경우 OPEN 문은 해당 행을 잠급니다 . ▣ 커서에서 데이터 인출 ▪ 구문 FETCH cursor_name INTO [variable1, variable2, …] ▪ 현재 행 값을 변수로 가져옵니다 . ▪ 동일한 개수의 변수를 포함시킴 ▪ 각 변수를 해당 열에 위치적으로 대응시킴 ▪ 커서의 행 포함 여부를 테스트함 .

DECLARE OPEN FETCH Empty? CLOSE

명명된 SQL영역 생성

활성집합식별

현재 행을변수에 로드 기존행테스트

활성집합 해제

아니오

Page 40: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

40

▣ 커서에서 데이터 인출 ▪ 예제 DECLARE v_empno emp.empno%TYPE ; v_ename emp.ename%TYPE ; CURSOR emp_cursor IS SELECT empno, ename FROM emp ; BEGIN OPEN emp_cursor ; FOR I IN 1..10 LOOP FETCH emp_cursor INTO v_empno, v_ename ; …. END LOOP ; END ; ▣ 커서 닫기 ▪ 구문 CLOSE emp_cursor ; ▪ 사용자에 대해 열리는 최대 커서 수를 제한할 수 있으며 이 값은 데이터베이스 필드의 OPEN_CURSORS 매개변수에 의해 결정되며 기본적으로 50 입니다 . ▣ 명시적 커서 속성 ▪ 커서의 상태정보를 제공합니다 .

속성 유형 설명

%ISOPEN 부울 커서가 열려 있으면 TRUE 입니다 .

%NOTFOUND 부울 가장 최근의 인출에서 반환하는 행이 없으면 TRUE

%FOUND 부울 가장 최근의 인출에서 반환하는 행이 있으면 TRUE

%ROWCOUNT 숫자 지금까지 반환된 전체 행 수 입니다 .

▣ 복수 인출 제어 ▪ 루프를 사용하여 명시적 커서에서 여러 행을 처리함 ▪ %NOTFOUND 속성을 사용하여 실행되지 못한 인출에 대한 테스트를 작성 ▪ 명시적 커서 속성을 사용하여 각 인출 작업이 성공적으로 수행되었는지 테스트 함 . ▣ %ISOPEN 속성 ▪ 커서가 열려 있는 경우에만 행을 인출함 ▪ %ISOPEN 커서 속성은 인출 전에 커서가 OPEN되어 있는지 테스트 하는데 사용 ▣ %NOTFOUND 및 %ROWCOUNT 속성 ▪ %ROWCOUNT 커서 속성을 사용하여 정확한 행수 검색 ▪ %NOTFOUND 커서 속성을 사용하여 루프 종료 시기를 결정 (첫번째 NOTFOUND 는 NULL 값 ) ▪ 예제 ….. EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND ; …..

Page 41: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

41

▣ 커서 FOR 루프 ▪ 예제 DECLARE CURSOR emp_cursor IS SELECT ename, deptno FROM emp ; -- emp_record emp_cursor%ROWTYPE ; 은 선언하지 않음 . 자동으로 연결됨 . BEGIN FOR emp_record IN emp_cursor LOOP IF emp_record.deptno = 30 THEN DBMS_OUTPUT.PUT_LINE (‘Employee ‘ || emp_record.ename ); END IF ; END LOOP ; END ; ▣ 하위 질의를 사용하는 커서 FOR 루프 ▪ 커서를 선언하지 않아도 됩니다 ▪ 예제 SET SERVEROUTPUT ON BEGIN FOR emp_record IN (SELECT ename, deptno FROM emp ) LOOP IF emp_record.deptno = 30 THEN DBMS_OUTPUT.PUT_LINE(‘Employee ‘ || emp_record.ename); END IF ; END LOOP ; END ; /

22. 고급 명시적 커서 개념 ▣ 매개변수 사용 커서 ▪ 구문 CURSOR cursor_name [(parameter_name datatype, …)] IS select_statement ; ▪ 커서가 열리고 질의가 실행되면서 커서에 매개변수 값을 전달함 ▪ 매번 다른 활성 집합을 사용하여 명시적 커서를 여러 번 엽니다 . DECLARE CURSOR emp_cur (p_deptno NUMBER, p_job VARCHAR2) IS SELECT empno, ename FROM emp WHERE deptno = p_deptno AND job = p_job ; BEGIN OPEN emp_cur(10, ‘CLERK’) ; 이나 FOR emp_record IN emp_cur(10, ‘CLERK’) LOOP ….

Page 42: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

42

▣ FOR UPDATE 절 ▪ 구문 SELECT .. FROM FOR UPDATE [OF column_reference] [NOWAIT] ; ▪ 명시적 잠금을 사용하여 트랜잭션 기간 동안 액세슬르 거부할 수 있다 ▪ 갱신 또는 삭제 전에 행을 잠금합니다 . ▪ FOR UPDATE 절은 ORDER BY 가 있는 경우에도 SELECT 문의 마지막 절입니다 ▪ NOWAIT 는 다른 세션에서 해당 행을 잠근 경우 Oracle 오류를 반환함 ▪ 예제 DECLARE CURSOR emp_cursor IS SELECT empno, ename, sal FROM emp WHERE deptno = 30 FOR UPDATE OF sal NOWAIT ; ▣ WHERE CURRENT OF 절 ▪ 구문 WHERE CURRENT OF cursor ; ▪ 커서를 사용하여 현재 행을 갱신 및 삭제합니다 ▪ 커서 질의에 FOR UPDATE 절을 포함시켜 먼저 행을 잠금니다 . ▪ WHERE CURRENT OF 절을 사용하여 명시적 커서에서 현재 행을 참조합니다 . ▪ 예제 DECLARE CURSOR sal_cur IS SELECT sal FROM emp WHERE deptno = 30 FOR UPDATE OF sal NOWAIT ; BEGIN FOR emp_record IN sal_cursor LOOP UPDATE emp SET sal = emp_record.sal * 1.1 WHERE CURRENT OF sal_cur ; END LOOP ; COMMIT ; END ; ▣ 하위 질의 포함 커서 ▪ 예제 DECLARE my_cur IS SELECT t1.deptno, t1.name, t2.STAFF FROM dept t1, ( SELECT deptno, count(*) STAFF FROM emp GROUP BY deptno ) t2 WHERE t1.deptno = t2.deptno AND t2.STAFF >= 5 ;

Page 43: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

43

▣ 예외 유형 ▪ 미리 정의한 오라클 서버 예외사항 ▪ 미리 정의하지 않은 오라클 서버 예외 사항 ▪ 사용자가 정의한 예외사항 명시적으로 발생 ▣ 예외트랩 ▪ 구문 EXCEPTION WHEN exception1 [OR exception2 … ] THEN statement1 ; statement2 ; [WHEN exception3 [OR exception4 .. ] THEN statement1 ; statement2 ; [WHEN OTHERS THEN statement1 ; statement2 ; ] ▪ WHEN OTHERS 는 마지막 절입니다 ▪ EXCEPTION 키워드는 예외 처리 부분을 시작합니다 ▪ 여러 개의 예외 처리기를 사용할 수 있습니다 ▪ 블록을 종료하기 전에 하나의 처리기만 처리합니다

23. 예외 처리 ▣ PL/SQL 로 예외처리 ▪ 예외사항 : 실행중에 발생하는 PL/SQL 의 식별자입니다 ▪ 예외발생 : - 오라클 오류가 발생함 - 사용자가 명시적으로 발생시킴 ▪ 처리방법 : - 처리기로 트랩합니다 - 호출 환경으로 전달합니다 예외 트랩 예외 전달

DECLARE

BEGIN

EXCEPTION

END ;

DECLARE

BEGIN

EXCEPTION

END ;

예외발생

예외트랩

예외발생

예외사항이트랩되지 않음

호출환경에 예외전달

암시적으로 발생

Page 44: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

44

▣ 미리 정의한 Oracle Server 오류 트랩 ▪ 예외 처리 루틴에서 표준 이름을 참조합니다

예외이름 오류번호 설명

ACCESS_INTO_NULL ORA-06530 초기화하지 않은 객체 속성에 값을 할당함

COLLECTION_IS_NULL ORA-06531 최기화안한 중첩 테이블 / 가변배열에 EXISTS 이외의 모음 메소드를 적용함

CURSOR_ALREADY_OPEN ORA-06511 이미 열려 있는 커서를 열려고 함

DUP_VAL_ON_INDEX ORA-00001 중복 값을 삽입함

INVALID_CURSOR ORA-01001 잘못된 커서 작업이 발생

INVALID_NUMBER ORA-01722 문자열을 숫자로 변환하지 못함

LOGIN_DENIED ORA-01017 유효하지 않은 사용자 이름과 패스워드

NO_DATA_FOUND ORA-01403 단일 행 SELECT 에서 데이터 반환하지 않음

NOT_LOGGED_ON ORA-01012 PL/SQL 이 오라클에 연결않고 DB 호출

PROGRAM_ERROR ORA-06501 PL/SQL 에 내부 오류가 있슴

ROWTYPE_MISMATCH ORA-06504 PL/SQL 변수 및 호스트변수의 호환실패

STORAGE_ERROR ORA-06500 메모리가 부족하거나 메모리가 손상됨

SUBSCRIPT_BEYOND_COUNT

ORA-06533 배열 인덱스 번호보다 큰 인덱스번호 참조

SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 범위를 벗어난 인덱스번호 ( 예 :-1) 참조

TIMEOUT_ON_RESOURCE ORA-00051 오라클이 자원을 기다리는 동안 시간초과

TOO_MANY_ROWS ORA-01422 단일 행 SELECT 에서 둘 이상의 행을 반환

VALUE_ERROR ORA-06502 산술 , 변환 , 절단 또는 크기 제약조건 오류

ZERO_DIVIDE ORA-01476 0 으로 나누려고 함

Page 45: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

45

▣ 미리 정의한 예외사항 ▪ 구문 BEGIN EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1; WHEN OTHERS THEN statement1; statement2 ; END ; ▪ PRAGMA EXCEPTION_INIT 는 예외 이름과 오라클 오류번호를 연결하도록 컴파일러에 지시 ▪ PRAGMA : 의사 명령어로 명령문이 컴파일러 지시어임을 나타내는 키워드 DECLARE e_emps_remaining EXCEPTION ; PRAGMA EXCEPTION_INIT (e_emps_remaining, -2292) ; -- 무결성제약 v_deptno dept.deptno%TYPE := &p_deptno; BEGIN DELETE FROM dept WHERE deptno = v_deptno ; COMMIT ; EXCEPTION WHEN e_emps_remaining THEN DBMS_OUTPUT.PUT_LINE (‘Cannot remove dept ‘ || to_char(v_deptno) ); END ; ▣ 예외 트랩 함수 ▪ SQLCODE 오류 코드의 숫자 값을 반환 (0: 정상 1: 사용자 정의한 예외사항 100:NOT FOUND 음수 : 에러 ) ▪ SQLERRM 오류 번호와 연관된 메시지를 반환함 DECLARE v_error_code NUMBER ; v_error_message VARCHAR2(255); BEGIN … EXCEPTION …. WHEN OTHERS THEN ROLLBACK ; v_error_code := SQLCODE ; v_error_message := SQLERRM ; END ;

Page 46: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

46

▣ 사용자가 정의한 예외사항 ▪ 예제 DECLARE e_invalid_product EXCEPTION; BEGIN UPDATE product SET descript = ‘&product_desc’ WHERE prodid = &product_number ; IF SQL%NOTFOUND THEN RAISE e_invalid_product ; END IF; COMMIT ; EXCEPTION WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE ( ‘Invalid product number.’); END ; ▣ 예외 전달 DECLARE e_no_rows exception; e_integrity exception; PRAGMA EXCEPTION_INIT (e_integrity, -2292); BEGIN FOR c_record IN emp_cursor LOOP BEGIN SELECT … IF SQL%NOTFOUND THEN RAISE e_no_rows ; END IF ; EXCEPTION WHEN e_integrity THEN … WHEN e_no_rows THEN … END; END LOOP ; EXCEPTION WHEN NO_DATA_FOUND THEN … WHEN TOO_MANY_ROWS THEN … END;

▪ 현재 블록에 해당 예외처리가 없으면 예외사항 처리기를 찾을 때까지 다음 포함된 블록으로 계속해서 전달된다

Page 47: 1.  데이터 모델

CopyRight by S. Y. Jeong

오라클 SQLPLUS 교육자료 정 삼 용

47

▣ RAISE_APPLICATION_ERROR ▪ 구문 raise_application_error ( error_number, message [, { TRUE | FALSE } ] ) ; ▪ 사용자가 정의한 오류 메시지를 내장 하위 프로그램에서 실행하는 프로시저 ▪ 내장 하위 프로그램 실행을 통해서만 호출함 ▪ error_number : -20000 ~ -20999 까지 지정 ▪ message : 사용자가 지정하는 메시지로 최대 2048byte 의 문자열 ▪ 다음 두 부분에서 사용합니다 . - 실행부분 - Exception 섹션 ▪ 다른 오라클 서버 오류와 동일한 방식으로 사용자에게 오류조건을 반환함 ▪ 예제 ….. DELETE FROM emp WHERE mgr = v_mgr ;

IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20202, ‘This is not a valid manager’); END IF ; ….