본문 바로가기
  • 개발 삽질 블로그
프로그래밍

[C/C++] Embedded SQL

by 갹둥 2024. 5. 28.

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;
}