> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/utility-guide/utility-api.md).

# 유틸리티 API

Tibero 유틸리티를 애플리케이션 프로그램에서 호출할 때 필요한 함수를 설명합니다.

## 헤더 파일

아래는 유틸리티 API가 사용하는 헤더 파일입니다.

<table><thead><tr><th width="175">헤더 파일명</th><th>설명</th></tr></thead><tbody><tr><td>tbutil.h</td><td><p>유틸리티 API를 선언하고 이와 관련된 구조체를 정의</p><p><strong>정의할 구조체</strong></p><ul><li>struct sqlstr</li><li>struct TBExpImpMeta</li><li>struct TBExportIn</li><li>struct TBExportOut</li><li>struct TBExportStruct</li><li>struct TBImportIn</li><li>struct TBImportOut</li><li>struct TBImportStruct</li></ul></td></tr><tr><td>sqlca.h</td><td><p>유틸리티 내부에서 발생한 에러 정보를 애플리케이션 프로그램에 전달하는 구조체를 선언</p><p><strong>선언할 구조체</strong></p><ul><li>struct sqlca</li></ul></td></tr><tr><td>sqlcli.h</td><td>ODBC 표준인 헤더 파일로, 표준 API와 매크로를 정의</td></tr></tbody></table>

## 구조체 <a href="#id-6.2" id="id-6.2"></a>

아래는 유틸리티 API에서 정의할 수 있는 구조체입니다.

### **sqlstr 구조체**

<table><thead><tr><th width="168">필드</th><th width="71">용도</th><th width="169">타입</th><th>설명</th></tr></thead><tbody><tr><td>length</td><td>입력</td><td>SQLSMALLINT</td><td>문자열의 길이를 명시</td></tr><tr><td>data</td><td>입력</td><td>SQLCHAR *</td><td>문자열이 저장된 포인터를 명시</td></tr></tbody></table>

### **TBExpImpMeta 구조체**

<table><thead><tr><th width="168">필드</th><th width="70">용도</th><th width="174">타입</th><th>설명</th></tr></thead><tbody><tr><td>fieldTerm</td><td>입력</td><td>SQLCHAR *</td><td>컬럼(필드)의 구분자로, 사용할 문자열을 명시</td></tr><tr><td>fieldTermLen</td><td>입력</td><td>SQLSMALLINT</td><td>컬럼(필드)의 구분자로, 사용할 문자열의 길이를 명시</td></tr><tr><td>lineTerm</td><td>입력</td><td>SQLCHAR *</td><td>레코드의 구분자로, 사용할 문자열을 명시</td></tr><tr><td>lineTermLen</td><td>입력</td><td>SQLSMALLINT</td><td>레코드의 구분자로, 사용할 문자열의 길이를 명시</td></tr><tr><td>enclStart</td><td>입력</td><td>SQLCHAR *</td><td><p>컬럼의 데이터를 감쌀 시작 문자열을 명시</p><p>시작 문자열을 큰따옴표(" ")로 명시하면, 컬럼의 데이터 맨 앞에 큰따옴표가 붙음</p></td></tr><tr><td>enclStartLen</td><td>입력</td><td>SQLSMALLINT</td><td>컬럼의 데이터를 감쌀 시작 문자열의 길이를 명시</td></tr><tr><td>enclEnd</td><td>입력</td><td>SQLCHAR *</td><td><p>컬럼의 데이터를 감쌀 종료 문자열을 명시</p><p>종료 문자열을 큰따옴표(" ")로 명시하면, 컬럼의 데이터 맨 뒤에 큰따옴표가 붙음</p></td></tr><tr><td>enclEndLen</td><td>입력</td><td>SQLSMALLINT</td><td>컬럼의 데이터를 감쌀 종료 문자열의 길이를 명시</td></tr><tr><td>escape</td><td>입력</td><td>SQLCHAR *</td><td>컬럼의 데이터를 해석할 때 필요한 ESCAPE 문자열을 명시<br>(단, TBImport 구조체에서만 사용)</td></tr><tr><td>escapeLen</td><td>입력</td><td>SQLSMALLINT</td><td><p>컬럼의 데이터를 해석할 때 필요한 ESCAPE 문자열의 길이를 명시</p><p>(단, TBImport 구조체에서만 사용)</p></td></tr></tbody></table>

### TBExportIn 구조체

<table><thead><tr><th width="171">필드</th><th width="80">용도</th><th width="169">타입</th><th>설명</th></tr></thead><tbody><tr><td>iMeta</td><td>입력</td><td>TBExpImpMeta *</td><td><p>TBExpImpMeta 구조체의 포인터</p><p>데이터를 추출할 때 필요한 입력 메타데이터를 명시</p></td></tr></tbody></table>

### TBExportOut 구조체

<table><thead><tr><th width="175">필드</th><th width="67">용도</th><th width="174">타입</th><th>설명</th></tr></thead><tbody><tr><td>oRowsExported</td><td>출력</td><td>SQLINTEGER</td><td>데이터 파일에 추출된 레코드의 개수가 기록</td></tr></tbody></table>

### TBExportStruct 구조체

<table><thead><tr><th width="190">필드</th><th width="78">용도</th><th width="170">타입</th><th>설명</th></tr></thead><tbody><tr><td>piDataFileName</td><td>입력</td><td>SQLCHAR *</td><td>추출된 데이터가 저장될 파일의 경로명을 명시</td></tr><tr><td>iDataFileNameLen</td><td>입력</td><td>SQLSMALLINT</td><td><p>데이터 파일명의 길이를 명시</p><p>파일명이 NULL 문자로 종료된 경우 SQL_NTS를 명시</p></td></tr><tr><td>piActionString</td><td>입력</td><td>sqlstr *</td><td>SELECT 문을 이용하여 대상 테이블 또는 뷰의 데이터를 지정<br>SELECT 문에 명시한 컬럼의 순서대로 추출된 데이터가 저장</td></tr><tr><td>iFileType</td><td>입력</td><td>SQLSMALLINT</td><td>현재는 컬럼 구분자를 사용하는 형태인 SQL_DEL만 사용 가능</td></tr><tr><td>piMsgFileName</td><td>입력</td><td>SQLCHAR *</td><td>데이터를 추출할 때 발생하는 오류와 경고 그리고 유용한 정보를 기록하는 메시지 파일명을 명시</td></tr><tr><td>iMsgFileNameLen</td><td>입력</td><td>SQLSMALLINT</td><td><p>메시지 파일명의 길이를 명시</p><p>파일명이 NULL 문자로 종료된 경우 SQL_NTS를 명시</p></td></tr><tr><td>piExportInfoIn</td><td>입력</td><td>TBExportIn *</td><td><p>TBExportIn 구조체의 포인터</p><p>데이터를 추출할 때 필요한 입력 메타데이터를 명시</p></td></tr><tr><td>piExportInfoOut</td><td>입력</td><td>TBExportOut *</td><td><p>TBExportOut 구조체의 포인터</p><p>데이터를 추출한 후에 발생한 결과 정보를 저장</p></td></tr></tbody></table>

### TBImportIn 구조체

<table><thead><tr><th width="177">필드</th><th width="76">용도</th><th width="176">타입</th><th>설명</th></tr></thead><tbody><tr><td>iMeta</td><td>입력</td><td>TBExpImpMeta *</td><td><p>TBExpImpMeta 구조체의 포인터</p><p>데이터를 로드할 때 필요한 입력 메타데이터를 명시</p></td></tr><tr><td>iRowCount</td><td>입력</td><td>SQLINTEGER</td><td><p>로드할 레코드의 개수를 명시</p><p>사용자가 값을 0으로 지정한 경우 데이터 파일의 모든 레코드를 로드</p></td></tr><tr><td>iSkipCount</td><td>입력</td><td>SQLINTEGER</td><td>데이터 파일에서 로드할 대상을 제외하기 위해 건너뛸 레코드의 개수를 명시</td></tr><tr><td>iCommitCount</td><td>입력</td><td>SQLINTEGER</td><td><p>데이터를 로드 중에 한 번씩 커밋하려고 할 때 그 개수를 명시</p><p>(단, 성능적인 이슈로 사용자가 명시한 개수 단위로 커밋이 일어나지는 않음)</p></td></tr><tr><td>iErrorCount</td><td>입력</td><td>SQLINTEGER</td><td><p>사용자가 허용하는 에러 레코드의 개수</p><p>(데이터 로드 중에 에러 레코드 개수가 허용치보다 많으면, 로드를 중단)</p></td></tr></tbody></table>

### TBImportOut 구조체

<table><thead><tr><th width="189">필드</th><th width="84">용도</th><th width="149">타입</th><th>설명</th></tr></thead><tbody><tr><td>oRowsRead</td><td>출력</td><td>SQLINTEGER</td><td>데이터 파일에서 읽은 레코드의 개수를 기록</td></tr><tr><td>oRowsSkipped</td><td>출력</td><td>SQLINTEGER</td><td>데이터 파일에서 건너뛴 레코드의 개수를 기록</td></tr><tr><td>oRowsInserted</td><td>출력</td><td>SQLINTEGER</td><td>해당 테이블 또는 뷰에 입력(INSERT 연산)된 레코드의 개수를 기록</td></tr><tr><td>oRowsUpdated</td><td>출력</td><td>SQLINTEGER</td><td>해당 테이블 또는 뷰에 수정(UPDATE 연산)된 레코드의 개수를 기록</td></tr><tr><td>oRowsRejected</td><td>출력</td><td>SQLINTEGER</td><td>데이터 로드에 실패한 레코드의 개수를 기록</td></tr><tr><td>oRowsCommitted</td><td>출력</td><td>SQLINTEGER</td><td>커밋에 성공한 레코드의 개수를 기록</td></tr></tbody></table>

### TBImportStruct 구조체

<table><thead><tr><th width="180">필드</th><th width="83">용도</th><th width="143">타입</th><th>설명</th></tr></thead><tbody><tr><td>piDataFileName</td><td>입력</td><td>SQLCHAR *</td><td>로드할 데이터 파일의 경로명을 명시</td></tr><tr><td>iDataFileNameLen</td><td>입력</td><td>SQLSMALLINT</td><td><ul><li>데이터 파일명의 길이를 명시</li><li>파일명이 NULL 문자로 종료된 경우 SQL_NTS를 명시</li></ul></td></tr><tr><td>piActionString</td><td>입력</td><td>sqlstr *</td><td><ul><li>로드할 대상 테이블과 컬럼을 명시하고, 상세한 메타데이터를 명시한 문자열</li><li>tbLoader 유틸리티의 컨트롤 파일에서 사용하는 문자열과 동일한 문법</li></ul><p>(이 문법에 대한 내용은 tbLoader 유틸리티의 컨트롤 파일의 형식을 참고)</p></td></tr><tr><td>iFileType</td><td>입력</td><td>SQLSMALLINT</td><td>현재는 컬럼 구분자를 사용하는 형태인 SQL_DEL만 사용 가능</td></tr><tr><td>piMsgFileName</td><td>입력</td><td>SQLCHAR *</td><td>데이터를 로드할 때 발생하는 오류와 경고 그리고 유용한 정보를 기록하는 메시지 파일명을 명시</td></tr><tr><td>iMsgFileNameLen</td><td>입력</td><td>SQLSMALLINT</td><td><ul><li>메시지 파일명의 길이를 명시</li><li>파일명이 NULL 문자로 종료된 경우 SQL_NTS를 명시</li></ul></td></tr><tr><td>piBadFileName</td><td>입력</td><td>SQLCHAR *</td><td>데이터를 로드할 때 오류가 발생한 데이터를 모아서 기록하는 오류 데이터 파일</td></tr><tr><td>iBadFileNameLen</td><td>입력</td><td>SQLSMALLINT</td><td><ul><li>오류 데이터 파일명의 길이를 명시</li><li>파일명이 NULL 문자로 종료된 경우 SQL_NTS를 명시</li></ul></td></tr><tr><td>iDPL</td><td>입력</td><td>BOOL</td><td>데이터를 로드할 때 Direct Path Load 방식의 사용 여부를 지정</td></tr><tr><td>iTrailNullCols</td><td>입력</td><td>BOOL</td><td>데이터 파일의 레코드에 없는 마지막 컬럼의 데이터를 NULL로 취급 여부를 지정</td></tr><tr><td>piImportInfoIn</td><td>입력</td><td>TBImportIn *</td><td><ul><li>TBImportIn 구조체의 포인터</li><li>데이터를 로드할 때 필요한 입력 메타데이터를 지정</li></ul></td></tr><tr><td>poImportInfoOut</td><td>입력</td><td>TBImportOut *</td><td><ul><li>TBImportOut 구조체의 포인터</li><li>데이터를 로드한 후에 발생한 결과 정보를 로드</li></ul></td></tr></tbody></table>

## 유틸리티 **API** 목록

<table><thead><tr><th width="233">함수 타입</th><th width="200">함수</th><th>헤더 파일</th></tr></thead><tbody><tr><td>데이터베이스 연결</td><td>TBConnect</td><td>tbutil.h</td></tr><tr><td>데이터베이스 연결 해제</td><td>TBDisconnect</td><td>tbutil.h</td></tr><tr><td>데이터 추출</td><td>TBExport</td><td>tbutil.h</td></tr><tr><td>데이터 로드</td><td>TBImport</td><td>tbutil.h</td></tr></tbody></table>

### **TBConnect**

데이터베이스 연결 정보(SID, 사용자명, 패스워드)를 이용하여 Tibero 서버에 연결하는 함수입니다.

**문법**

```
SQLRETURN SQL_API
TBConnect(SQLCHAR *dnsname, SQLCHAR *username, SQLCHAR *pwd, 
          struct sqlca *pSqlca);
```

**파라미터**

<table><thead><tr><th width="133">파라미터</th><th width="77">용도</th><th>설명</th></tr></thead><tbody><tr><td>dnsname</td><td>입력</td><td>tbdsn.tbr(또는 tbnet_alias.tbr) 파일에 정의된 SID</td></tr><tr><td>username</td><td>입력</td><td>사용자명을 지정</td></tr><tr><td>pwd</td><td>입력</td><td>패스워드를 지정</td></tr><tr><td>pSqlca</td><td>출력</td><td>반환 코드가 SQL_SUCCESS가 아닌 경우 유틸리티 내부에서 발생한 오류 정보를 포함</td></tr></tbody></table>

**반환 코드**

<table><thead><tr><th width="278">반환 코드</th><th>설명</th></tr></thead><tbody><tr><td>SQL_SUCCESS</td><td>함수가 성공적으로 완료된 상태</td></tr><tr><td>SQL_SUCCESS_WITH_INFO</td><td>함수가 성공적으로 완료되었으나, 경고 메시지가 있는 상태</td></tr><tr><td>SQL_ERROR</td><td>치명적인 에러가 발생한 상태</td></tr></tbody></table>

**관련 함수**

TBDisconnect

### **TBDisconnect**

데이터베이스 연결 정보(SID)에 해당하는 Tibero 서버와의 연결을 해제하는 함수입니다.

**문법**

```
SQLRETURN SQL_API
TBDisconnect(SQLCHAR *dnsname, struct sqlca *pSqlca);
```

**파라미터**

<table><thead><tr><th width="147">파라미터</th><th width="89">용도</th><th>설명</th></tr></thead><tbody><tr><td>dnsname</td><td>입력</td><td>tbdsn.tbr(또는 tbnet_alias.tbr) 파일에 정의된 SID</td></tr><tr><td>pSqlca</td><td>출력</td><td>반환 코드가 SQL_SUCCESS가 아닌 경우 유틸리티 내부에서 발생한<br>오류 정보를 포함</td></tr></tbody></table>

**반환 코드**

<table><thead><tr><th width="277">반환 코드</th><th>설명</th></tr></thead><tbody><tr><td>SQL_SUCCESS</td><td>함수가 성공적으로 완료된 상태</td></tr><tr><td>SQL_SUCCESS_WITH_INFO</td><td>함수가 성공적으로 완료되었으나, 경고 메시지가 있는 상태</td></tr><tr><td>SQL_ERROR</td><td>치명적인 에러가 발생한 상태</td></tr></tbody></table>

**관련 함수**

TBConnect

### **TBExport**

데이터베이스에 존재하는 데이터를 외부 파일로 추출하는 함수입니다.

외부 파일은 추출된 데이터를 텍스트 형태로 표시하며, 컬럼 구분자와 레코드 구분자를 이용하여 컬럼과 레코드를 추출합니다. 이렇게 추출된 외부 파일은 tbLoader 유틸리티의 데이터 파일 형태를 취합니다.\
사용자는 SELECT 문을 이용하여 추출할 데이터를 선정할 수 있습니다. 단, 대상 테이블 또는 뷰의 SELECT 권한이 있어야 합니다.

**문법**

```
SQLRETURN SQL_API
TBExport(SQLINTEGER versionNumber, TBExportStruct *pParamStruct, 
         struct sqlca *pSqlca);
```

**파라미터**

<table><thead><tr><th width="160">파라미터</th><th width="79">용도</th><th>설명</th></tr></thead><tbody><tr><td>versionNumber</td><td>입력</td><td><ul><li>유틸리티 라이브러리의 버전 번호</li><li>이 파라미터는 유틸리티 라이브러리가 변경될 것에 대비하여 하위 버전과의 호환성을 위해 존재 (현재 버전 번호는 1)</li></ul></td></tr><tr><td>pParamStruct</td><td>입출력</td><td><p>이 파라미터를 사용하여 추출할 대상 정보를 명시하고, 추출 후에는 결과 정보를 받음</p><p>(자세한 내용은 "<a href="#tbexportstruct">TBExportStruct 구조체</a>"를 참고)</p></td></tr><tr><td>pSqlca</td><td>출력</td><td>반환 코드가 SQL_SUCCESS가 아닌 경우 유틸리티 내부에서 발생한 오류 정보를 포함</td></tr></tbody></table>

**반환 코드**

<table><thead><tr><th width="294">반환 코드</th><th>설명</th></tr></thead><tbody><tr><td>SQL_SUCCESS</td><td>함수가 성공적으로 완료된 상태</td></tr><tr><td>SQL_SUCCESS_WITH_INFO</td><td>함수가 성공적으로 완료되었으나, 경고 메시지가 있는 상태</td></tr><tr><td>SQL_ERROR</td><td>치명적인 에러가 발생한 상태</td></tr></tbody></table>

**예제**

```
#include "tbutil.h"

#define DNS_NAME "DEFAULT"
#define USER_NAME "SYS" 
#define PWD "tibero"

int main(int argc, char *argv[]) 
{ SQLRETURN rc = SQL_SUCCESS;
  SQLINTEGER versionNumber = 1; 
  SQLCHAR dataFileName[256];
  SQLCHAR actionString[256];
  SQLCHAR msgFileName[256];
  SQLCHAR fieldTerm[5];
  SQLCHAR lineTerm[5];
  SQLCHAR enclStart[5];
  SQLCHAR enclEnd[5];

  struct sqlca ca            = {"\0", 0, 0, {0, "\0"}, "\0",
                                {0, 0, 0, 0, 0, 0}, "\0", "\0"};
  TBExportStruct exportStruct = {NULL, 0, NULL, NULL, NULL, 0, NULL,
                                0, NULL, NULL};
  TBExportIn exportIn = {{NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0}};

  TBExportOut exportOut = {0};

  rc= TBConnect((SQLCHAR *)DNS_NAME, (SQLCHAR *)USER_NAME, (SQLCHAR *)PWD, &ca);

  if (rc != SQL_SUCCESS) return -1;

  strcpy((char *)dataFileName, "./all_tables.dat"); 
  strcpy((char *)actionString, "select * from all_tables"); 
  strcpy((char *)msgFileName, "./all_tables.log"); 
  strcpy((char *)fieldTerm, ",");
  strcpy((char *)lineTerm, "\n"); 
  strcpy((char *)enclStart, "\""); 
  strcpy((char *)enclEnd, "\"");
  
  /* setting data file name */
  exportStruct.piDataFileName = dataFileName; 
  exportStruct.iDataFileNameLen = strlen((char *)dataFileName);
  
  /* setting action String */
  exportStruct.piActionString = calloc(1, sizeof(sqlstr)); 
  exportStruct.piActionString->data = actionString; 
  exportStruct.piActionString->length = strlen((char *)actionString);
  
  /* setting file type */ 
  exportStruct.iFileType = SQL_DEL;
  
  /* setting message file name */ 
  exportStruct.piMsgFileName = msgFileName;
  exportStruct.iMsgFileNameLen = strlen((char *)msgFileName);
  
  /* setting field term, line term etc.. */ 
  exportIn.iMeta.fieldTerm = fieldTerm; 
  exportIn.iMeta.fieldTermLen = strlen((char *)fieldTerm); 
  exportIn.iMeta.lineTerm = lineTerm; 
  exportIn.iMeta.lineTermLen = strlen((char *)lineTerm); 
  exportIn.iMeta.enclStart = enclStart; 
  exportIn.iMeta.enclStartLen = strlen((char *)enclStart); 
  exportIn.iMeta.enclEnd = enclEnd; 
  exportIn.iMeta.enclEndLen = strlen((char *)enclEnd);
  
  /* setting export input, output information */ 
  exportStruct.piExportInfoIn = &exportIn; 
  exportStruct.poExportInfoOut = &exportOut;
  
  /* setting file type */
  rc = TBExport(versionNumber, &exportStruct, &ca); 
  if (rc != SQL_SUCCESS) return -1;
  
  /* disconnect */
  rc= TBDisconnect((SQLCHAR *)DNS_NAME, &ca);
  if (rc != SQL_SUCCESS) return -1;
  
  return 1;
}
```

### **TBImport**

외부 파일에 존재하는 데이터를 데이터베이스에 로드하는 함수입니다. 여기서 외부 파일은 tbLoader 유틸리티가 지원하는 고정된 레코드 형태와 분리된 레코드 형태를 지원합니다. 단, 대상 테이블 또는 뷰의 INSERT 권한이 있어야 합니다.

**문법**

```
SQLRETURN SQL_API TBImport(SQLINTEGER versionNumber,
                                TBImportStruct *pParamStruct, 
                                struct sqlca *pSqlca);
```

**파라미터**

<table><thead><tr><th width="184">파라미터</th><th width="102">용도</th><th>설명</th></tr></thead><tbody><tr><td>versionNumber</td><td>입력</td><td><ul><li>유틸리티 라이브러리의 버전 번호</li><li>이 파라미터는 유틸리티 라이브러리가 변경될 것에 대비하여 하위 버전과의 호환성을 위해 존재 (현재 버전 번호는 1)</li></ul></td></tr><tr><td>pParamStruct</td><td>입출력</td><td><p>이 파라미터를 사용하여 로드할 대상 정보를 명시하고, 로드 후에는 결과 정보를 받음</p><p>(자세한 내용은 "<a href="#tbimportstruct">TBImportStruct 구조체</a>"를 참고)</p></td></tr><tr><td>pSqlca</td><td>출력</td><td>반환 코드가 SQL_SUCCESS가 아닌 경우 유틸리티 내부에서 발생한 오류 정보를 포함</td></tr></tbody></table>

**반환 코드**

<table><thead><tr><th width="299">반환 코드</th><th>설명</th></tr></thead><tbody><tr><td>SQL_SUCCESS</td><td>함수가 성공적으로 완료된 상태</td></tr><tr><td>SQL_SUCCESS_WITH_INFO</td><td>함수가 성공적으로 완료되었으나, 경고 메시지가 있는 상태</td></tr><tr><td>SQL_ERROR</td><td>치명적인 에러가 발생한 상태</td></tr></tbody></table>

**예제**

```
#include "tbutil.h"

#define DNS_NAME "DEFAULT"
#define USER_NAME "SYS" 
#define PWD "tibero"

int main(int argc, char *argv[]) 
    { SQLRETURN         rc = SQL_SUCCESS;
    SQLINTEGER          versionNumber = 1; 
    SQLCHAR             dataFileName[256];
    SQLCHAR             actionString[256];
    SQLCHAR             msgFileName[256];
    SQLCHAR             badFileName[256];
    SQLCHAR             fieldTerm[5];
    SQLCHAR             lineTerm[5];
    SQLCHAR             enclStart[5];
    SQLCHAR             enclEnd[5];
    SQLCHAR             escape[5];
    
    struct sqlca ca = {"\0", 0, 0, {0, "\0"}, "\0",
                      {0, 0, 0, 0, 0, 0}, "\0", "\0"};
    TBImportStruct importStruct = {NULL, 0, NULL, NULL, NULL, 0, NULL,
                                    0, NULL, 0, 0, NULL, NULL};
    TBImportIn importIn = {{NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0},
                            0, 0, 0, 0};
    TBImportOut importOut = {0, 0, 0, 0, 0, 0};
    
rc= TBConnect((SQLCHAR *)DNS_NAME, (SQLCHAR *)USER_NAME, (SQLCHAR *)PWD, &ca);
if (rc != SQL_SUCCESS) return -1;

strcpy((char *)actionString, "LOAD DATA "
                             "APPEND "
                             "INTO TABLE DEPT " 
                             "MULTI INSERT INDEXES "
                             "(position, deptno, dname CONSTANT \"co dep\", loc)");
                             
    strcpy((char *)dataFileName, "./test.dat"); 
    strcpy((char *)msgFileName, "./test.log"); 
    strcpy((char *)badFileName, "./test.bad"); 
    strcpy((char *)fieldTerm, ",b"); 
    strcpy((char *)lineTerm, "abbb\n"); 
    strcpy((char *)enclStart, "{$"); 
    strcpy((char *)enclEnd, "$}"); 
    strcpy((char *)escape, "XX");
    
    /* setting data file name */ 
    importStruct.piDataFileName = dataFileName;
    importStruct.iDataFileNameLen = strlen((char *)dataFileName);
    
    /* setting action String */
    importStruct.piActionString = calloc(1, sizeof(sqlstr)); 
    importStruct.piActionString->data = actionString; 
    importStruct.piActionString->length = strlen((char *)actionString);
    
    /* setting file type */ 
    importStruct.iFileType = SQL_DEL;
    
    /* setting message file name */ 
    importStruct.piMsgFileName = msgFileName;
    importStruct.iMsgFileNameLen = strlen((char *)msgFileName);
    
    /* setting bad data file name */ 
    importStruct.piBadFileName = badFileName;
    importStruct.iBadFileNameLen = strlen((char *)badFileName);
    
    /* turn on DPL mode */
    importStruct.iDPL                     = 2;
    
    /* setting field term, line term etc.. */ 
    importIn.iMeta.fieldTerm = fieldTerm; 
    importIn.iMeta.fieldTermLen = strlen((char *)fieldTerm); 
    importIn.iMeta.lineTerm = lineTerm; 
    importIn.iMeta.lineTermLen = strlen((char *)lineTerm); 
    importIn.iMeta.enclStart = enclStart; 
    importIn.iMeta.enclStartLen = strlen((char *)enclStart); 
    importIn.iMeta.enclEnd = enclEnd; 
    importIn.iMeta.enclEndLen = strlen((char *)enclEnd); 
    importIn.iMeta.escape = escape;
    importIn.iMeta.escapeLen = strlen((char *)escape);
    
    importIn.iRowcount                     = 0;   
    importIn.iSkipcount                    = 0;
    importIn.iCommitcount                  = 2;
    importIn.iErrorcount                   = 50;
    
    /* setting export input, output information */ 
    importStruct.piImportInfoIn = &importIn; 
    importStruct.poImportInfoOut = &importOut;

    /* setting file type */
    rc = TBImport(versionNumber, &importStruct, &ca); 
    if (rc != SQL_SUCCESS) return -1;

        fprintf(stdout, "oRowsRead[%ld]", importOut.oRowsRead); 
        fprintf(stdout, "oRowsSkipped[%ld]", importOut.oRowsSkipped); 
        fprintf(stdout, "oRowsInserted[%ld]", importOut.oRowsInserted); 
        fprintf(stdout, "oRowsUpdated[%ld]", importOut.oRowsUpdated); 
        fprintf(stdout, "oRowsRejected[%ld]", importOut.oRowsRejected); 
        fprintf(stdout, "oRowsCommitted[%ld]", importOut.oRowsCommitted);

        /* disconnect */
        rc= TBDisconnect((SQLCHAR *)DNS_NAME, &ca); 
        if (rc != SQL_SUCCESS) return -1;

        return 1;

  }
```
