Education/오라클

PL/SQL Day1

창신다이 2008. 2. 22. 11:18

PL-SQL Day 1

※학습절차
1. SQL & PL-SQL(35H↑) : RDBMS, SQL, PL-SQL
->DB조작언어, 사용자 인터페이스x
▶다음과정
<중급>
2. Fundamentals[Administration]-I(35H) : RDBMS 관리기법
3. Fundamentals-II : Backup & Recovery
  ◎성능저하 요인 2가지
    ①잘못된 Query -> SQL 튜닝
    ②DB구조 -> 서버튜닝
4. Performance Tuning(35H) : 서버튜닝
4-2. 기타과정(SQL-Statement tuning) : SQL 튜닝
5. Data Modeling(Analysis, Design)
<고급>
6. 대용량  DB 솔루션 : 성능
7. Data Architecture

<월-수>
01 - 02 : Oracle
03 - 11 : SQL
<목-금>
12 - 15 : PL-SQL

DBMS : File System의 한계 극복
①공유x
②공간낭비(공유에 대한 문제 해결을 위해 같은 데이터를 여러곳에 복사)
③불필요한 Operation 발생(데이터 동기화를 위해)
④무결성 보장x - 원하지 않는 데이터 저장x

DBMS ┌ DB2(IBM)   ─ 최초 개발
          ├ Sybase       ┐ Sybase 개발 엔지니어들이 SQL-Server 개발했음.
          ├ SQL-Server ┘ 구조 거의 똑같음
          ├ Oracle       ─ 두번째로 나옴. DB2를 참조함
          ├ Infomix
          └ AdaBas

SQL : 데이터를 Access 하기 위해 데이터베이스와 통신하는 언어
그래픽한 화면 디자인x

V6 V7 V8 V8i V9i V10g
SQL*PLUS Tool - for Developer, 9i부터 svrmgrl과 통합하여 이름 변경 SQL*PLUS(TCP-IP),
추가로 isqlplus(HTTP),
추가로 isqlplus를 위해서 Apache 웹서버
sqldba(old) - for DataBase Administrator, v8i부터 svrmgrl(Server*Manager)

기본계정
sys - 데이터베이스를 설치한 계정. OS의 Administrator와 유사한 역할
system - DB 관리자 계정
scott(Scott Andrew) - OS의 guest와 유사한 역할
hr -

scott 계정 생성
start C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\scott.sql

<file-system>
file > record(line) > field

<RDBMS>
table(entity) > Row(tuple) > Column(Attribue) [p.28 참조]
설계단계에서 사용 / (분석단계에서 사용)

<관계형데이터베이스란?>
목표: 중복제거, 똑같은 데이터가 반복된다면 File System과 같다. 예를들어 emp table의 부서명이 반복되는 것도 중복이다.

SQL*PLUS┌① 명령어prompt (Dos, Unix, Linux)
               └② Client-WIndows용 [for client 프로그램 설치]
             (SQL*PLUS-Tool[win, prompt], SQL*NET[Server, Client간(2-tier) 연결 통신 프로그램])

<Oracle 분류>
①Enterprise_Edition : 중소규모 이상 대규모 ┐         ┌ 추가옵션 o(JServer[JVM]:Java Class 저장)
②Standard_Edition : 중소그룹용(10~50명),  ┤DBMS├ 추가옵션 x
③Personal_Edition : 개인용,                     ┘ (기본)└ Network 기능 x
④Express_Edition : (licesce 필요 x)

<학습목표>
- RDBMS 개념
- RDBMS를 구현하기 위한 문법

PL-SQL : Procedural Language

DQL(Data Query Language)
SELECT [distinct]|[all] 성명 as sabun, 주소 "address" 'distinct : 중복되는 값 제거, alias 할때 대,소문자 섞어서 쓸때 더블인용부호 사용
FROM emp ORDER BY [colum1], [column2], ...[ASC/DESC]; 'ASC(오름차순:default), DESC(내림차순)

null(표현되어 있지 않은 컬럼, space를 의미하는 것이 아니라 null로 명시적으로 표현, 가장 큰 값으로 표현됨), not null

DDL(Data Definition Language)
alter table emp
 rename column A to B  '컬럼명을 테이블 스키마에서 바꾸는 것. cf) Alias는 임시로 바꿈

<가공컬럼>
:실제 테이블에는 존재하지 않는데 사용자의 필요에 의해서 컬럼을 산술식(우선순위 주의)을 표현해서 만들어내는 가짜 컬럼.
ex) SELECT empno, sal, comm, sal + comm FROM emp;

<컬럼 data-유형(type)>
┌char     ┐
└varchar ┘ : 문자형
number : 숫자형
date : 날짜형
type에 따라 연산자 사용 방식이 다르다. 문자형, 날짜타입에는 single 인용부호 사용.
날짜 타입은 Format 포맷이 맞아야 된다
날짜 포맷 확인 쿼리
 1  select value
 2  from NLS_SESSION_PARAMETERS
 3  where parameter = 'NLS_DATE_FORMAT';
RR 타입 -> 00 ~ 50 : 2000년대로 인식, 51 ~ 99 : 1900년대로 인식
YY 타입 -> 00 ~ 50 : 1900년대로 인식

SELECT TO_CHAR(sysdate, 'DY') FROM DUAL;

오늘날짜 확인
select sysdate from dual;

날짜포맷 변경
alter session set NLS_DATE_FORMAT = 'YYYY/MM/DD';
※세션레벨(이 sql 프로세스)에서만 적용 cf)서버(인스턴스)레벨 -> 관리자로 들어가서 모든 프로세스에 적용하도록 변경 가능

C:\oraclexe\app\oracle\product\10.2.0\server\sqlplus\admin\glogin.sql 제일 하단부에 alter session set

NLS_DATE_FORMAT = 'YYYY/MM/DD'; 추가하면 매번 접속시 마다 세션을 변경 시킨다

IN 연산자
WHERE depno IN(10, 20, 30)
-> WHERE depno = 10 or depno = 20 or depno = 30
-> WHERE depno = 10
   UNION
   WHERE depno = 20
   UNION
   WHERE depno = 30

LIKE 연산자
where ename like '주%' -> '%' 와일드카드문자
where ename like '주_' -> '_' 임의의 한 문자

인용부호 안에 있는 문자열 중에 ESCAPE 문자 뒤에 오는 문자는 문자로 취급한다. 임의의 한 문자를 가르키는 '_'와 구분

BETWEEN 연산자
where deptno BETWEEN 10 AND 20;
-> where deptno >= 20 and deptno <= 30;

※ IN과 BETWEEN 지양할 것 -> 어차피 번역되어서 실행되므로 효과가 덜하다

문자열 결합
ename || '의 1년 연봉은' ||sal||'입니다'
-> ename의 1년 연봉은 sal 입니다

PL-SQL의 DBMS_SMTP, DBMS_MAIL을 이용해서 E-mail을 보낼 수 있다.
이때 문자열 결합을 이용하게 된다.


UNION 연산자
: 중복된 정보는 한번만 보여줌
 
SQL 표준화 방법
①SQL문법은 대문자
②각절은 라인의 처음부터 작성
ex)SELECT no, name
FROM emp
WHERE deptno = 10
ORDER BY no;

<download>
1. spool 명령어 -> 로그내용 남길때도 이용
2. util_file 패키지
   (PL-SQL)
3. APP-S/W

<upload>
1. sql*load_utility (In Fundamental I)
2. external_table
3. util_file 패키지
4. APP-S/W

<함수=function=>sub_routine, sub_program>

*시간 가져오는 것
SELECT SYSTIMESTAMP FROM DUAL;
SYSTIMESTAMP는 SQL과 같이 사용되어진다.
FROM 뒤에는 반드시 테이블명을 써야 하는데, 실제 테이블명 사용할 수 없으므로 껍데기(더미테이블)를 제공한 것