3과목 데이터베이스 구축 SQL 활용 114 ~ 120
114. 프로시저
: 절차형 SQL을 활용하여 특정 기능을 수행하는 일종의 트랜잭션 언어. > 호출을 통해 실행되어 미리 저장해 놓은 SQL 작업 수행.
- 스토어드 프로시저
- 여러 프로그램에서 호출하여 사용 가능
- 시스템의 일일 마감 작업, 일괄 작업 등에 주로 사용
1) 구성도
- DECLARE (필수) : 프로시저의 명칭, 변수, 인수, 데이터 타입 정의
- BEGIN (필수) : 시작
- CONTROL : 조건문/반복문 삽입되어 순차적 처리
- SQL : DML, DCL 삽입되어 순차적 처리
- EXCEPTION : BEGIN~END 안의 구문 실행시 예외가 발생하면 이를 처리하는 방법 정의
- TRANSACTION : 수행된 데이터 작업들을 DB에 적용할지 취소할지를 결정하는 처리부
- END (필수) : 종료
2) 프로시저 생성
- OR REPLACE : 동일한 프로시저 이름이 이미 존재하는 경우, 기존 프로시저 대체
- 파라미터 :
- IN(호출 프로그램이 프로시저에세 값을 전달할 때 지정)
- OUT(프로시저가 호출 프로그램에게 값을 반환할 때 지정)
- INOUT (호출 프로그램이 프로시저에게 값을 전달하고, 프로시저 실행 후 호출 프로그램에 값을 반환할 때 지정)
- 매개변수명 : 호출 프로그램으로부터 전달받은 값을 저장할 변수의 이름 지정
- 자료형 : 변수의 자료형 지정.
CREATE [OR REPLACE] PROCEDURE 프로시저명(파라미터)
[지역변수 선언]
BEGIN
프로시저 BODY;
END;
CREATE OR REPLACE PROCEDURE emp_change_s(i_사원번호 IN INT)
IS
BEGIN
UPDATE 급여 SET 지급방식='S' WHERE 사원번호 = i_사원번호;
EXCEPTION
WHEN PROGRAM_ERROR THEN
ROLLBACK;
COMMIT;
END;
3) 프로시저 실행
EXECUTE 프로시저명;
EXEC 프로시저명;
CALL 프로시저명;
4) 프로시저 제거
DROP PROCEDURE 프로시저명;
115. 트리거
: 데이터베이스 시스템에서 데이터 삽입, 갱신, 삭제 등의 이벤트가 발생할 때마다 관련 작업이 자동으로 수행되는 절차형 SQL.
- 데이터 변경 및 무결성 유지, 로그메시지 출력 등의 목적
- DCL 사용 불가.
1) 구성
- DECLARE (필수) : 트리거의 명칭, 변수 및 상수, 데이터 타입 정의
- EVENT (필수) : 트리거 실행 조건 명시
- BEGIN (필수) : 시작
- CONTROL : 조건문/반복문 삽입되어 순차적 처리
- SQL : DML, DCL 삽입되어 순차적 처리
- EXCEPTION : BEGIN~END 안의 구문 실행시 예외가 발생하면 이를 처리하는 방법 정의
- END (필수) : 종료
2) 트리거 생성
- OR REPLACE : 동일한 트리거 이름이 이미 존재하는 경우, 기존 프로시저 대체
- 동작시기 : 트리거 실행될 때 지정.
- ALTER : 테이블 변경 후에 트리거 실행
- BEFORE : 테이블 변경 전에 트리거 실행
- 동작 : 트리거가 실행되게 할 작업의 종류 지정
- INSERT : 테이블에 새로운 튜플 삽입할 때 트리거 실행
- DELETE
- UPDATE
- NEW | OLD : 트리거가 적용될 테이블의 별칭 지정.
- NEW : 추가되거나 수정에 참여할 튜플들의 집합
- OLD : 수정되거나 삭제 전 대상이 되는 튜플들의 집합.
- FOR EACH ROW : 각 튜플마다 트리거를 적용한다는 의미.
- WHEN 조건식 : 트리거 적용할 튜플의 조건 지정.
CREATE [OR REPLACE] TRIGGER 트리거명 동작시기 동작 ON 테이블명
[REFERENCING NEW|OLD AS 테이블명]
[FOR EACH ROW [WHEN 조건식]]
BEGIN
트리거 BODY;
END;
CREATE OR REPLACE TRIGGER 학년정보_tri BEFORE INSERT ON 학생
// 학생 테이블에 튜플을 삽입하기 전에 동작하는 트리거 생성.
REFERENCING NEW AS new_table
// 새로 추가될 튜플들의 집합 NEW의 별칭을 <new_table>로 명명.
FOR EACH ROW
// 모든 튜플들을 대상으로 한다.
WHEN (new_table.학생 IS NULL)
// new_table에서 학년 속성이 NULL인 튜플에 학년정보_tri 트리거가 적용된다.
BEGIN
:new_table.학년 := '신입생';
// new_table의 학년 속성에 '신입생'을 치환한다.
// NEW로 지정된 테이블 이름 앞에 콜론(:)이 들어간다.
END;
3) 트리거 제거
DROP TRIGGER 트리거명;
116. 사용자 정의 함수
: 프로시저와 유사하게 SQL을 사용하여 일련의 작업을 연속적으로 처리. 종료시 > 처리 결과를 단일값으로 반환.
- 예약어 RETURN을 통해 값 반환. 출력 파라미터가 없다.
- INSERT, DELETE, UPDATE를 통한 테이블 조작 불가. /SELECT를 통한 조회만 가능.
- 프로시저 호출 불가!
cf) 프로시저와 구분!
구분 | 프로시저 | 사용자 정의 함수 |
반환값 | 없거나 1개 이상 가능 | 1개 |
파라미터 | 입출력 가능 | 입력만 가능 |
사용가능 명령문 | DML, DCL | SELECT |
호출 | 프로시저, 사용자 정의함수 가능 | 사용자 정의 함수 |
사용방법 | 실행문 | DML에 포함 |
1) 구성
- DECLARE (필수) : 사용자 정의 함수의 명칭, 변수, 인수, 데이터 타입 정의
- BEGIN (필수) : 시작
- CONTROL : 조건문/반복문 삽입되어 순차적 처리
- SQL : DML, DCL 삽입되어 순차적 처리
- EXCEPTION : BEGIN~END 안의 구문 실행시 예외가 발생하면 이를 처리하는 방법 정의
- RETURN : 호출 프로그램에 반환할 값이나 변수 정
- END (필수) : 종료
2) 사용자 정의 함수 생성
- OR REPLACE : 동일한 사용자 정의 함수 이름이 이미 존재하는 경우, 대체
- 파라미터 :
- IN(호출 프로그램이 사용자 정의 함수에게 값을 전달할 때 지정)
- 매개변수명 : 호출 프로그램으로부터 전달받은 값을 저장할 변수의 이름 지정
- 자료형 : 변수의 자료형 지정.
CREATE [OR REPLACE] FUNCTION 사용자정의함수명 (파라미터)
[지역변수 선언]
BEGIN
사용자정의함수 BODY;
RETURN 반환값;
END;
CREATE FUNCTION Get_S_성별(i_성별코드 IN INT)
RETURN VARCHAR2
IS
BEGIN
IF i_성별코드 = 1 THEN
RETURN '남자';
ELSE
RETURN '여자';
END IF;
END;
3) 사용자 정의 함수 실행
SELECT 사용자정의함수명 FROM 테이블명;
INSERT INTO 테이블명(속성명) VALUES (사용자정의함수명);
DELETE FROM 테이블명 WHERE 속성명 = 사용자정의함수명;
UPDATE 테이블명 SET 속성명= 사용자정의함수명;
SELECT 이름, Get_S_성별(성별코드) FROM 사원;
4) 사용자 정의 함수 제거
DROP FUNCTION 사용자정의함수명;
117. DBMS 접속 기술
: 사용자가 데이터를 사용하기 위해 응용 시스템을 이용하여 DBMS에 접근하는 것.
- 웹 응용 시스템은 웹서버와 웹애플리케이션 서버로 구성됨.
- DBMS 접속 기술
1) JDBC (Java DataBase Connectivity)
: Java 언어로 다양한 종류의 데이터베이스에 접속하고 SQL문을 수행할 때 사용되는 표준 API.
- 접속하려는 DBMS에 대한 드라이버가 필요.
- Java SE에 포함.
2) ODBC (Open DataBase Connectivity)
: 데이터베이스에 접근하기 위한 표준 개방형 API. (개발 언어 관계없이 사용가능.)
- 접속하려는 DBMS의 인터페이스를 알지 못하더라도 ODBC 문장을 사용하여 SQL을 작성하면 ODBC에 포함된 드라이버 관리자가 해당 DBMS의 인터페이스에 맞게 연결해줌.
3) MyBatis
: JDBC 코드를 단순화하여 사용할 수 있는 SQL Mapping 기반 오픈 소스 접속 프레임워크.
- SQL 문장을 분리하여 XML 파일을 만들고, Mapping을 통해 SQL을 실행.
- 동적 SQL
: 개발 언어에 삽입되는 SQL 코드를 문자열 변수에 넣어 처리하는 것.
- 프리컴파일 할 때 구문분석, 접근 권한 확인 등 불가.
- NVL 함수 사용할 필요가 없다.
118. SQL 테스트
: SQL이 작성 의도에 맞게 원하는 기능을 수행하는지 검증하는 과정.
1) 단문 SQL 테스트
: DDL, DML, DCL이 포함되어 있는 SQL과 TCL을 테스트. 직접 실행하여 결과물 확인.
- DESCRIBE 명령어 : DDL로 작성된 테이블이나 뷰의 속성, 자료형, 옵션들을 바로 확인 가능.
DESC 학생;
// Oracle
SELECT * FROM DBA_SYS PRIVS WHERE GRANTEE='사용자1';
// MySQL
SHOW GRANTS FOR 사용자@호스트;
2) 절차형 SQL 테스트
: 절차형 SQL은 디버깅을 통해 기능의 적합성 여부를 검증하고, 실행을 통해 결과를 확인하는 테스트를 수행.
- SHOW ERRORS;
- Oracle
- DBMS_OUTPUT.ENABLE : 화면에 출력하기 위해 DBMS_OUTPUT 패키지를 불러온다.
- DBMS_OUTPUT.PUT_LINE(데이터) : 데이터에 넣은 변수나 값을 화면에 출력한다.
- MySQL
- SELECT 데이터; : 데이터에 넣은 변수나 값을 화면에 출력
119. ORM (Object-Relational Mapping)
: 객체지향 프로그래밍의 객체와 관계형 데이터베이스의 데이터를 연결하는 기술.
- SQL 코드를 직접 입력하지 않고 선언문이나 할당 같은 부수적인 코드가 생략됨.
- JAVA : JPA, Hibernate, EclipseLink, DataNucleus, Ebean
- C++ : ODB, QxOrm
- Python : Django, SQLAlchemy, Storm
- iOS : DatabaseObjects, Core Data
- .NET : NHibernate, DatabseObjects, Dapper
- PHP : Doctrine, Propel, RedBean
- ORM의 한계 : 의도대로 SQL이 작성되었는지 확인할 필요가 있다. 객체지향적인 사용을 고려하고 설계된 데이터베이스가 아닌 경우 기술 적용 어려움.
120. 쿼리 성능 최적화
: 데이터 입,출력 애플리케이션의 성능 향상을 위해 SQL 코드를 최적화하는 것.
- APM(성능 측정 도구)을 사용하여 최적화할 쿼리를 선정.
- 최적화 할 쿼리에 대해 옵티마이저가 수립한 실행 계획을 검토하고 SQL 코드와 인덱스 재구성.
RBO(Rule Based Optimizer) | CBO(Cost Based Optimizer) | |
최적화 기준 | 규칙에 정의된 우선순위 | 액세스 비용 |
성능 기준 | 개발자의 SQL 숙련도 | 옵티마이저의 예측 성능 |
특징 | 실행 계획 예측이 쉬움 | 성능 통계치 정보 활용, 예측이 복잡함 |
고려사항 | 개발자의 규칙 이해도, 규칙의 효율성 | 비용 산출 공식의 정확성 |
1) 실행계획 (Execution Plan) : DBMS의 옵티마이저가 수립한 SQL 코드의 실행 절차와 방법.
- EXPLAIN 명령어로 확인.
2) 쿼리 성능 최적화 : 연산 순서, 조인 방식, 테이블 조회 방법 등을 참고하여 SQL문이 더 빠르고 효율적으로 작동하도록 재구성.
- SQL 코드 재구성
- 인덱스 재구성.
'Programming > 정처기' 카테고리의 다른 글
4과목 프로그래밍 언어 활용 프로그래밍 언어 활용 132 ~ 139 (0) | 2024.02.05 |
---|---|
4과목 프로그래밍 언어 활용 서버 프로그램 구현 127 ~ 131 (1) | 2024.02.05 |
3과목 데이터베이스 구축 SQL 응용 107 ~ 113 (0) | 2024.02.04 |
3과목 데이터베이스 구축 물리 데이터베이스 설계 100 ~ 106 (0) | 2024.02.03 |
3과목 데이터베이스 구축 물리 데이터베이스 설계 091 ~098 (2) | 2024.01.30 |