일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- vmin
- 웹개발
- 가상클래스 선택자
- 깃헙
- 소스트리
- spring
- 자바
- 속성 선택자
- 부정 선택자
- nth-of-type()
- 다시볼 것
- ES6
- 서블릿
- HTML Templating
- jsp
- nth-child()
- 다시보자
- 즐거운 자바
- EDWITH
- JavaScript
- 복합 선택자
- 김성박
- 상속
- 가상요소 선택자
- vmax
- optgroup
- 즐거운자바
- 보충필요
- datalist
- 부스트코스
Archives
- Today
- Total
기억의 DataBase
PL(Procedural Language)/SQL 본문
- PL(Procedural Language)
-PL/SQL은 ORACLE의 형식으로 다른 DB는 다른 DB의 방식이 있다.
- 다른 DB와 ORACLE DB가 다른점
-ORACLE : PL/SQL을 DB Server에 한번에 보내고 Result를 한번에 받아옴(Traffic이 적음)
(SQL 처리 영역과 PL/SQL 처리영역이 따로 있다)
-다른 DB Local에서 Interprete해서 계속 통신하면서 DB Server에 던져줘야 함(Traffic이 많음)
(보통 그래서 DB가 아니라 Server에서 처리함 - C /JAVA 등으로 만든)
- PL/SQL Block의 구조
-전체 Block 내부에 SubBlock도 가능(전역변수와 지역변수 유사)
-선언부(Declare Section)은 Block의 다른 모든 부분에서 액세스할 수 있는 모든 변수, 상수, Exception, Cursor등을 선언하는 곳이다.
-Procedure Body(Procedure Body)에는 Block에 대해 실행 가능한 명령이 포함된다. PL/SQL Block의 처리 기능을 기술하는 곳이다.
-예외 핸들링 섹션(Exception Handler Section)에는 Block에 대한 예외 핸들러가 포함된다.
- 변수의 형태(Declare)
1.NUMBER
2.VARCHAR2
3.DATE
4.BOOLEAN
5.%TYPE >> table.column%type, variable%type - table의 변수형을, 명시한 colume이 따르게 함
6.%ROWTYPE >> table%rowtype - 명시한 table의 변수형을 적용되는 colume이 따르게 함
7.ROWID >> char(18)의 sub-type
※ Table명과 RowId는 같아도 무방하다 >> SQL 처리영역과 PLSQL 처리영역이 다르므로
- 변수 초기화 형태
변수명 [constant] 변수형태 [not null] [:= 초기값(식)] ;
- 서브 타입을 이용한 변수 선언
DECLARE
varchar2_50 VARCHAR2(50); -- 제한된 변수 선언
SUBTYPE s1 IS varchar2_50; -- 서브타입 선언
/* 서브타입 이용 변수 선언 */
current_desc s1 DEFAULT 'Unknown';
- 사용자 정의 복합형 변수 선언
- Record >> 필드를 묶음으로 선언
CREATE OR REPLACE PROCEDURE Record_Test
( p_empno IN emp.empno%TYPE )
IS
-- 하나의 레코드의 세가지의 변수타입 선언
TYPE emp_record IS RECORD
(v_empno NUMBER,
v_ename VARCHAR2(30),
v_hiredate DATE );
emp_rec emp_record ;
BEGIN
DBMS_OUTPUT.ENABLE;
-- 레코드의 사용
SELECT empno, ename, hiredate
INTO emp_rec.v_empno, emp_rec.v_ename, emp_rec.v_hiredate
FROM emp
WHERE empno = p_empno;
DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || emp_rec.v_empno );
DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || emp_rec.v_ename );
DBMS_OUTPUT.PUT_LINE( '입 사 일 : ' || emp_rec.v_hiredate);
END;
- Table >> 행 크기가 유동적임(데이터가 들어오면 자동으로 증가)
- VArray >> 행 크기를 고정적으로 하여, 속도가 빠름
-
Cursor대상이 되는 데이타베이스 데이타를 일시적으로 저장하는 기능을 갖는 메모리상의 buffer
BEGIN
OPEN <cursor_name> [(parameter_value,......)];
(Open될 때, Select문이 수행되어 cursor에 그 데이타가 보관된다.)
......;
FETCH <cursor_name> INTO <variable1>, <variable2>,.....;
(Cursor로부터 1개의 record을 읽어 정해진 변수에 그 값을 넣는 작업이다.)
......;
CLOSE <cursor_name>;
END;
- 동적인 SQL
고정된 SQL은 변수가 정해져 있지만, Dynamic SQL은 필요한 변수를 기준으로 값을 가지고 옴
- Exception
Exception 절이 없어도 실행은 되나, 발생 시 안쓰면 처리/확인 X
후행작업과 충돌방지
- Trigger
-Trigger가 걸린 colume의 변경이 commit/rollback 될때 실행
-Table이 수정되면 걸려있는 Trigger가 Disable로 됨 > Table 수정후에는 Enable로
-Summary Table의 갱신에 용이
ex) Trigger의 실제 사용예
월 매출 실적 > 출하를 집계하는 경우
경우의 수가 많아지면 유지보수가 어려워 진다(변경 적용시 누락)
중첩이 3중이 넘어가면 성능이 기하급수적으로 감소
>> 추상화하고 단순화하여서, 규칙성을 찾아서 3~4가지 안으로 줄여서 함
ex) 컬럼수 X 3가지(INSERT, DELETE, UPDATE) = 10가지 이상의 경우의 수
ex) INSERT > NEW:+
DELETE > OLD:-
UPDATE > OLD:- / NEW :+
ex) if(delete or update){
OLD -
}
if(insert or update){
NEW +
}
※외부 라이브러리를 불러들여서 쓸 수 있으나(C로 짠 센서 프로그램), 반대의 경우가 더 많음
'DB' 카테고리의 다른 글
MySQL (0) | 2019.02.21 |
---|---|
SQL (0) | 2019.01.08 |
DW (0) | 2019.01.08 |
ORACLE의 기본구조3 (0) | 2019.01.02 |
ORACLE의 기본구조2 (0) | 2019.01.02 |
Comments