본문 바로가기

C-Language/Pro C, Host Variable, VARCHAR[]

Pro C, Host Variable, VARCHAR[]

오라클에서 출력된 문자열을 into 절에서 Host 변수로 받을 때 VARCHAR[]형으로 받는 예

Host변수를 선언할 때 INTO 절에서 오라클로부터 문자열을 받을 경우, VARCHAR[]형을 사용하면 문자열 뒤에 NULL문자를 추가하기가 편리한 장점이 있다.

Pro C에서 호스트 변수를 VARCHAR[]형으로 선언하면 Pro C컴파일러에 의해 구조체로 변환되고 구조체의 멤버로 arr배열과 len정수 멤버가 있기 때문에 오라클에서 이 구조체에 문자열을 저장할 때는 arr배열에는 문자열을 저장하고, len멤버에는 저장한 문자열의 길이를 저장해주기 때문에 이를 이용하여 배열의 마지막 문자 뒤에 NULL문자를 추가하기가 쉽게 된다.

#include <stdio.h>
#include "sqlca.h"

int main(void) {

 EXEC SQL BEGIN DECLARE SECTION;
  char *connstr = "scott/ojtit@orcl";
  int empno;
  VARCHAR ename[20];
  char hiredate[20];
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL CONNECT :connstr;
 
 if(sqlca.sqlcode == 0) {
  printf("오라클 연결 성공\n");
 }else{
  printf("오류 : 오라클 연결 실패\n");
 }
 
 EXEC SQL
  SELECT
   empno,ename,hiredate
  INTO :empno, :ename, :hiredate
  FROM
   EMP
  WHERE
   ename = 'SMITH';
   
 /* 문자열을 받기 위해서 VARCHAR[]을 into절에 사용한 경우에는 오라클이 arr배열에 저장한 문자열의
 *  길이를 len멤버변수에 저장해주기 때문에 개발자가 배열의 마지막 문자뒤에 NULL문자를 추가하기가
 *  편리하다*/

 
 printf("strlen(ename.arr)=%d \n", ename.len ); /*저장된 길이=5 */
 
 ename.arr[ename.len] = '\0';
 
 printf("empno=%d, ename=%s, hiredate=%s \n", empno, ename.arr, hiredate);
 
 EXEC SQL ROLLBACK WORK RELEASE;

 printf("프로그램 종료\n");
 return 0;
 
}