🍏 내포된 SQL (Embedded SQL)
= 호스트 언어에 포함되는 SQL문
- 다른 언어의 프로그램에 SQL을 삽입해서 DB를 접근할 수록 있도록 하는 것
- impedance mismatch 문제
데이터 구조가 불일치하는 문제
✅ Pro*C
- 오라클에서 C 프로그램에 SQL문 내포시키는 방법
- 확장자 : .pc
- pc 파일을 Pro*C를 통하여 전컴파일하면 .c인 소스 프로그램이 생성됨
✅ 호스트 변수 (host variable)
- SQL문에 포함된 C 프로그램 변수
- 호스트 언어와 SQL문 사이 통신 담당
- SQL문에 사용될 데이터 값을 입력하거나
- SQL문 결과 출력
- 호스트 변수를 SQL 문에서 사용할 때 콜론(:)을 붙인다.

✅ 정적인 SQL문
- C 프로그램에 내포된 완전한 SQL문
- C 프로그램 변수들 포함 가능

✅ 동적인 SQL문
- SQL문(strcpy~)이 문자열 상수 -> 동적으로 변경 가능
- 불완전한 SQL문으로서 질의가 수행될 때 입력 가능하다.
- 개발할 때 완전한 SQL문 구조를 몰라도 된다.

- PREPARE : 질의 수행 계획을 만들기
- EXECUTE : 수행
- 왜 단계를 두개로 분리? (prepare/execute)
질의 최적화 과정에서 비용이 많이 들기 때문에 한 번 최적화를 하고 재활용하면 prepare없이 excute 가능하다. 만일 수행을 한번만 해도 된다면 단계 분리 안하고 묶어서 가능.
🍏 불일치 문제와 커서
- 불일치 문제 = impedance mismatch
= 호스트 언어와 SQL의 데이터 구조 불일치 문제
- 해결 방법 = 커서(cursor)
- 두 개 이상의 튜플을 검색하는 SQL문에 대해서 커서를 꼭 사용해야 한다.
- 호스트 언어
단일 변수 / 레코드 위주 처리 (튜플 위주)
- SQL
데이터 레코드들의 처리 (집합 위주)
-> 불일치 문제 발생
✅ 커서 (Cursor)
= 한 번에 한 튜플씩 가져오는 방법
= 여러 튜플 읽어오고 싶을 때 : for문 안에 FETCH
- DECLARE CURSOR : 커서 정의
- OPEN : 질의 수행 / 첫 튜플 이전을 커서가 가리키도록 한다.
- FETCH : 커서를 다음 튜플로 이동 / 튜플의 애트리뷰트 값들을 FETCH문에 명시된 호스트 변수들에 복사
- CLOSE : 커서 닫기

✅ WHENEVER
= 자동적인 에러 검사 및 처리를 위한 구문

✅ SQL 통신 영역 (SQLCA)
= SQL Communications Area
- C 프로그램에 내포된 SQL문에 발생하는 에러들을 사용자에게 알려준다.
- sqlcode : 값이 0이면 마지막에 내포된 SQL문이 성공적으로 끝났다
✅ 오라클 통신 영역 (ORACA)
= Oracle Communications Area
- SQLCA라는 SQL 표준을 오라클에서 확장한 구조체
- SQLCA 이외에 추가로 필요한 정보를 호스트에 제공하기 위한 구조체
✅ 에러 메세지 : sqlglm ( )
- 에러가 난 것을 미리 확인하고 사용
= WHENEVER 사용 / SQLCODE 값이 0이 아닐때
✅ SQLSTATE 상태 변수
= 내포된 SQL의 에러처리를 위해 도입
이전에는 SQLCODE를 사용했는데, Oracle 전처리기 옵션을 수정하면 SQLSTATE을 사용할 수 있다.
CLASS CODE(2) + SUBCLASS CODE(3)
✅ 지시 변수 (Indicator Variables)
- NULL 값 여부 등 호스트 변수에 대한 추가적인 정보 제공
- 2 byte 정수로 표현
- 호스트 변수 바로 다음에 선택적으로 추가한다
- 지시 변수도 앞에 콜론( : )을 붙인다
- 호스트 변수와 지시 변수 사이에 선택적으로 INDICATOR 키워드 사용 가능
