물리적 전송 선로 + 논리적 장치 구분에 의한 데이터 전송 방법 => 1:n 통신으로 1개의 물리적 전송 선로에 복수개의 통신 장치들이 연결되어 논리적 주소를 이용하여 데이터를 주고받는 방법
직렬 통신 - 시리얼 통신
데이터를 한 번에 1bit 씩 보내는 방식이다. 통로가 1개라서 비용이나, 자원이 크게 들지는 않는다. 또한 하나의 선만을 사용하기 때문에 하드웨어적으로 매우 간편해서 만들기가 쉽다. 하지만 데이터를 모으고 취합하는 과정을 구현해주어야 한다
병렬 통신
한번에 8 ~ 16bit에 해당하는 bit를 보내는 방식이다. 여러 개의 정보를 동사에 보내기 때문에 통로가 많아야 해 비용이나 자원이 크게 든다. 선이 많기 때문에 하드웨어적 구현 측면에서 시리얼보다 불편한다.
시리얼 통신의 방식
동기식 시리얼 통신
각각의 PC가 이러한 신호 주기로 보내겠다는 Clock을 정하고 데이터를 전송하는 방법이다. 그렇기 때문에 데이터를 보내는 데이터 선 말고도 클럭 주기를 맞추는 클럭선이 하나 더 필요하다. 미리 보내는 Clock을 맞추고 데이터를 주고받기 때문에 오류가 적고, 빠르게 데이터를 통신할 수 있다.(SPI 통신 방식)
비동기식 시리얼 통신
비동기식 시리얼 통신을 따로 주기를 정하지 않고, 시작과 끝을 알려주고 전송하는 방법이다. 데이터 선만 있으면 되기 때문에 단순하고 빠르게 통신 회선을 구성할 수 있다. 하지만 동기 시리얼 통신에 비해 안정성이나 속도가 느리다.
Create [Or Replace] Package 패키지 명 IS Procedure 프로시저 명 Functino 함수 명 ...... END;
몸체부
Create [Or Replace] Package Body 패키지 명 IS Procedure 프로시저 명 -프로시저 생성
Functino 함수 명 - 함수 생성 ...... END;
실행
EXECUTE [패키지명].[프로시저/함수 명];
ex)
<명세부>
CREATE OR REPLACE PACKAGE PACK1 is procedure test2 (v_stu_no in student.stu_no%type, v_stu_grade in student.stu_grade%type); function test6 (v_enr_grade in number) return char; end;
<몸체부>
CREATE OR REPLACE PACKAGE BODY PACK1 IS PROCEDURE test2 ( v_stu_no IN student.stu_no%TYPE, v_stu_grade IN student.stu_grade%TYPE ) IS BEGIN UPDATE student SET stu_grade = v_stu_grade WHERE stu_no = v_stu_no; END test2;
FUNCTION test6 ( v_enr_grade IN NUMBER ) RETURN char IS enr_score char; BEGIN IF v_enr_grade >= 90 THEN enr_score := 'A'; ELSIF v_enr_grade >= 80 THEN enr_score := 'B'; ELSIF v_enr_grade >= 70 THEN enr_score := 'C'; ELSIF v_enr_grade >= 60 THEN enr_score := 'D'; ELSE enr_score := 'F'; END IF; RETURN enr_score; END test6; END pack1;
select pack1.test6(85) from dual;
ONE-TIME ONLY 프로시저와 오버로딩
ONE-TIME ONLY 프로시저
전역변수의 초기화나 기본적으로 처리하여야 할 로직
패키지가 실행될 때 무조건 한번만 실행됨
패키지 몸체부 가장 마지막 부분에 BEGIN절과 함께 정의됨
오버로딩
같은 이름의 여러개 프로시저 사용
매개변수의 수가 다르거나, 순서를 달리하여 사용
<명세부>
CREATE OR REPLACE package C202144098.PACK2 is g_stu_dept varchar2(20); procedure test12 (v_stu_no in student.stu_no%type); procedure test12 -오버로딩- (v_stu_name student.stu_name%type); End;
<몸체부>
CREATE OR REPLACE PACKAGE BODY C202144098.PACK2 IS PROCEDURE test12 (v_stu_no IN student.stu_no%TYPE) IS v_stu_name student.stu_name%TYPE; BEGIN SELECT stu_name INTO v_stu_name FROM student WHERE stu_no = v_stu_no AND stu_dept = g_stu_dept; DBMS_OUTPUT.PUT_LINE(v_stu_name); EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.'); END test12;
PROCEDURE test12 (v_stu_name IN student.stu_name%TYPE) IS v_stu_no student.stu_no%TYPE; BEGIN SELECT stu_no INTO v_stu_no FROM student WHERE stu_name = v_stu_name AND stu_dept = g_stu_dept; DBMS_OUTPUT.PUT_LINE(v_stu_no); EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.'); END test12;
BEGIN g_stu_dept := '컴퓨터정보'; END; -ONE-TIME ONLY 프로시저
Execute pack2.test12(20191001);
Execute pack2.test12('김종헌');
트리거
어떤 조건에 맞는 이벤트가 일어나면 후속 이벤트를 발생시킴
트리거의 5 요소
트리거 유형 : DML 단위의 트리거, 변경된 레코드 단위의 트리거
트리거 동작 시점 : 트리거 동작 시점은 Before, After
트리거 이벤트 : 트리거를 발생시킬 것 인지를 셜정
트리거 조건 : 레코드 단위의 트리거에서만 설정할 수 있는 UPDATE 작업 시 특정 조건을 명시하여 조건에 맞는 레코드의 변셩에서만 트리거 이벤트를 발생
예외 처리부 실행부 로직 처리 중 에러 또는 비정상적인 상황을 처리하기 위한 작업을 기술하는 부분.
PL/SQL의 종류
PROCEDURE : 프로시저 처리 후 반환. 값의 제한이 없음
FUNCTION : 함수 처리 후 반환. 하나의 값 반환
PACKAGE : 프로시저나 함수의 그룹
TRIGGER : 조건에 맞는 이벤트가 일어나면 후속 이벤트가 발생
변수
변수명 [모드] 데이터 타입
매개변수, 자체변수
IS 로 구분됨
IS 다음의 자체 변수는 mode 생략
매개변수는 역할에 따라
IN : 프로시저가 호출될 때 전달되는 값을 처리하기 위한 변수
OUT : 프로시저가 처리된 후 반환되는 값을 처리하기 위한 변수
INOUT : 두가지 기능을 갖는 변수
변수 타입
스칼라(scalar) 타입
NUMBER, CHAR, VARCHAR2, DATE, BOOLEAN 등
참조(reference) 타입
%TYPE
%ROWTYPE
선택처리문 (IF ~ ENDIF)
declare - 선언부 v_condition number := 2; begin IF v_condition < 1 then dbms_output.put_line(‘대한’); ELSIF v_condition = 1 then dbms_output.put_line(‘민국’); ELSE dbms_output.put_line(‘만세’); END IF; end;
select * from user_constraints where 테이블 명 = '테이블 명';
제약 조건의 삭제
DROP CONSTRAINT 제약조건 명
ALTER Table 테이블 명 drop constraint 제약조건 명
제약 조건의 활성화, 비활성화
Alter Table 테이블 명
Disalbe / Enable CONSTAINT 제약조건 명;
뷰 (VIEW)
외부단계
가상 테이블
질의 변형
장점
데이터베이스를 재구성하여 논리적 데이터 독립성 제공
원하는 데이터 만을 조작함으로 데이터의 보완기능 강화
VIEW의 생성과 삭제
생성
Create View 뷰 이름
AS 부질의
삭제
Drop View 부 이름
VIEW의 종류
단순 뷰
단순 뷰는 단일 베이스 테이블로 부터 유도된 뷰이다.
Create or replace view v_student1
as select * from student where sty_dept='컴퓨터정보';
조인 뷰
조인뷰는 2개 이상의 베이스 테이블로부터 유도된 뷰이다.
Create or replace view v_enrol1
as select sub_name, a.sub_no, stu_no, enr_grade
from enrol a, subject b
where a.sub_no = b.sub_no;
인라인 뷰
인라인 뷰는 From절에 SELECT 문으로 정의된 뷰이다.
select stu_no, stu_name, a.stu_dept, stu_height
from student a, (select stu_dept, avg(stu_height) as avg_height
from student
group by stu_dept) b
where a.stu_dept = b.stu_dept
and a.stu_hegiht > b.avg_height;
TOP-N 뷰
최댓값 또는 최솟값을 가진 열에 몇 개의 레코드만 추출할 때 사용되는 기능
Select stu_no, stu_name, stu_height
from (select stu_no, stu_name, stu_height
from student
where stu_height is not null
order by stu_height desc)
where rownum <= 5;
인덱스 (INDEX) 빠른 검색을 위하여 정의되며, 한 개 이상의 열로 구성됨. 학생 테이블의 학번은 기본 키이므로 자동으로 인덱스 정의. 이름으로 검색하는 질의가 많을 경우 이름으로 인덱스를 정의. 학과로 검색하는 경우가 극히 적다면 학과를 인덱스로 정의할 경우 활용도가 떨어지며, 기억공간은 낭비된다. 데이터 사전의 USER_INDEXS, USER_ID_COLUMS
학생의 이름으로 인덱스 생성 - Create INDEX i_stu_name on student(stu_name);
학생의 학번과 이름을 합쳐서 인덱스를 생성 - Create INDEX i_stu_no on student(stu_no, stu_name);
유일한 값으로 인덱스 생성 - Create UNIQUE INDEX i_stu_name on student(stu_name);
함수나 수식을 이용하여 인덱스 생성 - Create INDEX i_stu_weight on student(stu_weight-5);