복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.
지난 글에 이어서 작성해 보도록 하겠습니다.
2022.11.11 - [컴퓨터공학/데이터베이스] - [데이터베이스] SQL - Structured Query Language2
▶삽입 SQL
삽입 SQL은 이중 모드 (dual mode) 특성을 가지고 있다.
터미널에서 대화식으로 사용할 수 있는 모든 SQL문은 응용 프로그램에서도 그대로 사용할 수 있는 특성을 가진다.
삽입 SQL을 포함하는 응용 프로그램의 특징
- 명령문 앞에 EXEC SQL을 붙여 다른 명령문과 쉽게 구별 가능하다.
- 호스트 변수는 BEGIN DECLARE와 END DECLARE SECTION 문을 사용하여 선언된다.
- SQL문에서 사용되는 호스트 변수는 콜론(:)을 앞에 붙인다.
- 호스트 변수와 DB 필드의 이름은 같아도 된다.
- 호스트 변수와 대응하는 SQL 열의 데이터 타입은 일치해야 한다.
- SQLSTATE라는 호스트 변수를 포함, SQL문이 실행되면 실행 상태(성공, 실패, 오류)가 이 변수에 전달된다.
호스트 변수는 사용하기 전에 반드시 SQL 선언 부인 BEGIN DECLARE SECTION 속에서 선언되어야 한다.
EXEC SQL BEGIN DECLARE SECTION; /*호스트 변수 선언*/
int sno;
char sname[21];
char dept[7];
char SQLSTATE[6];
EXEX SQL END DECLARE SECTION;
sno = 20181234;
EXEC SQL SELECT 학번, 성명, 학과
INTO :sno, :sname, :sdept
FROM 학생 WHERE 학번 = :sno;
/*삽입 SQL (호스트 변수 포함)*/
IF (SQLSTATE = '00000') /*실행 상태*/
.. ...;
ELSE ...;
☞ 단일 레코드 검색
#include <stdio.h>
int main()
{
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[10];
char sdept[20];
EXEC SQL END DECLARE SECTION;
sno = 20181234;
EXEC SQL CONNECT TO academicDB USER kim;
EXEC SQL SELECT sno, sname, sdept
INTO :sno, :sname, :sdept
FROM student WHERE sno = :sno;
printf("Student no : %s, name : %s, dept : %s", sno, sname, sdept);
return 0;
}
WHERE 절을 만족하는 레코드가 오직 하나만 있을 때
그 레코드의 학번, 성명, 학과 값이 호스트 변수 sno, sname, sdept에 저장된다.
☞ 단일 레코드 갱신
학번 20183654 학생이 수강한 학생의 점수를 호스트 변수 x 값만큼 증가시켜라.
EXEC SQL UPDATE 수강
SET 점수 = 점수 + :x WHERE 학번 = 20183654;
☞ 복수 레코드 검색
여러 개의 레코드가 검색되는 삽입 SQL문
집합 속에 있는 레코드를 하나씩 접근하기 위해 커서(cursor)를 사용한다.
- DECLARE CURSOR문은 뒤에 나오는 SELECT 문을 연결한다.
- SELECT 문은 CURSOR가 OPEN 될 때 실행된다.
- 커서는 각 튜플을 가리키는 포인터로 생각할 수 있다.
- CURSOR가 OPEN 될 때 SELECT 문이 실행된다.
- 결과의 첫 번째 튜플 이전을 커서가 가리키게 된다.
- FETCH 문은 커서를 다음 튜플로 이동하게 한다.
- DO... END 문 내에서 루프(loop)를 수행한다.
- 더 이상 레코드가 없으면 루프가 종료되고, CLOSE 문에서 커서를 닫는다.
EXEC SQL DECLARE cur CURSOR FOR /*커서의 정의*/
SELECT 학번, 성명, 학과
FROM 학생 WHERE 학과 = :sdept;
EXEC SQL OPEN cur; /*SELECT문 실행*/
DO
EXEC SQL FETCH cur INTO :sno,:sname,:sdept;
/*다음 레코드 채취*/
......
END;
EXEC SQL CLOSE cur; /*커서 종료 */
커서가 가리키는 특정 레코드 CURRENT OF cur을 변경하거나 삭제하는 예
변경
EXEC SQL UPDATE 학생 SET 학과 = :sdept
WHERE CURRENT OF cur;
삭제
EXEC SQL DELETE FROM 학생
WHERE CURRENT OF cur;
▶동적 SQL
온라인 애플리케이션의 수행과정은 다음과 같다.
- 터미널로부터 명령문을 접수
- 입력된 명령문을 분석
- 데이터베이스에 대한 적절한 SQL문으로 지시
- 터미널에 메시지나 결과를 반환
이때, 입력 명령문이 상황에 따라 다른 경우 SQL문을 미리 만들어 두는 것이 불가능하게 된다.
따라서 SQL문을 동적으로 작성할 수 있도록 지원하는 기능을 동적 SQL이라 한다.
가장 중요한 기본적인 명령은 PREPARE와 EXECUTE
- PREPARE
- 주어진 SQL문을 예비 컴파일하여 목적 코드를 생성하고 stSQL에 저장
- EXECUTE
- 저장되어 있는 stSQL의 SQL 목적 코드를 실행
varchar staticSQL[256]; //호스트 변수
staticSQL = “SELECT * FROM 수강
WHERE 과목코드 = 'CO123' AND 점수>= 90”;
EXEC SQL PREPARE stSQL FROM :staticSQL;
EXEC SQL EXECUTE stSQL;
스트링으로 표현되는 staticSQL문에는 호스트 변수를 사용하지 못한다.
그러나, 물음표(?)로 표현되는 매개변수는 사용 가능하다.
Varchar dynamicSQL[256];
dynamicSQL = “SELECT * FROM 수강
WHERE 과목코드=? AND 점수>=? ”;
........
EXEC SQL PREPARE dySQL FROM :dynamicSQL;
........
code=‘CO123’;
score=90;
EXEC SQL EXECUTE dySQL USING :code, :score;
- 위의 dynamicSQL에는 2개의 물음표 매개변수가 포함되어 있다.
- 물음표를 포함한 SQL문 실행을 위해 USING 절을 사용한다.
- 호스트 변수 :code와 :score의 값이 SELECT문의 물음표 순서에 대응한다.
'컴퓨터공학 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 데이터베이스 정규화 - 정규형 (2) | 2022.11.12 |
---|---|
[데이터베이스] 데이터베이스 정규화 (2) | 2022.11.12 |
[데이터베이스] SQL - Structured Query Language2 (0) | 2022.11.11 |
[데이터베이스] SQL - Structured Query Language (0) | 2022.11.10 |
[데이터베이스] 관계형 해석 (0) | 2022.10.18 |