컴퓨터공학/데이터베이스

[데이터베이스] SQL - Structured Query Language3

NIMHO 2022. 11. 12. 00:37
728x90

복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.

지난 글에 이어서 작성해 보도록 하겠습니다.

2022.11.11 - [컴퓨터공학/데이터베이스] - [데이터베이스] SQL - Structured Query Language2

 

[데이터베이스] SQL - Structured Query Language2

복습하기 위해 학부 수업 내용을 필기한 내용입니다. 이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다. 그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다. 지난 글

dhalsdl12.tistory.com

삽입 SQL

삽입 SQL은 이중 모드 (dual mode) 특성을 가지고 있다.

터미널에서 대화식으로 사용할 수 있는 모든 SQL문은 응용 프로그램에서도 그대로 사용할 수 있는 특성을 가진다.

 

삽입 SQL을 포함하는 응용 프로그램의 특징

  • 명령문 앞에 EXEC SQL을 붙여 다른 명령문과 쉽게 구별 가능하다.
  • 호스트 변수BEGIN DECLAREEND DECLARE SECTION 문을 사용하여 선언된다.
  • SQL문에서 사용되는 호스트 변수는 콜론(:)을 앞에 붙인다.
  • 호스트 변수와 DB 필드의 이름은 같아도 된다.
  • 호스트 변수와 대응하는 SQL 열의 데이터 타입은 일치해야 한다.
  • SQLSTATE라는 호스트 변수를 포함, SQL문이 실행되면 실행 상태(성공, 실패, 오류)가 이 변수에 전달된다.

호스트 변수는 사용하기 전에 반드시 SQL 선언 부인 BEGIN DECLARE SECTION 속에서 선언되어야 한다.

EXEC SQL BEGIN DECLARE SECTION;			/*호스트 변수 선언*/
	int sno;
	char sname[21];
	char dept[7];
	char SQLSTATE[6];
EXEX SQL END DECLARE SECTION;

sno = 20181234;

EXEC SQL SELECT 학번, 성명, 학과
		INTO :sno, :sname, :sdept
		FROM 학생 WHERE 학번 = :sno;
						/*삽입 SQL (호스트 변수 포함)*/
IF (SQLSTATE = '00000')				/*실행 상태*/
	.. ...;
ELSE ...;

 

 단일 레코드 검색

#include <stdio.h>
int main()
{
	EXEC SQL BEGIN DECLARE SECTION;
		int sno;
		char sname[10];
		char sdept[20];
	EXEC SQL END DECLARE SECTION;

	sno = 20181234;

	EXEC SQL CONNECT TO academicDB USER kim;
	EXEC SQL SELECT sno, sname, sdept
			INTO :sno, :sname, :sdept
			FROM student WHERE sno = :sno;
	printf("Student no : %s, name : %s, dept : %s", sno, sname, sdept);
	return 0;
}

WHERE 절을 만족하는 레코드가 오직 하나만 있을 때

그 레코드의 학번, 성명, 학과 값이 호스트 변수 sno, sname, sdept에 저장된다.

 

단일 레코드 갱신

    학번 20183654 학생이 수강한 학생의 점수를 호스트 변수 x 값만큼 증가시켜라.

EXEC SQL UPDATE 수강
	SET 점수 = 점수 + :x WHERE 학번 = 20183654;
728x90

 복수 레코드 검색

여러 개의 레코드가 검색되는 삽입 SQL문

집합 속에 있는 레코드를 하나씩 접근하기 위해 커서(cursor)를 사용한다.

  • DECLARE CURSOR은 뒤에 나오는 SELECT 문을 연결한다.
  • SELECT 문은 CURSOR가 OPEN 될 때 실행된다.
  • 커서는 각 튜플을 가리키는 포인터로 생각할 수 있다.
    • CURSOR가 OPEN 될 때 SELECT 문이 실행된다.
    • 결과의 첫 번째 튜플 이전을 커서가 가리키게 된다.
  • FETCH 문은 커서를 다음 튜플로 이동하게 한다.
  • DO... END 문 내에서 루프(loop)를 수행한다.
  • 더 이상 레코드가 없으면 루프가 종료되고, CLOSE 문에서 커서를 닫는다.
EXEC SQL DECLARE cur CURSOR FOR 		/*커서의 정의*/ 
		SELECT 학번, 성명, 학과
		FROM 학생 WHERE 학과 = :sdept;
EXEC SQL OPEN cur; 				/*SELECT문 실행*/
	DO
		EXEC SQL FETCH cur INTO :sno,:sname,:sdept;
						/*다음 레코드 채취*/
			......
	END;
EXEC SQL CLOSE cur; 				/*커서 종료 */

 

커서가 가리키는 특정 레코드 CURRENT OF cur을 변경하거나 삭제하는 예

변경

EXEC SQL UPDATE 학생 SET 학과 = :sdept
		WHERE CURRENT OF cur;

삭제

EXEC SQL DELETE FROM 학생
		WHERE CURRENT OF cur;

동적 SQL

온라인 애플리케이션의 수행과정은 다음과 같다.

  • 터미널로부터 명령문을 접수
  • 입력된 명령문을 분석
  • 데이터베이스에 대한 적절한 SQL문으로 지시
  • 터미널에 메시지나 결과를 반환

이때, 입력 명령문이 상황에 따라 다른 경우 SQL문을 미리 만들어 두는 것이 불가능하게 된다.

따라서 SQL문을 동적으로 작성할 수 있도록 지원하는 기능을 동적 SQL이라 한다.

 

가장 중요한 기본적인 명령은 PREPAREEXECUTE

  • PREPARE
    • 주어진 SQL문을 예비 컴파일하여 목적 코드를 생성하고 stSQL에 저장
  • EXECUTE
    • 저장되어 있는 stSQL의 SQL 목적 코드를 실행
varchar staticSQL[256]; //호스트 변수
staticSQL = “SELECT * FROM 수강
		WHERE 과목코드 = 'CO123' AND 점수>= 90”;
EXEC SQL PREPARE stSQL FROM :staticSQL;
EXEC SQL EXECUTE stSQL;

 

스트링으로 표현되는 staticSQL문에는 호스트 변수를 사용하지 못한다.

그러나, 물음표(?)로 표현되는 매개변수는 사용 가능하다.

Varchar dynamicSQL[256];
dynamicSQL = “SELECT * FROM 수강
		WHERE 과목코드=? AND 점수>=? ”;
	........
EXEC SQL PREPARE dySQL FROM :dynamicSQL;
	........
		code=‘CO123’; 
		score=90;
EXEC SQL EXECUTE dySQL USING :code, :score;
  • 위의 dynamicSQL에는 2개의 물음표 매개변수가 포함되어 있다.
  • 물음표를 포함한 SQL문 실행을 위해 USING 절을 사용한다.
  • 호스트 변수 :code와 :score의 값이 SELECT문의 물음표 순서에 대응한다.
728x90