내장 SQL은 프로그래밍 언어 내에 직접 SQL 쿼리를 포함하여 데이터베이스에 접근하는 방법이다.
SQL은 사용하기 쉬운 언어지만, 호스트 언어가 갖고 있는 조건문, 반복문, 입출력 등과 같은 동작, 사용자와의 상호 작용, 질의 결과를 GUI로 보내는 기능을 갖고 있지 않다.
그래서 호스트 언어(Host Language: C, C++, COBOL, Java 등)로 작성하는 프로그램에 SQL문을 삽입하여 데이터베이스를 접근하는 부분을 SQL이 맡고, SQL에 없는 기능은 호스트 언어로 작성한다.
개발자는 호스트 언어와 SQL 모두 익숙해야 하며, 두 언어 사이의 인터페이스와 데이터 타입 호환성, 임피던스 불일치(impedance mismatch) 문제 등을 해결해야 한다.
임피던스 불일치(Impedance Mismatch)
호스트 언어에서 제공하는 데이터 구조와 DBMS가 제공하는 데이터 구조가 불일치하는 문제
내장 SQL 프로그램은 컴파일하기 전에 특별한 전처리기를 통해 우선 처리가 되어야 한다.
장점
성능 향상
데이터 베이스 작업을 최적화하여 빠르게 수행할 수 있다.
간편한 데이터베이스 접근
코드 내에서 직접 SQL 쿼리를 작성하고 실행할 수 있어, 데이터베이스와의 상호작용이 간편하다.
단점
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[11];
char dept[6];
char SQLSTATE[6];
EXEC SQL END DECLARE SECTION;
sno = 100;
EXEC SQL select sname, dept
into :sname, :dept
from student
where sno = :sno;
if (strncmp(sqlca.sqlstate, "00000", 5) == 0) {
printf("Student Name: %s, Department: %s\n", sname, dept);
} else if (strncmp(sqlca.sqlstate, "02000", 5) == 0) {
printf("No data found for student number: %d\n", sno);
} else {
printf("Error occurred. SQLSTATE: %s\n", sqlca.sqlstate);
}
EXEC SQL BEGIN DECLARE SECTION;과 EXEC SQL END DECLARE SECTION; 사이에 내장 SQL에서 사용할 변수 선언sno 학생 번호를 저장할 정수형 변수sname 학생 이름을 저장할 문자열 변수dept 학생의 학과를 저장할 문자열 변수SQLSTATE SQL 상태 코드를 저장할 문자열 변수sno에 100 할당. 조회할 학생 번호sname과 dept에 저장됨sqlca.sqlstate 값을 직접 확인하여 쿼리 실행 결과 처리sqlca.sqlstate가 "00000"이면 쿼리가 성공적으로 실행되었음을 나타내고, 학생의 이름과 학과 출력sqlca.sqlstate가 "02000"이면 조회된 데이터가 없음을 나타내고, "No data found" 메시지 출력sqlca.sqlstate 값이 발생하면 에러 메시지와 상태 코드를 출력합니다.참고
데이터베이스론