Database/공통

[DB]내장 SQL와 커서

retto9522 2024. 8. 28. 17:02

내장 SQL(Embedded SQL)이란?

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

호스트 프로그램 언어?
데이터베이스와 상호 작용하기 위해 사용되는 프로그래밍 언어를 의미합니다.
Java, Python, C++, PHP 등의 언어들이 이에 해당합니다. 이 언어들은 데이터베이스와의 연동을 위한 라이브러리나 프레임워크를 제공하여 개발자가 쉽게 데이터베이스 작업을 수행할 수 있게 합니다. 

 

 

내장 SQL의 특징

  1. 내장 SQL 실행문은 호스트 프로그램 언어에서 실행문이 나타날 수 있는 곳이면 프로그램의 어느 곳에서나 사용할 수 있습니다.
  2. 일반 SQL문은 수행 결과로 여러 개의 Tuple을 반환하는 반면, 내장 SQL은 단 하나의 Tuple을 반환합니다.
  3. 내장 SQL문에 반환되는 Tuple은 일반 변수를 사용하여 저장할 수 있습니다.
  4. 호스트 프로그램 컴파일 시, 내장 SQL은 선행처리기에 의해 분리되어 컴파일 됩니다.
  5. 호스트 변수와 데이터베이스 필드는 같은 이름을 가질 수 있습니다.
  6. 내장 SQL에 사용된 호스트 변수의 데이터 타입은 이에 대응하는 데이터베이스 필드의 데이터 타입과 일치해야 합니다.
  7. 내장 SQL문이 실행되면 SQL 실행 상태가 SQL 상태 변수에 전달됩니다. 
  8. 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문을 확정 짓기 때문에 실행 시 오버헤드를 줄일 수 있습니다.