본문 바로가기

Programming/DataBase

내장 SQL

내장 SQL(Embedded SQL, 삽입 SQL) 개념

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


내장 SQL 특징

- 응용 프로그램에 삽입되어 사용되는 SQL이다.

- 내장 SQL 실행문은 호스트 실행문이 나타나는 곳이면 어디든 사용이 가능하다.

- 일반 SQL문은 실행 결과로 여러 개의 튜플을 반환하는 반면, 내장 SQL문은 실행 결과가 여러개의 튜플이어도 맨 처음의 튜플 하나만을 반환한다.

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

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

- SQL 문장의 식별자로서 ‘EXEC SQL' 을 앞에 붙여 다른 호스트 명령문과 구별한다.

- JAVA에서는 #SQL{<내장 SQL문>}

- SQL 문에 사용되는 호스트 변수는 콜론(:)을 앞에 붙인다.

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

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


* SQL 상태변수 

SQLSTATE값이 '00000'이면 내장 SQL이 성공적으로 실행된 것을 의미하고, '02000'이면 검색된 결과가 없다는 것을 의미.


ex) 

EXEC SQL BEGIN DECLARE SECTION;

int SNO;

char SNAME[20];

char DEPT[6];

char SQLSTATE[5];

EXEC SQL END DECLARE SECTION;

SNO=100;

EXEC SQL SELECT SNAME, DEPT

INTO :SNAME, :DEPT    <----위에서 선언한 호스트 변수.

FROM STUDENT

WHERE SNO=:SNO;


IF(SQLSTATE=='00000')

THEN...;

ELSE...;


커서(Cursor)

- 커서는 내장 SQL문의 실행결과로 반환된 복수 개의 튜플들을 접근할 수 있도록 해주는 개념이다.

- 커서는 질의 실행결과로 반환된 테이블의 튜플들을 순서대로 가리키는 튜플에 대한 포인터로 생각할 수 있다.

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

- 커서 관련 명령어

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

OPEN :커서가 질의 결과의 첫번째 튜플을 가리키도록 설정하는 명력어

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

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


ex)

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 * 1.1

WHERE CURRENT OF person; <---커서 'person'이 실행되어 가리키는 현재의 튜플만 대상으로 한다.

EXEC SQL FETCH person INTO :salary;}


EXEC SQL CLOSE person;

'Programming > DataBase' 카테고리의 다른 글

[DataBase] 이상 (Anomaly)  (0) 2013.06.28
[DataBase] 스토어드 프로시저 (Stored Procedure)  (0) 2013.06.28
SQL - DCL  (0) 2013.06.26
SQL - DML  (0) 2013.06.26
SQL - JOIN  (0) 2013.06.26