호출 수준 인터페이스
더 많은 작업
호출 수준 인터페이스(Call-Level Interface, CLI, SQL/CLI)는 응용 프로그램이 SQL 문을 소스 코드에 끼워 넣어 미리 컴파일하는 대신, 실행 중에 SQL 문자열을 함수 호출로 DBMS 에 넘겨 준비·실행하고 결과를 받아 오도록 정한 데이터베이스 접근 API 표준(ISO/IEC 9075-3)이다.
SQL 을 응용 프로그램에서 쓰는 방법은 크게 둘이다. 하나는 C 같은 호스트 언어 코드 안에 EXEC SQL 로 SQL 을 적고 전처리기로 바꾸는 내장(embedded) SQL 이고, 다른 하나는 SQL 문을 문자열로 만들어 라이브러리 함수에 넘기는 호출 수준 인터페이스이다. 호출 방식은 전처리기가 필요 없고, 드라이버만 바꾸면 같은 코드로 여러 DBMS 에 접근할 수 있다.
SQL/CLI 는 X/Open(지금의 Open Group) SQL Access Group 의 CLI 명세를 바탕으로 ISO/IEC SQL 표준의 한 부분(Part 3)이 되었다. 마이크로소프트의 ODBC 는 이 CLI 명세를 바탕으로 만든 API 이고, 함수 이름과 처리 순서가 거의 같다.[1] ODBC 의 SQLPrepare 함수 설명에는 표준 준수 수준이 ISO 92 로 적혀 있다.[2] 자바 쪽에서 같은 역할을 하는 것이 JDBC 이다.[3]
CLI 는 상태를 핸들(handle)이라는 기록 구조로 관리한다. 바깥 것이 먼저 있어야 안쪽 것을 만들 수 있다.
| 핸들 | 담는 것 |
|---|---|
| 환경 핸들(SQLHENV) | 응용 프로그램 전체의 환경 정보. 가장 먼저 만든다 |
| 연결 핸들(SQLHDBC) | 데이터베이스 하나와의 연결 |
| 문장 핸들(SQLHSTMT) | SQL 문 하나와 그 매개변수·결과 |
| 기술자 핸들(SQLHDESC) | 매개변수·결과 열의 형식 정보 |
- 환경 설정 -
SQLAllocHandle(SQL_HANDLE_ENV, ...)로 환경 핸들을 만든다 - 연결 - 연결 핸들을 만들고
SQLConnect로 데이터베이스에 접속한다 - 문장 준비 - 문장 핸들을 만들고
SQLPrepare로 SQL 문자열을 준비한다. 값이 들어갈 자리는?로 둔다 - 매개변수 연결 -
SQLBindParameter로?자리를 프로그램 변수에 묶는다 - 실행 -
SQLExecute로 준비된 문장을 실행한다(준비 없이 한 번에 실행하려면 SQLExecDirect) - 결과 열 연결 - 질의 결과가 돌아오면
SQLBindCol로 결과의 각 열을 프로그램 변수에 묶는다 - 인출 -
SQLFetch를 되풀이해 한 행씩 변수로 읽어 온다 - 마무리 -
SQLEndTran으로 커밋하거나 롤백하고, SQLDisconnect 와 SQLFreeHandle 로 연결과 핸들을 푼다
마이크로소프트의 ODBC 문서도 기본 흐름을 연결 → 초기화 → SQL 작성·실행 → 결과 인출 → 커밋 → 연결 해제 순으로 정리한다.[4]
순서가 바뀌지 않는 까닭은 의존 관계 때문이다. 환경이 있어야 연결을, 연결이 있어야 문장을 만들 수 있다. 매개변수는 준비된 문장에 묶어야 하므로 SQLPrepare 뒤, SQLExecute 앞이다. 결과 열은 실행해서 결과 집합이 생긴 뒤에 묶고 인출한다(결과 형식을 미리 알면 실행 전에 묶어도 되지만, 보통 실행 뒤에 묶는다).
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); /* 1 환경 */
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLConnect(dbc, "univdb", SQL_NTS, "user", SQL_NTS, "pw", SQL_NTS); /* 2 연결 */
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
SQLPrepare(stmt, "SELECT name FROM emp WHERE dno = ?", SQL_NTS); /* 3 준비 */
SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER,
0, 0, &dno, 0, NULL); /* 4 매개변수 */
SQLExecute(stmt); /* 5 실행 */
SQLBindCol(stmt, 1, SQL_C_CHAR, name, sizeof(name), &len); /* 6 결과 열 */
while (SQLFetch(stmt) == SQL_SUCCESS) printf("%s\n", name); /* 7 인출 */
| 구분 | SQL/CLI | ODBC | JDBC |
|---|---|---|---|
| 성격 | ISO SQL 표준의 호출 인터페이스 명세 | CLI 를 바탕으로 한 마이크로소프트 API | 자바 표준 API |
| 언어 | C 함수 호출 | C 함수 호출 | 자바 객체·메서드 |
| 준비·실행 | SQLPrepare, SQLExecute | SQLPrepare, SQLExecute | prepareStatement, executeQuery |
| 값 연결 | SQLBindParameter | SQLBindParameter | setInt, setString 등 |
| 결과 받기 | SQLBindCol, SQLFetch | SQLBindCol, SQLFetch | ResultSet.next, getString 등 |
- ↑ 「ODBC Overview」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/odbc-overview, 확인일: 2026-11-04.
- ↑ 「SQLPrepare Function」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlprepare-function, 확인일: 2026-11-04.
- ↑ 「Chapter 5: Advanced SQL」(JDBC, ODBC), Database System Concepts 7th Edition 강의자료, Silberschatz·Korth·Sudarshan, https://www.db-book.com/slides-dir/PDF-dir/ch5.pdf, 확인일: 2026-11-04.
- ↑ 「Basic ODBC Application Steps」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/basic-odbc-application-steps, 확인일: 2026-11-04.