Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

subsay

관계 데이터베이스 모델과 언어 - 내장 SQL 본문

정보처리 기사

관계 데이터베이스 모델과 언어 - 내장 SQL

subsay 2017. 9. 30. 13:45

1. 내장 SQL(Embedded SQL)의 정의

 내장 SQL은 응용 프로그램 내에 데이터베이스에서 사용하는 데이터를 정의하거나 질의하는 SQL 문장을 내포하여 프로그램이 실행될 때 함께 실행되도록 호스트 프로그램 언어*로 만든 프로그램에 삽입된 SQL이다.


*호스트 프로그램 언어

PASCAL, COBOL, C, C++, Visual BASIC 같은 프로그밍 언어를 말합니다.


2. 내장 SQL의 특징

 - 내장 SQL 실행문은 호스트 언어에서 실행문이 나타날 수 있는 곳이면 프로그램의 어느 곳에서나 사용할 수 있다.

 - 일반 SQL문은 수행 결과로 여러 개의 튜플을 반환하는 반면, 내장 SQL은 단 하나의 튜플만을 반환한다.

 - 내장 SQL문에 의해 반환되는 튜플은 일반 변수를 사용하여 지정할 수 있다.

 - Host Program의 컴파일 시 내장 SQL문은 선행처리기에 의해 분리되어 컴파일 된다.

 - 호스트 변수와 데이터베이스 필드의 이름은 같아도 된다.

 - 내장 SQL문은에 사용된 호스트 변수의 데이터 타입은 이에 대응하는 데이터베이스 필드의 SQL 데이터 타입과 일치하여야 한다.

 - 내장 SQL문이 실행되면 SQL 실행의 상태가 SQL 상태 변수*에 전달된다.



*SQL 상태 변수

삽입 SQL문 실행 후 SQLCODE라는 묵시적 변수에 성공, 실패, 오류 등의 결과를 정수 값으로 전달합니다.

 - 0 : 성공

 - 100 : NOT FOUND

 - 양수 : 경고

 - 음수 : 에러

※ SQL2에서는 SQLSTATE라는 변수를 사용합니다.

 - 00000 : 성공

 - 02000 : NOT FOUND


3. 호스트 언어의 실행문과 구분시키는 방법

 프로그램에서 호스트 실행문과 내장 SQL문을 구분하기 위한 방법이다.


명령문의 구분

 - C/C++에서 내장 SQL문은 $와 세미콜론(;) 문자 사이에 기술한다.

 - Visual BASIC에서는 내장 SQL문 앞에 'EXEC SQL'을 기술한다.


변수의 구분

 내장 SQL에서 사용하는 호스트 변수는 변수 앞에 콜론(:) 문자를 붙인다.


4. 커서(Cursor)

 - 커서(Cursor)는 내장 SQL문의 수행 결과로 반환될 수 있는 복수의 튜플들을 엑세스 할 수 있도록 해주는 개념이다.

 - 커서는 질의 수행 결과로 반환되는 첫 번째 튜플에 대한 포인터로 생각할 수 있다.

 - 커서를 사용하여 질의 결과로 반환될 수 있는 튜플들을 한 번에 하나씩 차례로 처리 할 수 있다.


커서 관련 명령어

 - DECLARE : 커서를 정의하는 등 커서에 관련된 선언을 하는 명령

 - OPEN : 커서가 질의 결과의 첫 번째 튜플을 포인트하도록 설정하는 명령

 - FETCH : 질의 결과의 튜플들 중 현재의 다음 튜플로 커서를 이동 시키는 명령

 - CLOSE : 질의 수행 결과에 대한 처리 종료 시 커서를 닫기 위해 사용하는 명령


*호스트 언어에서 내장 SQL 커서 사용 예


EXEC SQL BEGIN DECLARE SECTION

int department;

int salary;

EXEC SQL END DECLARE SECTION


EXEC SQL DECLARE PERSON CURSOR FOR

SELECT SALARY

FROM EMPLOYEE

WHERE DEPARTMENT = :DEPARTMENT;

EXEC SQL OPEN PERSON;


EXEC SQL FETCH PERSON INTO :salary;

while (SQLSTATE =="00000")

{EXEC SQL UPDATE EMPLOYEE

SET SALARY = SALARY / 0.9

WHERE CURRENT OF PERSON;

EXEC SQL FETCH PERSON INTO :salary;}

EXEC SQL CLOSE PERSON;