반응형

기본 SQL문 실행

    일반적인 SQL문을 실행하는 것에 대해서 알아보겠습니다. default connection으로 처리할 경우에는 AT절을 생략가능합니다.

 

 

SELECT (단건 조회)

    char emp_name[54];
    char job[32];
    long salary;
    long emp_number;

    ......

    EXEC SQL AT :db_con1  SELECT ename, job, sal 
    INTO :emp_name, :job_title, :salary
    FROM emp
    WHERE empno = :emp_number;

    if(sqlca.sqlcode != 0) {  // 오류이면
        if(sqlca.sqlcode == 1403) {  // 조건에 맞는 데이터가 없으면...
            printf("조회된 데이터 존재하지 않습니다.\n");
            return 0;
        } else {
            fprintf(stderr, "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
            return -1;
        }
    }

위의 예제는 Table명 EMP의 column인 ENAME, JOB, SAL 컬럼의 정보를 조회해서 emp_name, job_title, salary라는 C언어의 변수에 저장하는 단건 조회 SQL문 실행 예제입니다. 만약, default Connection이라면 AT :db_con1 부분을 삭제하면 됩니다.

 


 

SELECT  ~ FETCH (다건 조회)

    char emp_name[54];
    long dept_number;
    long salary;
    long emp_number;

    ......

    EXEC SQL  AT :db_con1  DECLARE emp_cursor CURSOR FOR
    SELECT ename, empno, sal
    FROM emp
    WHERE deptno = :dept_number;

    EXEC SQL OPEN emp_cursor;

    if(sqlca.sqlcode != 0) {
        fprintf(stderr, "CURSOR OPEN ERROR: %.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
        return -1;
    }

    while(1) {
        EXEC SQL FETCH emp_cursor
        INTO :emp_name, :emp_number, :salary;

        if(sqlca.sqlcode != 0) {  // 오류이면
            if(sqlca.sqlcode == 1403) {  // 더 이상 조회된 내용이 없는 경우
                printf("조회된 데이터가 더 없습니다.\n");
                break;
            } else {
                fprintf(stderr, "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
                return -1;
            }
        }
        
        printf("성명: %s \t사번: %ld \t급여: %f\n", emp_name, emp_number, salary);
    }
    
    ......

위에서 default Connection이라면 AT :db_con1 부분을 삭제하면 됩니다.

 


 

INSERT

    char emp_name[54];
    long dept_number;
    long salary;
    long emp_number;

    ......

    EXEC SQL  AT :db_con1  INSERT INTO emp (empno, ename, sal, deptno)
    VALUES (:emp_number, :emp_name, :salary, :dept_number);

   // SQL 수행오류이면
   if(sqlca.sqlcode != 0) { 
        fprintf(stderr, "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
        return -1;
   }
   ......

위에서 default Connection이라면 AT :db_con1 부분을 삭제하면 됩니다.

 


UPDATE

    long commission;
    long salary;
    long emp_number;

    ......

    EXEC SQL AT :db_con1  
    UPDATE emp
    SET sal = :salary, 
        comm = :commission
    WHERE empno = :emp_number;

    // SQL 수행오류이면
    if(sqlca.sqlcode < 0) { 
        fprintf(stderr, "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
        return -1;
    }

    if(sqlca.sqlerrd[2] == 0) {
        fprintf(stderr, "UPDATE된 데이터가 한 건도 없습니다.\n");
        return -1;
    } else {
        printf("%d 건의 데이터가 UPDATE되었습니다.\n", sqlca.sqlerrd[2]);
        return 0;
    }
	......
	

위에서 default Connection이라면 AT :db_con1 부분을 삭제하면 됩니다.

 


 

DELETE

    long commission;
    long salary;
    long emp_number;

    ......

    EXEC SQL AT :db_con1  DELETE FROM emp
    WHERE deptno = :dept_number ;

    // SQL 수행오류이면
    if(sqlca.sqlcode < 0) { 
        fprintf(stderr, "%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
        return -1;
    }

    if(sqlca.sqlerrd[2] == 0) {
        fprintf(stderr, "삭제된 데이터가 한 건도 없습니다.\n");
        return -1;
    } else {
        printf("%d 건의 데이터가 삭제되었습니다.\n", sqlca.sqlerrd[2]);
        return 0;

    }
	......

위에서 default Connection이라면 AT :db_con1 부분을 삭제하면 됩니다.

 

 

 

See Also : Pro*C 목차 및 Sample Source

 

 

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,