Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

SYDev

[데이터베이스] 4장. 관계대수와 SQL - 2 본문

3학년 1학기 전공/데이터베이스

[데이터베이스] 4장. 관계대수와 SQL - 2

시데브 2024. 4. 24. 16:56
경희대학교 이영구 교수님의 데이터베이스 수업 복습용 게시물입니다.

 

불일치 문제와 커서

  • 호스트 언어 단일 변수/레코드 위주의 처리(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 키워드 사용 가능