내장형(Embedded) SQL - 다른 프로그램 내에 삽입된 SQL

2020. 6. 21. 20:00컴퓨터언어/Database

728x90
반응형

 

 

지금까지의 SQL은 모두 사용자가 명령어를 내리는 즉시 DBMS가 결과를 보여주는, "대화식 SQL"이었다.

하지만 현대 응용프로그램은 데이터베이스와 연동되는 경우가 매우 많기 때문에, 프로그램 구동 시 SQL 명령도 같이 내려야 할 필요가 생겼고, 그래서 C, C++, JAVA 등 다른 언어에 SQL문을 삽입된 형태를 "내장형 SQL"이라고 한다.

JAVA 같은 언어는 내장형 SQL을 그대로 컴파일 할 수 없기 때문에, "EXEC SQL"을 앞에 붙여 "전처리기"에 의해 먼저 분리컴파일한다.

 

대화식 SQL은 사용자와 DBMS가 실시간으로 문답하기 때문에 여러 개의 튜플을 반환할 수 있었다.

하지만 내장형 SQL은 다른 언어에서 SQL 명령을 함수의 호출로 실행하고 나서 반환된 값을 하나의 변수에 저장하게 된다.

이때 변수공간은 하나의 값을 기억하기 때문에, 내장형 SQL은 단 하나의 튜플만을 반환한다는 차이가 있다.

이는 명백한 단점이지만, "커서"라는 반복문 처리를 통해 여러 개의 튜플을 가져오는 효과를 대신할 수 있다.

 

SQL을 돌린 결과를 담는 변수는 "호스트 변수"라고 하며, 이를 SQL 내 테이블 속성과 구별하기 위해 변수명 앞에 ":(콜론)"을 붙인다.

그리고 내장 SQL에서 튜플을 추출하기 전에 담을 변수를 모두 선언해놓아야 당연히 오류가 발생하지 않는다.

변수 선언은 BEGIN DECLARE SECTION 과 END DECLARE SECTION 사이에 위치한다.

 

EXEC SQL BEGIN DECLARE SECTION // 지금부터 C++언어가 아닌 내장형 SQL문을 작성할 것이며, 사용할 호스트 변수를 선언할 것입니다.
int SNO; // 정수형 SNO
char SNAME[20]; // 20바이트 문자열 SNAME
char DEPT[6]; // 6바이트 문자열 DEPT
char SQLSTATE[5]; // 5바이트 문자열 SQLSTATE(SQL상태저장용)
EXEC SQL END DECLARE SECTION; // 호스트 변수 선언을 마칩니다.
SNO = 100; // 생성한 SNO에 100을 대입합니다.
EXEC SQL SELECT SNAME, DEPT // 지금부터 내장형 SQL문을 작성합니다. STUDENT 테이블에서 SNAME, DEPT속성을 골라 SNAME, DEPT 변수에 저장합니다.
INTO :SNAME, :DEPT
FROM STUDENT
WHERE SNO=:SNO; // 단, STUDENT 테이블 내 SNO 값이 100인 튜플만 추출합니다.
728x90
반응형