일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- GPT-4
- 머신러닝
- LG Aimers 4th
- Classification
- 해커톤
- 분류
- 티스토리챌린지
- supervised learning
- gpt
- 오블완
- AI
- deep learning
- LG Aimers
- Machine Learning
- 회귀
- PCA
- 딥러닝
- ChatGPT
- OpenAI
- regression
- LG
- LLM
- 지도학습
Archives
- Today
- Total
SYDev
[데이터베이스] 4장. 관계대수와 SQL - 2 본문
경희대학교 이영구 교수님의 데이터베이스 수업 복습용 게시물입니다.
불일치 문제와 커서
- 호스트 언어는 단일 변수/레코드 위주의 처리(Tuple 위주의 방식)를 지원하는 반면, SQL은 데이터 레코드들의 처리(집합 위주의 방식)를 지원하기 때문에 불일치 문제 발생
- 불일치 문제를 해결하기 위해서 커서(cursor)가 사용됨
- 두 개 이상의 tuples를 검색하는 SQL문에 대해서 반드시 커서를 선언하고 사용해야 함
- 커서는 한 번에 한 tuple씩 가져오는 수단
커서
- DECLARE CURSOR문을 사용하여 커서 정의
- OPEN cursor문은 질의 수행, 질의 수행 결과의 첫 번째 투플 이전을 커서가 가리키도록 한다. 이것이 커서의 현재 tuple
- 그 다음에 FETCH문은 커서를 다음 tuple로 이동 -> 그 tuple의 attribute값들을 FETCH문에 명시된 호스트 변수들에 복사
- CLOSE cursor는 커서를 닫음
EXEC SQL BEGIN DECLARE SECTION;
char name[] = "박영권";
char title[10];
EXEC SQL END DECLARE SECTION;
EXEC SQL
DECLARE title_cursor CURSOR FOR
SELECT title FROM employee WHERE empname = :name;
EXEC SQL OPEN title_cursor;
EXEC SQL FETCH title_cursor INTO :title;
- 여러 tuple을 읽어오기 위해서는 루프 내의 FETCH문 사용
- 루프 종료 조건: 결과 집합이 비었거나 더 이상의 가져올 투플이 없으면 FETCH문은 'no data found'에러를 발생시키고, WHENEVER NOT FOUND가 이를 인지함
- SQLCODE를 검사하는 방법을 사용할 수도 있음
WHENEVER
- 자동적인 에러 검사와 에러 처리를 위한 구문
구문
WHENEVER <조건> <동작>
조건
- NOT FOUND: WHERE절을 만족하는 투플이 없거나, SELECT INTO 혹은 FETCH가 row를 리턴하지 않음
- SQLERROR: 에러가 발생한 경우
- SQLWARNING: 경고가 발생한 경우
동작
- CONTINUE, GOTO, STOP, DO
- CONTINUE: WHENEVER문을 사용하지 않는 것과 같은 효과
- DO {function call | continue | break}: 프로그램 제어를 이동
- STOP: 프로그램 종료. COMMIT되지 않은 WORK는 ROLLBACK
CURSOR를 이용한 UPDATE
- 커서의 현재 tuple을 업데이트하려면 CURRENT OF 절을 사용하면 됨
- CURSOR를 선언할 때 FOR UPDATE OF 키워드를 선택적으로 추가 -> 개발자가 추가하지 않아도, UPDATE 또는 DELETE 문에 CURRENT OF 절이 나오면 전처리기가 필요 시 추가함
- 제약: Index-organized 테이블에는 사용 금지. 한 테이블의 attribute들만 수정 가능
EXEC SQL DECLARE title_cursor CURSOR FOR
SELECT title FROM employee WHERE employee_name = :name
FOR UPDATE OF title; //업데이트가 필요한 attribute
...
EXEC SQL FETCH title_cursor INTO :title;
EXEC SQL UPDATE employee SET title = '상무'
WHERE CURRENT OF title_cursor;
SQL 통신 영역(SQLCA: SQL Communications Area)
- C 프로그램에 내포된 SQL문에 발생하는 에러들을 사용자에게 알림
- 사용자는 SQLCA 데이터 구조 (SQLCA.H)의 에러 필드와 상태 표시자를 검사 -> 내포된 SQL문이 성공적으로 수행되었는가 또는 비정상적으로 수행되었는가를 파악할 수 있음
- SQLCA 데이터 구조 중에서 가장 중요하고 널리 사용되는 필드 -> sqlcode 멤버 변수
- sqlcode 값이 0 -> 마지막에 내포된 SQL문이 성공적으로 끝났음을 의미
- SQLCA를 사용하기 위해서는 아래와 같은 문장을 포함해야 함
EXEC SQL INCLUDE SQLCA.H
#include <sqlca.h>
오라클 통신 영역(ORACA: Oracle Communications Area)
- SQLCA라는 SQL 표준을 오라클에서 확장한 구조체
- sqlca에서 얻을 수 있는 정보 외에 추가로 필요한 정보를 호스트 프로그램에게 제공하기 위한 구조체
EXEC SQL DECLARE c1 CURSOR FOR
SELECT empno, empname, title, manager, salary, dno
FROM employee;
EXEC SQL OPEN c1;
while(SQLCODE == 0) {
//데이터를 성공적으로 가져올 수 있으면 sqlcode 값이 0
EXEC SQL
FETCH c1 INTO :eno, :name, :title, :manager, :salary, :dno;
if(SQLCODE == 0) {
printf("%4 %12s %12s %4d %8d %2d", eno, name, title, manger, salary, dno);
}
}
}
EXEC SQL CLOSE c1;
에러 메시지: sqlglm() 함수 사용
- 에러 난 것을 먼저 확인하고 써야함 -> WHENEVER 사용 혹은 SQLCODE(or sqlca.sqlcode)값이 0이 아닐 때
SQLSTATE 상태 변수
- SQL92 표준에서는 내포된 sql의 에러 처리를 위해 SQLSTATE변수를 도입(이전에는 SQLCODE 사용, Oracle의 전처리기 옵션에서 mode = ANSI로 하여 사용 가능 -> mode = ORACLE일 시에 SQLCA 사용)
- 예외의 유형을 구분하는 CLASS CODE(2자리 문자)와 구체적 예외를 나타내는 SUBCLASS CODE(3자리 문자)의 총 5자리 문자의 값을 가짐 -> 각 자리는 0..9 또는 A..Z
- 선언(declaration) 필요: char SQLSTATE[6];
지시 변수(indicator variables)
- NULL 값 여부 등 호스트 변수에 대한 추가적인 정보 제공
- 2반이트 정수로 표현
- 호스트 변수 바로 다음에 지시 변수를 선택적으로 추가 -> 지시 변수도 앞에 콜론(:) 붙임, 호스트 변수와 지시 변수 사이에 선택적으로 INDICATOR 키워드 사용 가능
'3학년 1학기 전공 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 5.2. ER 모델 (1) | 2024.05.03 |
---|---|
[데이터베이스] 5.1. 데이터베이스 설계의 개요 (0) | 2024.05.02 |
[데이터베이스] LAB4-sql_6 (0) | 2024.04.14 |
[데이터베이스] 4장. 관계 대수와 SQL (0) | 2024.03.20 |
[데이터베이스] 2장. 관계 데이터 모델과 제약 조건 (3) | 2024.03.14 |