4장 관계대수와 SQL(트리거, 내포된 SQL)

<트리거와 주장>

- 트리거 : 명시된 이벤트가 발생할 때 마다 DBMS가 자동으로 수행하는 프로시저

-> 사용자 정의대로 수행되고, DB의 무결성 유지를 위한 일반적이고 강력한 도구임

- ECA(이벤트-조건-동작) 규칙이라고도 부름

- 트리거를 활성화 시키는 사건인 이벤트, 활성화 되었을 때 수행되는 조건, 활성화 되고 조건이 참일 때 수행되는 프로시저인 동작을 표현해야 함(조건이 만족되는지 테스트 후 만족되면 트리거 동작 수행)

- AFTER : 이벤트 수행 후 트리거, BEFORE : 이벤트 수행 전 트리거

-> 활성화는 무조건 이벤트 수행 전에 됨.

- 조건 : 임의의 프레디키트(논리적 식, 표현)

- 50만원이라면, 늘어도 55만원 -> 완벽한 트리거는 아님

-> 앞의 문법과 조금 다름.. AFTER도 없다! FOR INSERT이므로 INSERT 이후에 트리거가 실행됨.

 

- 트리거는 연쇄적으로 활성화 될 수 있음

ex) 업데이트 테이블 1에 정의된 트리거가 활성화 -> BEFORE + 인서트 이벤트가 있으니까, 테이블1 전에 테이블2에 정의된 트리거가 활성화 -> ...

이런식으로 돌다 보면 무한 루프가 될 수도 있기에 신중히 작성해야함.

 

- 트리거보다 좀 더 일반적인 무결성 제약조건 -> 대부분 지원하지 않기에 넘어감

 

< 내포된 SQL >

- 모든 질의를 SQL로 표현할 수 없음. SQL은 조건,반복문, 입출력, 상호작용, GUI등의 기능이 없음

-> DB접근은 SQL문이, C 등의 언어에 SQL문을 삽입하여 없는 기능은 호스트 언어로 작성해야함.
-> 여기에 포함된 SQL문이 내포된 SQL

 

- 호스트언어 구문과 구분을 위해 SQL문의 첫 키워드는 EXEC SQL을 붙임

-> 프리컴파일러가 C컴파일러 이전에 우선하여 번역 후 C컴파일러의 함수호출명으로 변경시켜줌

 

- 프리컴파일러가 동작할 때, 이렇게 ODBC, JDBC와 같은 DBMS가 제공하는 유틸리티가 사용

- 정적인 SQL문은 입출력 데이터를 위해 C 변수 포함 가능.

- 동적인 SQL문은 불완전 -> 일부 또는 전부를 질의가 수행될 때 입력 가능

 

-> SQL문에 포함된 C 변수 : 호스트 변수

- 위 이미지는 호스트 변수 선언부임. EXEC SQL로 시작하고, 헤더파일도 선언해줘야함.

 

 

 

- 사원번호 입력하세요 하면 int형을 넣겠지. -> SQL문장에서 가져다 쓸 땐 이 no를 :no라고 해야함.

-> 그때그때 검색하려면 키보드에서 입력받아야하는데 그 기능이 SQL에 없으니까 C변수로 받아서 사용하는것.

 

- 이후 검색한 title값을 C 변수에 담아야하니까 INTO가 나오는 것.

- COMMIT WORK : 완료해라!

- errexit : 에러 발생시 롤백 = 트랜잭션을 취소해라. 이 케이스에서는 검색이니까 롤백이 필요없긴 함.

 

 

- 호스트 언어는 한 번에 하나의 변수 레코드(구조체로 정의)를 처리하는 반면, SQL은 한번에 여러 레코드 처리

-> 한꺼번에 넘겨주는게 불가능하기에 커서가 사용됨

- 2개 이상의 투플을 검색하는 SQL문에서는 반드시 커서를 선언해야함 : 한 번에 한 투플씩 가져오는 수단임

 

- OPEN cursor 만나면 DECLARE CURSOR에서 정의한 SELECT문이 수행되고, 결과의 첫번째 투플 이전(직전)을 커서가 가리키게 됨. 그 위치가 현재 투플.

-> FETCH문으로 다음 투플로 이동함.

- name과 title이 C변수

- 선언한 title_cursor은 바로 아래  SELECT문과 대응 -> 실행시 이름이 하나씩 나옴(유니크라면)

- FETCH문에서 더 가져올 투플이 없다 -> no data found

- 조건절(WHERE)을 만족하는 투플이 없다면 not found, 에러라면 SQLERROR

CONTINUE : 다음 문장 수행, GOTO : 특정 레이블로 이동, DO BREAK : 루프 빠져나옴

- 내포된 SQL에서 투플을 갱신할 땐 커서 선언부에 FOR UPDATE OF 절을 포함.

- SQLCA : 실행시 C에서도, SQL에서도 에러 발생 가능 -> 그 사이 수행결과를 공유하는 데이터 구조

-> SQLCA 데이터구조 = SQLCA.H의 에러필드와 상태표시자를 검사함

-> 내포된 SQL문의 수행 여부를 파악 가능

- SQLCODE : 테스트하기 직전에 수행한 SQL문이 성공했는지 실패했는지 알려줌. 0이면 성공!

ex) EXEC SQL INCLUDE SQLCA.H, #include <sqlca.h>

 

- ORACA : 오라클에서 SQLCA를 확장함. 추가적 정보를 호스트에게 제공하기 위한 구조체

 

 

- c1 커서에 대응되는 실렉트문에는 6개의 컬럼, 7개의 레코드가 있음 -> 커서는 첫번째 레코드 직전을 가리킴

-> fetch시 다음 레코드로 이동 : 그게 첫 번째 레코드 -> 6개의 컬럼이 6개의 변수에 할당됨

 

SQLCODE가 0이면 다음칸으로 fetch -> 다 읽고 나면 더 할 게 없으니 코드가 0이 아닐 것이고, 빠져나와서 CLOSE하게 됨 -> 임시 공간에 있던 테이블을 반환하고 지움