Database/공통
[DB]내장 SQL와 커서
retto9522
2024. 8. 28. 17:02
내장 SQL(Embedded SQL)이란?
응용 프로그램 내 데이터베이스에서 사용하는 데이터를 정의하거나 질의하는 SQL 문장을 내포하여 프로그램이 실행될 때 함께 실행되도록 호스트 프로그램 언어로 만든 프로그램에 삽입된 SQL입니다.
호스트 프로그램 언어?
데이터베이스와 상호 작용하기 위해 사용되는 프로그래밍 언어를 의미합니다.
Java, Python, C++, PHP 등의 언어들이 이에 해당합니다. 이 언어들은 데이터베이스와의 연동을 위한 라이브러리나 프레임워크를 제공하여 개발자가 쉽게 데이터베이스 작업을 수행할 수 있게 합니다.
내장 SQL의 특징
- 내장 SQL 실행문은 호스트 프로그램 언어에서 실행문이 나타날 수 있는 곳이면 프로그램의 어느 곳에서나 사용할 수 있습니다.
- 일반 SQL문은 수행 결과로 여러 개의 Tuple을 반환하는 반면, 내장 SQL은 단 하나의 Tuple을 반환합니다.
- 내장 SQL문에 반환되는 Tuple은 일반 변수를 사용하여 저장할 수 있습니다.
- 호스트 프로그램 컴파일 시, 내장 SQL은 선행처리기에 의해 분리되어 컴파일 됩니다.
- 호스트 변수와 데이터베이스 필드는 같은 이름을 가질 수 있습니다.
- 내장 SQL에 사용된 호스트 변수의 데이터 타입은 이에 대응하는 데이터베이스 필드의 데이터 타입과 일치해야 합니다.
- 내장 SQL문이 실행되면 SQL 실행 상태가 SQL 상태 변수에 전달됩니다.
- EXEC SQL을 앞에 붙여 사용합니다. (ex. EXEC SQL DECLARE → 사용할 변수 선언)
SQL 상태 변수
삽입 SQL문 실행 후, SQL CODE 라는 묵시적 변수에 성공, 실패, 오류 등의 결과 값에 대한 정수를 전달합니다.
- 0: Success
- 100: NOT FOUND
- 양수: Warning
- 음수: Error
커서(Cursor)
내장 SQL문의 검색 결과로 반환된 Tuple들을 액세스할 수 있게 해줍니다.
커서를 통해 질의 결과로 반환될 수 있는 Tuple들을 한 번에 하나씩 순서대로 처리할 수 있습니다.
즉, 쉽게 말해 데이터베이스에서 쿼리 결과를 순차적으로 처리하는 포인터입니다.
커서 관련 명령어
- DECLARE: CURSOR와 관련된 SQL문을 선언하는 명령
- OPEN: 선언된 질의문을 실행하는 명령
- CLOSE: 질의 수행 결과에 대한 처리를 종료할 때 커서를 닫는 명령
- FETCH: 질의 결과의 Tuple들 중 현재 Tuple로 Cursor를 이동시키는 명령
커서 사용 예시 코드
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;
내장 SQL은 언제 사용해야 할까?
- 데이터베이스와 직접 상호작용이 필요한 애플리케이션을 개발할 때 사용합니다.
- 복잡한 데이터베이스 작업을 수행해야 할 때 사용합니다.
- 정적 SQL문을 사용하여 성능을 최적화해야 할 때 사용합니다.
- 호스트 언어와 SQL을 긴밀하게 통합해야 하는 경우 사용합니다.
내장 SQL은 특히 데이터베이스 중심의 애플리케이션에서 효과적이며, 컴파일 시점에 SQL문을 확정 짓기 때문에 실행 시 오버헤드를 줄일 수 있습니다.