오라클 커서 예제

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR username[20];
  VARCHAR password[20];
  VARCHAR connect_string[200];
  int id;
  VARCHAR first_name[20];
  VARCHAR email[200];
  char phone_number[14];
  int salary;
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;

void sql_error();

main()
{
  strcpy(username.arr, "HR");
  username.len = strlen(username.arr);

  strcpy(password.arr, "password");
  password.len = strlen(password.arr);

  strcpy(connect_string.arr, "//localhost:1521/ORCLPDB1");
  connect_string.len = strlen(connect_string.arr);

  EXEC SQL WHENEVER SQLERROR DO sql_error();

  EXEC SQL CONNECT : username IDENTIFIED BY : password USING : connect_string;

  printf("\nConnected to ORACLE as user:%s\n", username.arr);

  EXEC SQL DECLARE cur CURSOR FOR
      SELECT first_name,
      email, phone_number, salary FROM employees WHERE employee_id < 200;

  EXEC SQL OPEN cur;

  for (;;)
  {
    EXEC SQL WHENEVER NOT FOUND DO break;
    EXEC SQL FETCH cur
        INTO : first_name,
        : email,
        : phone_number,
        : salary;

    first_name.arr[first_name.len] = '\0';
    email.arr[email.len] = '\0';
    printf("%s\t%s\t%s\t%d\n", first_name.arr, email.arr, phone_number, salary);
  }

  EXEC SQL CLOSE cur;

  exit(0);
}

void sql_error()
{
  EXEC SQL WHENEVER SQLERROR CONTINUE;
  printf("\nORACLE error detected:\n");
  printf("\n%.70s\n", sqlca.sqlerrm.sqlerrmc);
  EXEC SQL ROLLBACK WORK RELEASE;
  exit(1);
}


파일을 docker로 복사하기.
docker cp f:\temp_study\oracle\employees.pc oracle-db:/home/oracle/source
.pc 파일 빌드하기
proc iname=employees.pc    
.c 파일 빌드하기
gcc -o sample sample.c -L$ORACLE_HOME/lib -I$ORACLE_HOME/precomp/public -lclntsh -lpthread -ldl -lm

댓글 쓰기

댓글 목록