#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h> 

EXEC SQL INCLUDE SQLCA;

EXEC SQL BEGIN DECLARE SECTION;
char db_user[] = "scott";
char db_pass[] = "tiger";
char db_sid[] = "dev"; 

struct EMPLOYEE_T {
	char emp_id[6];	    
	char full_name[31];	
	char hire_date[9];	
	char married[2];	
	int salary;         
	char gender[2];	    
};
typedef struct EMPLOYEE_T EMPLOYEE_T;
EXEC SQL END DECLARE SECTION;

void display_employee_info(EMPLOYEE_T emp, int detail_mode) {
	char on_leave_status[] = "Working";
	if (detail_mode == 0) {
		printf("%-10s // %-20s // %s\\n",
			emp.emp_id, emp.full_name, on_leave_status);
	}
	else {
		printf("\\n--- 직원 상세 정보 ---\\n");
		printf(" - 사번 (EMP_ID)    : %s\\n", emp.emp_id);
		printf(" - 이름 (FULL_NAME)  : %s\\n", emp.full_name);
		printf(" - 입사일 (HIRE_DATE): %s\\n", emp.hire_date);
		printf(" - 결혼 여부        : %s\\n", emp.married);
		printf(" - 성별 (GENDER)    : %s\\n", emp.gender);
		printf(" - 연봉 (SALARY)    : %d\\n", emp.salary);
		printf(" - 재직 상태        : %s\\n", on_leave_status);
		printf("----------------------\\n");
	}
}

void connect_db() {
	EXEC SQL CONNECT :db_user IDENTIFIED BY :db_pass USING :db_sid;
	if (sqlca.sqlcode != 0) {
		printf("🚨 DB 연결 실패 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
		exit(1);
	} else {
		printf("✅ DB 연결 성공: %s/%s@%s\\n", db_user, db_pass, db_sid);
	}
}

void disconnect_db() {
	EXEC SQL COMMIT WORK RELEASE;
	printf("DB 연결 해제 완료.\\n");
}

int print_all_employees() {
    EXEC SQL BEGIN DECLARE SECTION;
    EMPLOYEE_T current_emp;
    EXEC SQL END DECLARE SECTION;
    
	EXEC SQL DECLARE emp_cursor CURSOR FOR
        SELECT EMPL_ID, FULL_NAME, HIRE_DATE, MARRIED, GENDER, SALARY 
        FROM EMPLOYEES
        ORDER BY EMPL_ID;

	EXEC SQL OPEN emp_cursor;
	printf("\\n============================================\\n");
	printf("     ⭐ DB에서 가져온 전체 직원 목록 ⭐\\n");
	printf("============================================\\n");
	printf("%-10s // %-20s // %s\\n", "사번", "이름", "상태");
	printf("--------------------------------------------\\n");

	int found_count = 0;
	while (1) {
		EXEC SQL FETCH emp_cursor INTO
			:current_emp.emp_id, :current_emp.full_name, :current_emp.hire_date,
			:current_emp.married, :current_emp.gender, :current_emp.salary;

		if (sqlca.sqlcode == 1403) break;
		if (sqlca.sqlcode != 0) {
			printf("🚨 데이터 조회 오류 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
			break;
		}

		display_employee_info(current_emp, 0);
		found_count++;
	}
	EXEC SQL CLOSE emp_cursor;
	printf("============================================\\n");
	printf("총 %d명의 직원을 DB에서 조회했습니다.\\n", found_count);
	return 0;
}

int print_employee_detail() {
    EXEC SQL BEGIN DECLARE SECTION; 
    EMPLOYEE_T detail_emp; 
    char l_search_id[6];
    EXEC SQL END DECLARE SECTION;

	printf("조회할 사원의 사번(EMP_ID)을 입력하세요: ");
	scanf("%s", l_search_id);
    
	EXEC SQL SELECT EMPL_ID, FULL_NAME, HIRE_DATE, MARRIED, GENDER, SALARY 
		INTO :detail_emp.emp_id, :detail_emp.full_name, :detail_emp.hire_date, 
			:detail_emp.married, :detail_emp.gender, :detail_emp.salary
		FROM EMPLOYEES
		WHERE EMPL_ID = :l_search_id;

	if (sqlca.sqlcode == 1403) {
		printf("\\n ❌ 사번 [%s]에 해당하는 직원을 찾을 수 없습니다.\\n", l_search_id);
		return -1;
	} else if (sqlca.sqlcode != 0) {
		printf("🚨 상세 조회 오류 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
		return -1;
	}

	display_employee_info(detail_emp, 1);
	return 0;
}

int main() {
	connect_db();
	print_all_employees();
	printf("\\n\\n--------------------------------------------\\n");
	printf("          🎯 특정 사원 정보 상세 조회\\n");
	print_employee_detail();
	printf("--------------------------------------------\\n");
	disconnect_db();
	return 0;
}

/* Result Sets Interface */
#ifndef SQL_CRSR
#  define SQL_CRSR
  struct sql_cursor
  {
    unsigned int curocn;
    void *ptr1;
    void *ptr2;
    unsigned int magic;
  };
  typedef struct sql_cursor sql_cursor;
  typedef struct sql_cursor SQL_CURSOR;
#endif /* SQL_CRSR */

/* Thread Safety */
typedef void * sql_context;
typedef void * SQL_CONTEXT;

/* Object support */
struct sqltvn
{
  unsigned char *tvnvsn; 
  unsigned short tvnvsnl; 
  unsigned char *tvnnm;
  unsigned short tvnnml; 
  unsigned char *tvnsnm;
  unsigned short tvnsnml;
};
typedef struct sqltvn sqltvn;

struct sqladts
{
  unsigned int adtvsn; 
  unsigned short adtmode; 
  unsigned short adtnum;  
  sqltvn adttvn[1];       
};
typedef struct sqladts sqladts;

static struct sqladts sqladt = {
  1,1,0,
};

/* Binding to PL/SQL Records */
struct sqltdss
{
  unsigned int tdsvsn; 
  unsigned short tdsnum; 
  unsigned char *tdsval[1]; 
};
typedef struct sqltdss sqltdss;
static struct sqltdss sqltds =
{
  1,
  0,
};

/* File name & Package Name */
struct sqlcxp
{
  unsigned short fillen;
           char  filnam[13];
};
static const struct sqlcxp sqlfpn =
{
    12,
    "조회 기능.pc"
};

static unsigned int sqlctx = 758691;

static struct sqlexd {
   unsigned int   sqlvsn;
   unsigned int   arrsiz;
   unsigned int   iters;
   unsigned int   offset;
   unsigned short selerr;
   unsigned short sqlety;
   unsigned int   occurs;
      const short *cud;
   unsigned char  *sqlest;
      const char  *stmt;
   sqladts *sqladtp;
   sqltdss *sqltdsp;
            void  **sqphsv;
   unsigned int   *sqphsl;
            int   *sqphss;
            void  **sqpind;
            int   *sqpins;
   unsigned int   *sqparm;
   unsigned int   **sqparc;
   unsigned short  *sqpadto;
   unsigned short  *sqptdso;
   unsigned int   sqlcmax;
   unsigned int   sqlcmin;
   unsigned int   sqlcincr;
   unsigned int   sqlctimeout;
   unsigned int   sqlcnowait;
              int   sqfoff;
   unsigned int   sqcmod;
   unsigned int   sqfmod;
            void  *sqhstv[7];
   unsigned int   sqhstl[7];
            int   sqhsts[7];
            void  *sqindv[7];
            int   sqinds[7];
   unsigned int   sqharm[7];
   unsigned int   *sqharc[7];
   unsigned short  sqadto[7];
   unsigned short  sqtdso[7];
} sqlstm = {12,7};

/* SQLLIB Prototypes */
extern void sqlcxt (void **, unsigned int *,
                    struct sqlexd *, const struct sqlcxp *);
extern void sqlcx2t(void **, unsigned int *,
                    struct sqlexd *, const struct sqlcxp *);
extern void sqlbuft(void **, char *);
extern void sqlgs2t(void **, char *);
extern void sqlorat(void **, unsigned int *, void *);

/* Forms Interface */
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL  = 535;
extern void sqliem(unsigned char *, signed int *);

 static const char *sq0003 = 
"select EMPL_ID ,FULL_NAME ,HIRE_DATE ,MARRIED ,GENDER ,SALARY  from EMPLOYE\\
ES  order by EMPL_ID            ";

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
typedef struct { unsigned short len; unsigned char arr[1]; } varchar;

/* cud (compilation unit data) array */
static const short sqlcud0[] =
{12,4130,846,0,0,
5,0,0,0,0,0,27,45,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0,
36,0,0,2,0,0,30,55,0,0,0,0,0,1,0,
51,0,0,3,107,0,9,69,0,0,0,0,0,1,0,
66,0,0,3,0,0,13,78,0,0,6,0,0,1,0,2,97,0,0,2,97,0,0,2,97,0,0,2,97,0,0,2,97,0,0,
2,3,0,0,
105,0,0,3,0,0,15,91,0,0,0,0,0,1,0,
120,0,0,4,124,0,4,106,0,0,7,1,0,1,0,2,97,0,0,2,97,0,0,2,97,0,0,2,97,0,0,2,97,0,
0,2,3,0,0,1,97,0,0,
};

癤?define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h> 

/* EXEC SQL INCLUDE SQLCA;
 */ 
/*
 * $Header: sqlca.h 24-apr-2003.12:50:58 mkandarp Exp $ sqlca.h 
 */

/* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */
 
/*
NAME
  SQLCA : SQL Communications Area.
FUNCTION
  Contains no code. Oracle fills in the SQLCA with status info
  during the execution of a SQL stmt.
NOTES
  **************************************************************
  ***                                                        ***
  *** This file is SOSD.  Porters must change the data types ***
  *** appropriately on their platform.  See notes/pcport.doc ***
  *** for more information.                                  ***
  ***                                                        ***
  **************************************************************

  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA
  will be defined to have this storage class. For example:
 
    #define SQLCA_STORAGE_CLASS extern
 
  will define the SQLCA as an extern.
 
  If the symbol SQLCA_INIT is defined, then the SQLCA will be
  statically initialized. Although this is not necessary in order
  to use the SQLCA, it is a good pgming practice not to have
  unitialized variables. However, some C compilers/OS's don't
  allow automatic variables to be init'd in this manner. Therefore,
  if you are INCLUDE'ing the SQLCA in a place where it would be
  an automatic AND your C compiler/OS doesn't allow this style
  of initialization, then SQLCA_INIT should be left undefined --
  all others can define SQLCA_INIT if they wish.

  If the symbol SQLCA_NONE is defined, then the SQLCA variable will
  not be defined at all.  The symbol SQLCA_NONE should not be defined
  in source modules that have embedded SQL.  However, source modules
  that have no embedded SQL, but need to manipulate a sqlca struct
  passed in as a parameter, can set the SQLCA_NONE symbol to avoid
  creation of an extraneous sqlca variable.
 
MODIFIED
    lvbcheng   07/31/98 -  long to int
    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file
    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set 
  Clare      12/06/84 - Ch SQLCA to not be an extern.
  Clare      10/21/85 - Add initialization.
  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set
  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option.
*/
 
#ifndef SQLCA
#define SQLCA 1
 
struct   sqlca
         {
         /* ub1 */ char    sqlcaid[8];
         /* b4  */ int     sqlabc;
         /* b4  */ int     sqlcode;
         struct
           {
           /* ub2 */ unsigned short sqlerrml;
           /* ub1 */ char           sqlerrmc[70];
           } sqlerrm;
         /* ub1 */ char    sqlerrp[8];
         /* b4  */ int     sqlerrd[6];
         /* ub1 */ char    sqlwarn[8];
         /* ub1 */ char    sqlext[8];
         };

#ifndef SQLCA_NONE 
#ifdef   SQLCA_STORAGE_CLASS
SQLCA_STORAGE_CLASS struct sqlca sqlca
#else
         struct sqlca sqlca
#endif
 
#ifdef  SQLCA_INIT
         = {
         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
         sizeof(struct sqlca),
         0,
         { 0, {0}},
         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
         {0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0}
         }
#endif
         ;
#endif
 
#endif
 
/* end SQLCA */

/* EXEC SQL BEGIN DECLARE SECTION; */ 

char db_user[] = "scott";
char db_pass[] = "tiger";
char db_sid[] = "dev"; 

struct EMPLOYEE_T {
	char emp_id[6];	    
	char full_name[31];	
	char hire_date[9];	
	char married[2];	
	int salary;         
	char gender[2];	    
};
typedef struct EMPLOYEE_T EMPLOYEE_T;
/* EXEC SQL END DECLARE SECTION; */ 

void display_employee_info(EMPLOYEE_T emp, int detail_mode) {
	char on_leave_status[] = "Working";
	if (detail_mode == 0) {
		printf("%-10s // %-20s // %s\\n",
			emp.emp_id, emp.full_name, on_leave_status);
	}
	else {
		printf("\\n--- 吏곸썝 ?곸꽭 ?뺣낫 ---\\n");
		printf(" - ?щ쾲 (EMP_ID)    : %s\\n", emp.emp_id);
		printf(" - ?대쫫 (FULL_NAME)  : %s\\n", emp.full_name);
		printf(" - ?낆궗??(HIRE_DATE): %s\\n", emp.hire_date);
		printf(" - 寃고샎 ?щ?        : %s\\n", emp.married);
		printf(" - ?깅퀎 (GENDER)    : %s\\n", emp.gender);
		printf(" - ?곕큺 (SALARY)    : %d\\n", emp.salary);
		printf(" - ?ъ쭅 ?곹깭        : %s\\n", on_leave_status);
		printf("----------------------\\n");
	}
}

void connect_db() {
	/* EXEC SQL CONNECT :db_user IDENTIFIED BY :db_pass USING :db_sid; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 4;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )10;
 sqlstm.offset = (unsigned int  )5;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)4352;
 sqlstm.occurs = (unsigned int  )0;
 sqlstm.sqhstv[0] = (         void  *)db_user;
 sqlstm.sqhstl[0] = (unsigned int  )0;
 sqlstm.sqhsts[0] = (         int  )0;
 sqlstm.sqindv[0] = (         void  *)0;
 sqlstm.sqinds[0] = (         int  )0;
 sqlstm.sqharm[0] = (unsigned int  )0;
 sqlstm.sqadto[0] = (unsigned short )0;
 sqlstm.sqtdso[0] = (unsigned short )0;
 sqlstm.sqhstv[1] = (         void  *)db_pass;
 sqlstm.sqhstl[1] = (unsigned int  )0;
 sqlstm.sqhsts[1] = (         int  )0;
 sqlstm.sqindv[1] = (         void  *)0;
 sqlstm.sqinds[1] = (         int  )0;
 sqlstm.sqharm[1] = (unsigned int  )0;
 sqlstm.sqadto[1] = (unsigned short )0;
 sqlstm.sqtdso[1] = (unsigned short )0;
 sqlstm.sqhstv[2] = (         void  *)db_sid;
 sqlstm.sqhstl[2] = (unsigned int  )0;
 sqlstm.sqhsts[2] = (         int  )0;
 sqlstm.sqindv[2] = (         void  *)0;
 sqlstm.sqinds[2] = (         int  )0;
 sqlstm.sqharm[2] = (unsigned int  )0;
 sqlstm.sqadto[2] = (unsigned short )0;
 sqlstm.sqtdso[2] = (unsigned short )0;
 sqlstm.sqphsv = sqlstm.sqhstv;
 sqlstm.sqphsl = sqlstm.sqhstl;
 sqlstm.sqphss = sqlstm.sqhsts;
 sqlstm.sqpind = sqlstm.sqindv;
 sqlstm.sqpins = sqlstm.sqinds;
 sqlstm.sqparm = sqlstm.sqharm;
 sqlstm.sqparc = sqlstm.sqharc;
 sqlstm.sqpadto = sqlstm.sqadto;
 sqlstm.sqptdso = sqlstm.sqtdso;
 sqlstm.sqlcmax = (unsigned int )100;
 sqlstm.sqlcmin = (unsigned int )2;
 sqlstm.sqlcincr = (unsigned int )1;
 sqlstm.sqlctimeout = (unsigned int )0;
 sqlstm.sqlcnowait = (unsigned int )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

	if (sqlca.sqlcode != 0) {
		printf("?슚 DB ?곌껐 ?ㅽ뙣 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
		exit(1);
	} else {
		printf("??DB ?곌껐 ?깃났: %s/%s@%s\\n", db_user, db_pass, db_sid);
	}
}

void disconnect_db() {
	/* EXEC SQL COMMIT WORK RELEASE; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 4;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )36;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)4352;
 sqlstm.occurs = (unsigned int  )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

	printf("DB ?곌껐 ?댁젣 ?꾨즺.\\n");
}

int print_all_employees() {
    /* EXEC SQL BEGIN DECLARE SECTION; */ 

    EMPLOYEE_T current_emp;
    /* EXEC SQL END DECLARE SECTION; */ 

    
	/* EXEC SQL DECLARE emp_cursor CURSOR FOR
        SELECT EMPL_ID, FULL_NAME, HIRE_DATE, MARRIED, GENDER, SALARY 
        FROM EMPLOYEES
        ORDER BY EMPL_ID; */ 

	/* EXEC SQL OPEN emp_cursor; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 4;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.stmt = sq0003;
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )51;
 sqlstm.selerr = (unsigned short)1;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)4352;
 sqlstm.occurs = (unsigned int  )0;
 sqlstm.sqcmod = (unsigned int )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

	printf("\\n============================================\\n");
	printf("     狩?DB?먯꽌 媛€?몄삩 ?꾩껜 吏곸썝 紐⑸줉 狩?n");
	printf("============================================\\n");
	printf("%-10s // %-20s // %s\\n", "?щ쾲", "?대쫫", "?곹깭");
	printf("--------------------------------------------\\n");

	int found_count = 0;
	while (1) {
		/* EXEC SQL FETCH emp_cursor INTO
			:current_emp.emp_id, :current_emp.full_name, :current_emp.hire_date,
			:current_emp.married, :current_emp.gender, :current_emp.salary; */ 

{
  struct sqlexd sqlstm;
  sqlstm.sqlvsn = 12;
  sqlstm.arrsiz = 6;
  sqlstm.sqladtp = &sqladt;
  sqlstm.sqltdsp = &sqltds;
  sqlstm.iters = (unsigned int  )1;
  sqlstm.offset = (unsigned int  )66;
  sqlstm.selerr = (unsigned short)1;
  sqlstm.cud = sqlcud0;
  sqlstm.sqlest = (unsigned char  *)&sqlca;
  sqlstm.sqlety = (unsigned short)4352;
  sqlstm.occurs = (unsigned int  )0;
  sqlstm.sqfoff = (           int )0;
  sqlstm.sqfmod = (unsigned int )2;
  sqlstm.sqhstv[0] = (         void  *)(current_emp.emp_id);
  sqlstm.sqhstl[0] = (unsigned int  )6;
  sqlstm.sqhsts[0] = (         int  )0;
  sqlstm.sqindv[0] = (         void  *)0;
  sqlstm.sqinds[0] = (         int  )0;
  sqlstm.sqharm[0] = (unsigned int  )0;
  sqlstm.sqadto[0] = (unsigned short )0;
  sqlstm.sqtdso[0] = (unsigned short )0;
  sqlstm.sqhstv[1] = (         void  *)(current_emp.full_name);
  sqlstm.sqhstl[1] = (unsigned int  )31;
  sqlstm.sqhsts[1] = (         int  )0;
  sqlstm.sqindv[1] = (         void  *)0;
  sqlstm.sqinds[1] = (         int  )0;
  sqlstm.sqharm[1] = (unsigned int  )0;
  sqlstm.sqadto[1] = (unsigned short )0;
  sqlstm.sqtdso[1] = (unsigned short )0;
  sqlstm.sqhstv[2] = (         void  *)(current_emp.hire_date);
  sqlstm.sqhstl[2] = (unsigned int  )9;
  sqlstm.sqhsts[2] = (         int  )0;
  sqlstm.sqindv[2] = (         void  *)0;
  sqlstm.sqinds[2] = (         int  )0;
  sqlstm.sqharm[2] = (unsigned int  )0;
  sqlstm.sqadto[2] = (unsigned short )0;
  sqlstm.sqtdso[2] = (unsigned short )0;
  sqlstm.sqhstv[3] = (         void  *)(current_emp.married);
  sqlstm.sqhstl[3] = (unsigned int  )2;
  sqlstm.sqhsts[3] = (         int  )0;
  sqlstm.sqindv[3] = (         void  *)0;
  sqlstm.sqinds[3] = (         int  )0;
  sqlstm.sqharm[3] = (unsigned int  )0;
  sqlstm.sqadto[3] = (unsigned short )0;
  sqlstm.sqtdso[3] = (unsigned short )0;
  sqlstm.sqhstv[4] = (         void  *)(current_emp.gender);
  sqlstm.sqhstl[4] = (unsigned int  )2;
  sqlstm.sqhsts[4] = (         int  )0;
  sqlstm.sqindv[4] = (         void  *)0;
  sqlstm.sqinds[4] = (         int  )0;
  sqlstm.sqharm[4] = (unsigned int  )0;
  sqlstm.sqadto[4] = (unsigned short )0;
  sqlstm.sqtdso[4] = (unsigned short )0;
  sqlstm.sqhstv[5] = (         void  *)&(current_emp.salary);
  sqlstm.sqhstl[5] = (unsigned int  )sizeof(int);
  sqlstm.sqhsts[5] = (         int  )0;
  sqlstm.sqindv[5] = (         void  *)0;
  sqlstm.sqinds[5] = (         int  )0;
  sqlstm.sqharm[5] = (unsigned int  )0;
  sqlstm.sqadto[5] = (unsigned short )0;
  sqlstm.sqtdso[5] = (unsigned short )0;
  sqlstm.sqphsv = sqlstm.sqhstv;
  sqlstm.sqphsl = sqlstm.sqhstl;
  sqlstm.sqphss = sqlstm.sqhsts;
  sqlstm.sqpind = sqlstm.sqindv;
  sqlstm.sqpins = sqlstm.sqinds;
  sqlstm.sqparm = sqlstm.sqharm;
  sqlstm.sqparc = sqlstm.sqharc;
  sqlstm.sqpadto = sqlstm.sqadto;
  sqlstm.sqptdso = sqlstm.sqtdso;
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

		if (sqlca.sqlcode == 1403) break;
		if (sqlca.sqlcode != 0) {
			printf("?슚 ?곗씠??議고쉶 ?ㅻ쪟 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
			break;
		}

		display_employee_info(current_emp, 0);
		found_count++;
	}
	/* EXEC SQL CLOSE emp_cursor; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 6;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )105;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)4352;
 sqlstm.occurs = (unsigned int  )0;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

	printf("============================================\\n");
	printf("珥?%d紐낆쓽 吏곸썝??DB?먯꽌 議고쉶?덉뒿?덈떎.\\n", found_count);
	return 0;
}

int print_employee_detail() {
    /* EXEC SQL BEGIN DECLARE SECTION; */ 
 
    EMPLOYEE_T detail_emp; 
    char l_search_id[6];
    /* EXEC SQL END DECLARE SECTION; */ 

	printf("議고쉶???ъ썝???щ쾲(EMP_ID)???낅젰?섏꽭?? ");
	scanf("%s", l_search_id);
    
	/* EXEC SQL SELECT EMPL_ID, FULL_NAME, HIRE_DATE, MARRIED, GENDER, SALARY 
		INTO :detail_emp.emp_id, :detail_emp.full_name, :detail_emp.hire_date, 
			:detail_emp.married, :detail_emp.gender, :detail_emp.salary
		FROM EMPLOYEES
		WHERE EMPL_ID = :l_search_id; */ 

{
 struct sqlexd sqlstm;
 sqlstm.sqlvsn = 12;
 sqlstm.arrsiz = 7;
 sqlstm.sqladtp = &sqladt;
 sqlstm.sqltdsp = &sqltds;
 sqlstm.stmt = "select EMPL_ID ,FULL_NAME ,HIRE_DATE ,MARRIED ,GENDER ,SALA\\
RY into :b0,:b1,:b2,:b3,:b4,:b5  from EMPLOYEES where EMPL_ID=:b6";
 sqlstm.iters = (unsigned int  )1;
 sqlstm.offset = (unsigned int  )120;
 sqlstm.selerr = (unsigned short)1;
 sqlstm.cud = sqlcud0;
 sqlstm.sqlest = (unsigned char  *)&sqlca;
 sqlstm.sqlety = (unsigned short)4352;
 sqlstm.occurs = (unsigned int  )0;
 sqlstm.sqhstv[0] = (         void  *)(detail_emp.emp_id);
 sqlstm.sqhstl[0] = (unsigned int  )6;
 sqlstm.sqhsts[0] = (         int  )0;
 sqlstm.sqindv[0] = (         void  *)0;
 sqlstm.sqinds[0] = (         int  )0;
 sqlstm.sqharm[0] = (unsigned int  )0;
 sqlstm.sqadto[0] = (unsigned short )0;
 sqlstm.sqtdso[0] = (unsigned short )0;
 sqlstm.sqhstv[1] = (         void  *)(detail_emp.full_name);
 sqlstm.sqhstl[1] = (unsigned int  )31;
 sqlstm.sqhsts[1] = (         int  )0;
 sqlstm.sqindv[1] = (         void  *)0;
 sqlstm.sqinds[1] = (         int  )0;
 sqlstm.sqharm[1] = (unsigned int  )0;
 sqlstm.sqadto[1] = (unsigned short )0;
 sqlstm.sqtdso[1] = (unsigned short )0;
 sqlstm.sqhstv[2] = (         void  *)(detail_emp.hire_date);
 sqlstm.sqhstl[2] = (unsigned int  )9;
 sqlstm.sqhsts[2] = (         int  )0;
 sqlstm.sqindv[2] = (         void  *)0;
 sqlstm.sqinds[2] = (         int  )0;
 sqlstm.sqharm[2] = (unsigned int  )0;
 sqlstm.sqadto[2] = (unsigned short )0;
 sqlstm.sqtdso[2] = (unsigned short )0;
 sqlstm.sqhstv[3] = (         void  *)(detail_emp.married);
 sqlstm.sqhstl[3] = (unsigned int  )2;
 sqlstm.sqhsts[3] = (         int  )0;
 sqlstm.sqindv[3] = (         void  *)0;
 sqlstm.sqinds[3] = (         int  )0;
 sqlstm.sqharm[3] = (unsigned int  )0;
 sqlstm.sqadto[3] = (unsigned short )0;
 sqlstm.sqtdso[3] = (unsigned short )0;
 sqlstm.sqhstv[4] = (         void  *)(detail_emp.gender);
 sqlstm.sqhstl[4] = (unsigned int  )2;
 sqlstm.sqhsts[4] = (         int  )0;
 sqlstm.sqindv[4] = (         void  *)0;
 sqlstm.sqinds[4] = (         int  )0;
 sqlstm.sqharm[4] = (unsigned int  )0;
 sqlstm.sqadto[4] = (unsigned short )0;
 sqlstm.sqtdso[4] = (unsigned short )0;
 sqlstm.sqhstv[5] = (         void  *)&(detail_emp.salary);
 sqlstm.sqhstl[5] = (unsigned int  )sizeof(int);
 sqlstm.sqhsts[5] = (         int  )0;
 sqlstm.sqindv[5] = (         void  *)0;
 sqlstm.sqinds[5] = (         int  )0;
 sqlstm.sqharm[5] = (unsigned int  )0;
 sqlstm.sqadto[5] = (unsigned short )0;
 sqlstm.sqtdso[5] = (unsigned short )0;
 sqlstm.sqhstv[6] = (         void  *)l_search_id;
 sqlstm.sqhstl[6] = (unsigned int  )6;
 sqlstm.sqhsts[6] = (         int  )0;
 sqlstm.sqindv[6] = (         void  *)0;
 sqlstm.sqinds[6] = (         int  )0;
 sqlstm.sqharm[6] = (unsigned int  )0;
 sqlstm.sqadto[6] = (unsigned short )0;
 sqlstm.sqtdso[6] = (unsigned short )0;
 sqlstm.sqphsv = sqlstm.sqhstv;
 sqlstm.sqphsl = sqlstm.sqhstl;
 sqlstm.sqphss = sqlstm.sqhsts;
 sqlstm.sqpind = sqlstm.sqindv;
 sqlstm.sqpins = sqlstm.sqinds;
 sqlstm.sqparm = sqlstm.sqharm;
 sqlstm.sqparc = sqlstm.sqharc;
 sqlstm.sqpadto = sqlstm.sqadto;
 sqlstm.sqptdso = sqlstm.sqtdso;
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}

	if (sqlca.sqlcode == 1403) {
		printf("\\n ???щ쾲 [%s]???대떦?섎뒗 吏곸썝??李얠쓣 ???놁뒿?덈떎.\\n", l_search_id);
		return -1;
	} else if (sqlca.sqlcode != 0) {
		printf("?슚 ?곸꽭 議고쉶 ?ㅻ쪟 (SQLCODE: %d): %s\\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
		return -1;
	}

	display_employee_info(detail_emp, 1);
	return 0;
}

int main() {
	connect_db();
	print_all_employees();
	printf("\\n\\n--------------------------------------------\\n");
	printf("          ?렞 ?뱀젙 ?ъ썝 ?뺣낫 ?곸꽭 議고쉶\\n");
	print_employee_detail();
	printf("--------------------------------------------\\n");
	disconnect_db();
	return 0;
}