Database - 내포된 SQL

Bomin Seo·2022년 7월 24일
0
  • SQL이 호스트 언어의 완전환 표현력을 갖고 있지 않기 때문에 모든 질의를 SQL로 표현할 수 없다.
  • SQL은 호스트언어가 가지는 조건문, 반복문, 입출력 등의 동작, 사용자의 상호 작용, 질의 결과를 GUI로 보내는 등의 기능을 가지고 있지 않다.

Embedded SQL

  • C/C++, 코볼, 자바 등의 언어로 작성하는 프로그램에 SQL문을 삽입하여 데이터베이스를 접근하는 부분을 SQL이 담당하며 SQL에 없는 기능을 호스트 언어로 작성한다.

  • 호스트 언어에 포함되는 SQL문을 내포된 SQL이라고 부른다.

  • 전컴파일러로 컴파일을 수행하면 내포된 SQL문이 함수호출문으로 변경된다.

Call-Level Interface(CLI)

  • 호스트 프로그램이 DBMS에 SQL문을 보내고 질의 결과를 DBMS에서 프로그램으로 전송하는 표준

Impedence mismatch

  • SQL문과 호스트언어의 데이터 구조가 불일치 하는 문제가 발생한다.

Pro*C

  • Oracle에서 c프로그램에 SQL을 내포시키는 방법
  • 내포된 SQL문이 포함된 소스파일 확장자는 .pc이다.
  • .pc 파일을 Pro*C를 통하여 전컴파일을 한다면 .C 소스프로그램이 생성된다.
    • SQL문을 함수호출문으로 전컴파일

호스트 변수

  • SQL문에 포함된 C프로그램의 변수
  • 호스트 언어와 SQL문 사이의 통신을 위해 사용한다.
    • SQL문에 사용될 데이터 값을 입력하거나 SQL문의 결과를 출력할 때 사용된다.
  • 호스트 변수를 SQL문에서 사용할 때 : 를 붙여서 사용한다.
  • DECLARE SECTION을 이용하여 호스트언어를 선언한다.

정적인 SQL문

  • C프로그램에 내포된 완전한 SQL문
  • 입력값과 출력데이터를 위해서 C프로그램의 변수들을 포함할 수 있다.
  • INTO : 출력하는 대신 결과값을 받을 변수를 지정한다.

동적인 SQL문

  • 불완전한 SQL문으로서 일부 또는 전부를 질의가 수행될 때 입력이 가능하다

  • 응용을 개발할 때 완전한 SQL문의 구조를 미리 알고 있지 않아도 된다.

  • 문자열 형 변수에 담아서 표현함으로써 동적으로 변경 가능하다

  • 컴파일 시점에 SQL문을 알지 못한다. 프로그램 실행 중 최적화를 한다.

  • PREPARE : 수행속도가 가장 빠른 것을 고르는 질의 최적화 단계, 수행 계획을 만든다.

  • EXECUTE IMMEDIATE : 질의 최적화 단계를 거치지 않고 실행한다.

    • 단발적으로 수행할 경우에는 시간이 오래 걸리는 PREPARE과정을 거치지 않는 것이 바람직하다.

예시

# include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;
	int no;
    varchar title[10];
EXEC SQL END DECLARE SECTION;   // 호스트 변수 선언

EXEC SQL INCLUDE SQLCA.H; 		// SQL 통신 영역

void main()
{
	char *uid = "KIM/kim@DBSERVER";
    EXEC SQL WHENEVER SQLERROR GOTO ERREXIT; // 에러 대응
    EXEC SQL CONNECT :uid;
    // DBSERVER 데이터베이스에 사용자 KIM으로 접속
    printf("Enter employee number : ");
    scanf("%d", &no);
    
    EXEC SQL SELECT title INTO :title  // attribute와 호스트 변수 순서
    printf("\nAuthor's title is %s\n", title);
    EXEC SQL COMMIT WORK;
    exit(0);
  errexit:
  	EXEC SQL ROLLBACK WORK;
    exit(1);
 }

불일치 문제와 커서

  • 호스트 언어는 단일변수 / 레코드 위주의 처리(투플 위주의 방식)를 지원하고, SQL은 데이터 레코드들의 처리(집합위주의 방식)를 지원하기 때문에 불일치 문제가 발생한다.
  • 불일치 문제를 해결하기 위해 커서가 사용된다.
  • 커서는 한 번에 한 투플씩 가져오는 수단이며 2개 이상의 투플 사용시 반드시 커서를 사용한다.

커서

  • DECLARE CURSOR문을 사용하여 커서를 정의한다.
  • OPEN cursor문은 질의를 수행하고 질의 수행 결과의 첫번째 투플 이전을 커서가 가리키도록 한다.
  • 그 다음에 FETCH문은 커서를 다음 투플로 이동하고, 그 투플의 애트리뷰트 값들을 FETCH문에 명시된 호스트 변수들에 복사한다.
  • CLOSE cursor는 커서를 닫는다.

FETCH문

  • 여러 투플을 읽어 오기 위해서는 루프 내의 FETCH문을 사용한다.

  • 루프 종료 조건 : 결과 집합이 비었거나 더이상의 가져올 투플이 없으면 FETCH문은 ‘no data found’ 에러를 발생시키고, WHENEVER NOT FOUND가 이를 인지한다.

WHENEVER

  • 자동적인 에러 검사와 에러 처리를 위한 구문
  • 구문: WHENEVER <조건> <동작>

커서를 이용한 UPDATE

  • 커서의 현재 투플을 업데이트하려면 CURRENT OF 절을 사용한다.
  • CURSOR를 선언할 때 FOR UPDATE OF 키워드를 선택적으로 추가한다.
    • 개발자가 추가하지 않아도, UPDATE 또는 DELETE 문에 CURRENT OF 절이 나오면 전처리기가 필요 시 추가한다.
  • 제약: Index-organized 테이블에는 사용금지. 한 테이블의 애트리뷰트들만 수정 가능

SQL 통신 영역(SQLCA: SQL Communications Area)

  • C 프로그램에 내포된 SQL문에 발생하는 에러들을 사용자에게 알려준다.

  • 사용자는 SQLCA 데이터 구조(SQLCA.H)의 에러 필드와 상태 표시자를 검사하여 내포된 SQL문이 성공적으로 수행되었는가 또는 비정상적으로 수행되었는가를 파악할 수 있다.

  • SQLCA 데이터 구조 중에서 가장 중요하고 널리 사용되는 필드는 sqlcode 멤버 변수

  • sqlcode의 값이 0이면 마지막에 내포된 SQL문이 성공적으로 끝났음을 의미한다.

  • SQLCA를 사용하기 위해서는 아래와 같은 문장을 포함해야 함

    	EXEC SQL INCLUDE SQLCA.H; 
    	or
    	#include <sqlca.h>

에러 메시지: sqlglm() 함수 사용

  • 에러가 난 것을 먼저 확인하고 사용해야 한다.
    - WHENEVER 사용 또는 SQLCODE (or sqlca.sqlcode) 값이 0이 아닐 때
profile
KHU, SWCON

0개의 댓글