Embedded SQL (임베디드 SQL)
- 프로그램에 직접 SQL 구문을 포함시키는 방식
- Precompiler를 사용하여 SQL 코드를 C 코드로 변환
- 대표적인 예로 Oracle의 Pro*C, IBM의 DB2, 그리고 Sybase의 Embedded SQL 등이 있음
#include <stdio.h>
#include <sqlca.h>
/* 변수 선언 */
EXEC SQL BEGIN DECLARE SECTION;
int employee_id;
char employee_name[50];
EXEC SQL END DECLARE SECTION;
int main() {
/* 데이터베이스 연결 */
EXEC SQL CONNECT TO 'my_database' AS 'db_conn' USER 'username' USING 'password';
/* SQL 문 실행 */
EXEC SQL SELECT name INTO :employee_name FROM employees WHERE id = :employee_id;
/* 결과 출력 */
printf("Employee Name: %s\\n", employee_name);
/* 데이터베이스 연결 종료 */
EXEC SQL COMMIT WORK;
EXEC SQL DISCONNECT 'db_conn';
return 0;
}
호스트 변수 선언
/* 변수 선언 */
EXEC SQL BEGIN DECLARE SECTION;
int employee_id;
char employee_name[50];
EXEC SQL END DECLARE SECTION;
변수들은 SQL문에서 사용 가능
데이터베이스 연결
EXEC SQL CONNECT TO 'my_database' AS 'db_conn' USER 'username' USING 'password';
데이터 조회 후 변수에 저장
EXEC SQL SELECT name INTO :employee_name FROM employees WHERE id = :employee_id;
id가 employee_id인 사원의 이름을 조회 후 employee_name이라는 변수에 저장
데이터 수정
/* 특정 직원의 이름 업데이트 */
EXEC SQL UPDATE employees
SET name = :new_employee_name
WHERE id = :employee_id;
트랜잭션 커밋
EXEC SQL COMMIT WORK;
동적 SQL
#include <stdio.h>
#include <string.h>
#include <sqlca.h>
/* 변수 선언 */
EXEC SQL BEGIN DECLARE SECTION;
int employee_id;
int new_employee_age;
char sql_statement[256];
EXEC SQL END DECLARE SECTION;
int main() {
/* 데이터베이스 연결 */
EXEC SQL CONNECT TO 'my_database' AS 'db_conn' USER 'username' USING 'password';
/* 예시로 사용할 ID와 새로운 나이 설정 */
employee_id = 1002;
new_employee_age = 30;
/* 동적 SQL 문 작성 */
snprintf(sql_statement, sizeof(sql_statement),
"UPDATE employees SET age = ? WHERE id = ?");
/* SQL 문 준비 */
EXEC SQL PREPARE stmt FROM :sql_statement;
/* 준비된 SQL 문에 변수 바인딩 및 실행 */
EXEC SQL EXECUTE stmt USING :new_employee_age, :employee_id;
/* 업데이트 결과 확인을 위해 SELECT 문 실행 */
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT id, age
FROM employees
WHERE id = :employee_id;
/* 커서 열기 */
EXEC SQL OPEN emp_cursor;
/* 데이터 가져오기 */
int fetched_id;
int fetched_age;
EXEC SQL FETCH emp_cursor INTO :fetched_id, :fetched_age;
/* 결과 출력 */
if (sqlca.sqlcode == 0) {
printf("Employee ID: %d, Updated Age: %d\\n", fetched_id, fetched_age);
} else {
printf("No data found for Employee ID: %d\\n", employee_id);
}
/* 커서 닫기 */
EXEC SQL CLOSE emp_cursor;
/* 트랜잭션 커밋 */
EXEC SQL COMMIT WORK;
/* 데이터베이스 연결 종료 */
EXEC SQL DISCONNECT 'db_conn';
return 0;
}