C/C++, 코볼, 자바 등의 언어로 작성하는 프로그램에 SQL문을 삽입하여 데이터베이스를 접근하는 부분을 SQL이 담당하며 SQL에 없는 기능을 호스트 언어로 작성한다.
호스트 언어에 포함되는 SQL문을 내포된 SQL이라고 부른다.
전컴파일러로 컴파일을 수행하면 내포된 SQL문이 함수호출문으로 변경된다.
불완전한 SQL문으로서 일부 또는 전부를 질의가 수행될 때 입력이 가능하다
응용을 개발할 때 완전한 SQL문의 구조를 미리 알고 있지 않아도 된다.
문자열 형 변수에 담아서 표현함으로써 동적으로 변경 가능하다
컴파일 시점에 SQL문을 알지 못한다. 프로그램 실행 중 최적화를 한다.
PREPARE : 수행속도가 가장 빠른 것을 고르는 질의 최적화 단계, 수행 계획을 만든다.
EXECUTE IMMEDIATE : 질의 최적화 단계를 거치지 않고 실행한다.
# include <stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
int no;
varchar title[10];
EXEC SQL END DECLARE SECTION; // 호스트 변수 선언
EXEC SQL INCLUDE SQLCA.H; // SQL 통신 영역
void main()
{
char *uid = "KIM/kim@DBSERVER";
EXEC SQL WHENEVER SQLERROR GOTO ERREXIT; // 에러 대응
EXEC SQL CONNECT :uid;
// DBSERVER 데이터베이스에 사용자 KIM으로 접속
printf("Enter employee number : ");
scanf("%d", &no);
EXEC SQL SELECT title INTO :title // attribute와 호스트 변수 순서
printf("\nAuthor's title is %s\n", title);
EXEC SQL COMMIT WORK;
exit(0);
errexit:
EXEC SQL ROLLBACK WORK;
exit(1);
}
여러 투플을 읽어 오기 위해서는 루프 내의 FETCH문을 사용한다.
루프 종료 조건 : 결과 집합이 비었거나 더이상의 가져올 투플이 없으면 FETCH문은 ‘no data found’ 에러를 발생시키고, WHENEVER NOT FOUND가 이를 인지한다.
C 프로그램에 내포된 SQL문에 발생하는 에러들을 사용자에게 알려준다.
사용자는 SQLCA 데이터 구조(SQLCA.H)의 에러 필드와 상태 표시자를 검사하여 내포된 SQL문이 성공적으로 수행되었는가 또는 비정상적으로 수행되었는가를 파악할 수 있다.
SQLCA 데이터 구조 중에서 가장 중요하고 널리 사용되는 필드는 sqlcode 멤버 변수
sqlcode의 값이 0이면 마지막에 내포된 SQL문이 성공적으로 끝났음을 의미한다.
SQLCA를 사용하기 위해서는 아래와 같은 문장을 포함해야 함
EXEC SQL INCLUDE SQLCA.H;
or
#include <sqlca.h>