동적 쿼리를 이용하여 쿼리문 조회하기.

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

#include <stdlib.h>

#define USERNAME "hr"
#define PASSWORD "password"

#include <sqlca.h>
#include <oraca.h>

EXEC ORACLE OPTION(ORACA = YES);

char *username = USERNAME;
char *password = PASSWORD;
VARCHAR connect_string[200];
VARCHAR dynstmt[80];
VARCHAR ename[10];
int deptno = 80;

void sql_error(char *msg);

void main()
{
    EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error");
    oraca.orastxtf = ORASTFERR;

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

    EXEC SQL CONNECT : username IDENTIFIED BY : password USING :connect_string;
    puts("\nConnected to Oracle.\n");

    strcpy((char *)dynstmt.arr,
           "SELECT first_name FROM employees WHERE department_id = :v1");
    dynstmt.len = (unsigned short)strlen((char *)dynstmt.arr);

    puts((char *)dynstmt.arr);
    printf("   v1 = %d\n", deptno);
    printf("\nEmployee\n");
    printf("--------\n");

    EXEC SQL PREPARE S FROM : dynstmt;
    EXEC SQL DECLARE C CURSOR FOR S;
    EXEC SQL OPEN C USING : deptno;

    EXEC SQL WHENEVER NOT FOUND DO break;

    for (;;)
    {
        EXEC SQL FETCH C INTO : ename;
        ename.arr[ename.len] = '\0';
        puts((char *)ename.arr);
    }

    printf("\nQuery returned %d row%s.\n\n", sqlca.sqlerrd[2],
           (sqlca.sqlerrd[2] == 1) ? "" : "s");

    EXEC SQL CLOSE C;

    EXEC SQL COMMIT RELEASE;

    puts((char *)"Thank you.\n");
    exit(0);
}

#if defined(__STDC__)
void sql_error(char *msg)
#else
void sql_error(msg) char *msg;
#endif
{
    printf("\n%s", msg);
    sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
    oraca.orastxt.orastxtc[oraca.orastxt.orastxtl] = '\0';
    oraca.orasfnm.orasfnmc[oraca.orasfnm.orasfnml] = '\0';
    printf("\n%s\n", sqlca.sqlerrm.sqlerrmc);
    printf("in \"%s...\"\n", oraca.orastxt.orastxtc);
    printf("on line %d of %s.\n\n", oraca.oraslnr,
           oraca.orasfnm.orasfnmc);

    /* 오라클 에러로 인해 무한루프가 도는 것을 방지  */
    EXEC SQL WHENEVER SQLERROR CONTINUE;
    EXEC SQL CLOSE C;
    EXEC SQL ROLLBACK RELEASE;
    exit(1);
}

명령어.

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

댓글 쓰기

댓글 목록