tbESQL/C 소개

tbESQL/C의 기본 개념과 tbESQL/C 프로그래밍을 시작하기 전에 알아야 할 구성요소를 설명합니다.

개요

tbESQL은 ESQL(Embedded SQL: 내장 SQL)의 사용을 위해 Tibero가 제공하는 인터페이스입니다. 일반적으로 프로그래밍 언어는 매우 복잡하고 세밀한 작업을 빠르게 수행할 수 있으며, SQL 문장은 간단한 문법만으로 데이터베이스에 직접적인 작업을 수행할 수 있습니다.

ESQL은 이러한 프로그래밍 언어의 연산 능력과 SQL의 데이터베이스(Database)를 조작하는 능력을 결합하기 위한 방법이며, ANSI 및 ISO 표준으로 정의되어 있습니다.

Tibero에서는 애플리케이션 개발에 사용되는 C와 COBOL에 대한 tbESQL 인터페이스를 제공합니다. C 프로그래밍 언어를 위한 ESQL 인터페이스를 tbESQL/C라고 하며, COBOL 프로그래밍 언어에 대한 인터페이스를tbESQL/COBOL이라고 합니다.

circle-info

참고

tbESQL/COBOL에 대한 내용은 "Tibero tbESQL/COBOL 안내서"를 참고합니다.

구성요소

tbESQL/C 문장

tbESQL/C 프로그램에는 C 프로그래밍 언어의 소스 코드와 tbESQL/C 문장이 혼합되어 있습니다. tbESQL/C 프로그램 내에서 SQL 문장의 질의(Query) 등 데이터베이스 처리와 관련된 문장을 tbESQL/C 문장(tbESQL/C Statement)이라고 합니다.

tbESQL/C 문장은 일반 SQL 문장과 비슷하지만 다음과 같은 점에서 차이가 납니다.

  • 항상 EXEC SQL로 시작하고 세미콜론(;)으로 종료합니다.

  • 필요한 경우에 입력 변수와 출력 변수를 포함합니다.

  • 일반 SQL 문장에는 없는 새로운 절을 포함할 수 있습니다. 예를 들어 SELECT 문장은 INTO 절을 포함할 수 있습니다.

다음은 tbESQL/C 프로그램에서 UPDATE 문장을 작성한 예입니다.

[예 1] tbESQL/C에서의 UPDATE 문장

위의 예에서는 tbESQL/C 문장임을 나타내는 EXEC SQL로 시작된다는 점에서 일반 SQL 문장과 차이가 난다는 것을 알 수 있습니다.

circle-info

참고: EXEC SQL에 대한 자세한 내용은 “제8장 tbESQL/C 문장”을 참고합니다.

프로그램 변수

tbESQL/C 프로그램에서 가장 중요한 작업 중에 하나는 프로그램과 데이터베이스 간에 데이터를 전달하는 것입니다. 이러한 작업은 주로 프로그램 변수를 이용하여 수행합니다. 즉, 프로그램 변수를 이용하여 질의를 하거나 변수의 값을 데이터베이스에 저장할 수 있고, 데이터베이스의 컬럼 값을 프로그램 변수에 저장 할 수도 있습니다. 이러한 작업을 하기 위해서는 Tibero의 데이터 타입과 tbESQL/C 프로그램의 데이터 타입 간의 연관성이 필요합니다. 예를 들어 다음의 Tibero의 데이터 타입과 tbESQL/C 프로그램의 데이터 타입은 서로 대응됩니다.

Tibero의 데이터 타입
tbESQL/C 프로그램의 데이터 타입

NUMBER(p, s)

int, double

NUMBER 타입에서 p는 정밀도(Precision), s는 스케일(Scale)을 의미합니다.

circle-info

참고

Tibero의 데이터 타입과 tbESQL/C 프로그램의 데이터 타입 간의 대응에 대해서는 “데이터 타입 대응”을 참고합니다.

프로그램 변수 선언

tbESQL/C 프로그램에서의 변수는 C 프로그램의 변수와 거의 동일하게 선언되고 사용됩니다. 데이터베이스 작업과 관련되지 않는 변수는 C 프로그램에서 사용되는 것과 같이 제약 없이 사용할 수 있습니다.

다음은 tbESQL/C에서 프로그램 변수를 선언한 예입니다.

[예 2] tbESQL/C에서의 프로그램 변수의 선언

위의 예에서 VARCHAR 타입은 tbESQL/C 프로그램 내에서만 사용할 수 있는 타입이며, 프리컴파일 과정을 거쳐 C 프로그래밍 언어의 데이터 타입으로 변환됩니다.

입/출력 변수

데이터베이스 작업과 관련된 변수는 다음과 같이 두 가지로 구분됩니다.

  • 입력 변수 tbESQL/C 문장을 통해 컬럼의 값을 삽입, 갱신, 삭제할 때 데이터의 값을 설정하기 위한 변수입니다. 입력 변수는 다음과 같은 특징이 있습니다.

    • 입력 변수를 사용할 때는 반드시 변수 앞에 콜론(:)을 붙여야 합니다.

    • 입력 변수는 SELECT, INSERT, UPDATE, DELETE 문장과 WHERE 절과 SET 절 등의 컬럼 값의 위 치에 사용될 수 있습니다.

    • 입력 변수는 테이블 이름이나 컬럼 이름의 위치에는 사용될 수 없습니다.

  • 출력 변수 tbESQL/C 문장의 질의 수행 결과로 반환된 값을 저장하기 위한 변수입니다. 출력 변수는 다음과 같은 특징이 있습니다.

    • 입력 변수와 마찬가지로 변수 앞에 반드시 콜론(:)을 붙여야 합니다.

    • 출력 변수는 SELECT 문장의 INTO 절에 사용될 수 있습니다.

    • INTO 절에는 출력 변수와 함께 INDICATOR 키워드와 지시자 변수가 올 수 있습니다.

다음은 WHERE 절에 사용된 입력 변수 empno와 INTO 절에 사용된 출력 변수 ename, salary, addr를 사용한 예입니다.

[예 3] 입/출력 변수의 사용

위의 문장을 실행하기 전에 empno 값을 설정하는 코드가 와야 하며, 또한 문장이 실행된 후에는 반환된 ENAME, SALARY, ADDR 컬럼 값에 대한 적절한 작업이 진행되어야 합니다.

구조체 및 배열 변수

구조체와 배열 변수는 동시에 여러 개의 입/출력 변수를 처리하는 자료 구조입니다.

구조체

tbESQL/C 프로그램에서는 보통 동시에 여러 개의 입력 변수나 출력 변수가 사용됩니다. [예 1.3]의 경우에 도 SELECT 문장의 INTO 절에서 세 개의 출력 변수(ename, salary, addr)가 사용되었습니다. 또한 INSERT 문 장을 사용할 경우에는 여러 개의 입력 변수가 사용될 수 있습니다.

이렇게 여러 개의 입력 변수나 출력 변수가 사용될 경우 tbESQL/C 프로그램에서도 C 프로그래밍 언어에서처럼 여러 개의 변수를 묶어 하나의 구조체로 사용할 수 있습니다.

circle-info

참고: 입/출력 구조체 변수에 대한 자세한 내용은 “구조체”를 참고합니다.

배열 변수

SELECT 문장을 실행한 결과의 로우 개수는 대개의 경우 하나 이상이며, INSERT 문장을 실행할 때에도 보통 하나 이상의 로우를 삽입하게 됩니다. 이때 각각의 로우에 대해 개별적으로 SQL 문장을 여러 번 실행 하지 않고, 출력 변수나 입력 변수를 배열로 선언하여 SQL 문장을 한 번만 실행할 수도 있습니다.

출력 변수나 입력 변수를 배열로 선언한 경우 각각을 출력 배열 변수, 입력 배열 변수라고 부릅니다. 또한 이 두 가지 변수를 한꺼번에 지칭할 때는 입/출력 배열 변수라고 합니다. 출력 배열 변수를 이용하여 SELECT 문장을 실행하는 경우 각 결과 로우는 결과 로우의 개수와 동일한 크기를 갖는 출력 배열 변수에 저장됩니다.

tbESQL/C 프로그램에서는 하나 이상의 결과 로우가 반환되는 SELECT 문장에 출력 배열 변수나 커서를 사용하지 않으면 에러를 반환합니다. 구조체도 배열 변수로 선언하여 사용할 수 있으며, 이를 구조체 배열 변수라고 부릅니다.

circle-info

참고: 입/출력 배열 변수와 구조체 배열 변수에 대한 자세한 내용은 “배열 변수”를 참고합니다.

커서

커서는 SELECT 문장을 실행한 결과로 반환된 다수의 로우 각각에 차례대로 액세스하는 데이터 구조입니다. SELECT 문장을 실행한 결과로 반환되는 로우의 개수는 기본 키에 대한 질의가 아니라면 대부분 하나 이상입니다. 또한 반환되는 로우의 개수를 미리 알 수 없는 경우가 많기 때문에 SELECT 문장의 INTO 절에 변수를 하나만 명시해서는 모든 로우의 데이터를 저장할 수 없습니다. 이러한 경우 프로그램을 보다 간편하고 편리하게 작성하기 위해 앞 절에서 설명한 배열 변수를 사용할 수도 있지만 커서를 사용할 수도 있습니다.

커서를 사용하는 방법 및 순서는 다음과 같습니다.자세한 내용은 “커서”를 참고합니다.

  1. DECLARE CURSOR를 이용하여 커서를 선언합니다.

  2. OPEN을 실행하여 커서를 엽니다. 커서를 열면, 연관된 SQL 문장이 실행되고 질의의 결과가 반환됩니다.

  3. FETCH를 실행합니다. FETCH를 실행할 때마다 하나 또는 그 이상의 결과 로우를 얻을 수 있습니다. 커서는 항상 현재 처리 중인 로우를 가리킵니다.

  4. 모든 결과 로우에 대한 FETCH를 실행한 후에는 CLOSE를 실행하여 커서를 닫습니다.

프리컴파일러

tbESQL/C 프로그램 내에는 C 프로그래밍 언어와 tbESQL/C 문장이 함께 포함되어 있습니다. tbESQL/C 문장은 C 프로그래밍 언어의 문법을 따르지 않기 때문에 tbESQL/C 프로그램을 컴파일하기 전에 적절한 처리를 해주어야 합니다. 이러한 컴파일 이전의 처리 과정을 프리컴파일(Precompile)이라고 하며, 그때 사용하는 유틸리티를 프리컴파일러(Precompiler)라고 합니다.

프리컴파일러는 tbESQL/C 프로그램에 포함된 tbESQL/C 문장을 tbESQL/C 라이브러리 함수로 호출할 수 있는 C 프로그래밍 언어의 소스 코드로 변환해 줍니다. 이러한 과정을 위해서 tbESQL/C에서는 다음과 같은 함수를 정의하고 있습니다. 이 함수의 파라미터로는 SQL 문장과 입/출력 변수의 정보가 포함됩니다.

다음은 tbESQL/C 프로그램의 컴파일 과정을 나타내는 그림입니다.

[그림 1] tbESQL/C 프로그램의 컴파일 과정

tbESQL/C 프로그램의 컴파일 과정은 크게 두 가지 과정으로 나눌 수 있습니다.

  • 프리컴파일(Precompile) tbESQL/C 프로그램을 작성하여 프리컴파일 과정을 거치고 나면 C 프로그래밍 언어로만 구성된 소스코드가 생성됩니다. 생성된 소스코드는 .c 확장자를 가진 파일의 형태로 저장됩니다.

  • 컴파일(Compile) 프리컴파일 과정을 거친 프로그램은 다시 컴파일 과정을 거치게 되고 최종적으로 실행 파일이 생성됩니다.

Last updated