본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

호출 수준 인터페이스(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) 매개변수·결과 열의 형식 정보
  1. 환경 설정 - SQLAllocHandle(SQL_HANDLE_ENV, ...) 로 환경 핸들을 만든다
  2. 연결 - 연결 핸들을 만들고 SQLConnect 로 데이터베이스에 접속한다
  3. 문장 준비 - 문장 핸들을 만들고 SQLPrepare 로 SQL 문자열을 준비한다. 값이 들어갈 자리는 ? 로 둔다
  4. 매개변수 연결 - SQLBindParameter 로 ? 자리를 프로그램 변수에 묶는다
  5. 실행 - SQLExecute 로 준비된 문장을 실행한다(준비 없이 한 번에 실행하려면 SQLExecDirect)
  6. 결과 열 연결 - 질의 결과가 돌아오면 SQLBindCol 로 결과의 각 열을 프로그램 변수에 묶는다
  7. 인출 - SQLFetch 를 되풀이해 한 행씩 변수로 읽어 온다
  8. 마무리 - 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 인출 */

JDBC·ODBC 와 구별하기

편집 원본 편집
구분 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 등
  1. ↑ 「ODBC Overview」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/odbc-overview, 확인일: 2026-11-04.
  2. ↑ 「SQLPrepare Function」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlprepare-function, 확인일: 2026-11-04.
  3. ↑ 「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.
  4. ↑ 「Basic ODBC Application Steps」, Microsoft Learn, https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/basic-odbc-application-steps, 확인일: 2026-11-04.