절차형 SQL은 SQL 문 안에 절차적인 제어 흐름을 넣어 여러 작업을 순서대로 수행하게 만든다. 내장 SQL은 C나 Java 같은 호스트 언어 안에 SQL 문을 직접 넣는 방식이고, 절차형 SQL은 그 반대로 하나의 객체 안에 처리 절차를 담는다.
내장 SQL에서는 호스트 변수와 데이터베이스 필드가 연결된다. 두 이름은 같아도 되며 충돌하면 호스트 변수가 우선 적용된다. 다만 호스트 변수와 필드의 데이터 타입은 일치해야 하고, 불일치하면 오류가 발생한다. SQL 문은 프로그램 실행 흐름이 가능한 곳에 위치하며 컴파일 시 전처리 과정을 거친다.
커서는 결과 집합의 행을 하나씩 처리할 때 쓴다. 순서는 정해져 있다. DECLARE CURSOR로 커서를 선언하고, OPEN으로 열어 결과를 준비한 뒤, FETCH로 행을 가져온다. 선언과 열기가 끝나야 가져오기가 가능하다.
트리거는 삽입·갱신·삭제 같은 이벤트가 발생할 때마다 관련 작업을 자동으로 수행하는 절차형 SQL 객체다. 트랜잭션을 취소하는 롤백과 달리, 정상 흐름에서 부수적인 값을 자동 갱신하는 데 쓰인다. 무결성은 데이터 정확성을 지키는 제약이고, 잠금은 동시성 제어 기법이므로 자동 실행 절차와 구분한다.
SQL 문법에서는 명령어와 짝이 되는 키워드가 정해져 있다. UPDATE는 SET, INSERT는 INTO, DELETE는 FROM을 쓰고, CREATE VIEW는 AS로 뷰를 정의한다. TO는 뷰 정의에 쓰이지 않는다. NULL은 값이 없음을 뜻하는 특수 상태라서 등호나 부등호로 비교할 수 없고, IS NULL 또는 IS NOT NULL로만 판별한다.
예제
사용자 정의 함수 문제는 자동 실행과 절차 구조를 구분하는 데서 갈린다. 이벤트 발생 시 자동 수행을 묻는데 무결성이나 잠금을 고르면 틀린다. 커서 문제는 FETCH 앞에 무엇이 와야 하는지를 묻고, 선언과 열기 조합을 골라야 한다.
내장 SQL에서는 이름이 같으면 안 된다는 절대 규칙을 함정으로 깐다. 이름은 같아도 되고 호스트 변수가 우선이며, 타입만 일치하면 된다. NULL 문제는 != NULL이나 <> NULL 같은 비교 연산자를 선지로 섞으므로 IS NOT NULL을 찾아야 한다. 명령어 짝 문제는 CREATE VIEW에 TO를 붙여 틀린 조합을 만든다.
대표 기출 3문항
데이터베이스 시스템에서 삽입, 갱신, 삭제 등의 이벤트가 발생할 때마다 관련 작업이 자동으로 수행되는 절차형 SQL은?
트리거(trigger)
무결성(integrity)
잠금(lock)
복귀(rollback)
정답과 해설 보기
정답 ① · 삽입, 갱신, 삭제 등의 이벤트 발생 시 관련 작업이 자동으로 수행되는 절차형 SQL을 묻는 문제이다. 트리거(trigger)는 데이터베이스에서 INSERT, UPDATE, DELETE 같은 이벤트가 발생하면 정의된 절차가 자동으로 실행되는 절차형 SQL 객체이다.
이벤트 발생 시 자동으로 관련 작업을 수행하는 절차형 SQL 객체는 트리거입니다.
삽입(embedded) SQL 문이 포함된 응용 프로그램에서 프로그램의 중간에 ‘EXEC SQL FETCH C1.....'과 같은 문장이 포함되어 있다면, 이 문장이 나타나기 전에 반드시 먼저 나타나야 되는 삽입 SQL명령어들로 구성된 것은?
DECLARE CURSOR
DECLARE CURSOR, OPEN
DECLARE CURSOR, OPEN, PREPARE
DECLARE CURSOR, OPEN, PREPARE, EXECUTE
정답과 해설 보기
정답 ② · 삽입 SQL에서 FETCH 문 실행 전에 선행해야 할 명령어 조합을 묻는 문제이다. 커서를 사용해 행을 하나씩 가져오려면 먼저 DECLARE CURSOR로 커서를 정의하고 OPEN으로 커서를 활성화해야 FETCH가 가능하다.
커서(Cursor)를 사용하여 행을 순차적으로 가져오려면 DECLARE CURSOR로 커서를 선언하고, OPEN으로 커서를 연 후 FETCH해야 한다.
회사원이라는 테이블에서 사원명을 찾을 때, 연락번호가 Null 값이 아닌 사원명을 모두 찾을 때의 SQL 질의로 옳은 것은?
SELECT 사원명 FROM 회사원 WHERE 연락번호 !=NULL;
SELECT 사원명 FROM 회사원 WHERE 연락번호 <> NULL;
SELECT 사원명 FROM 회사원 WHERE 연락번호 IS NOT NULL;
SELECT 사원명 FROM 회사원 WHERE 연락번호 DON'T NULL;
정답과 해설 보기
정답 ③ · Null 값이 아닌 조건을 검사하는 올바른 SQL 문법을 묻는 문제이다. SQL에서 Null은 값이 없음을 의미하므로 비교 연산자로 검사할 수 없고, 반드시 IS NULL 또는 IS NOT NULL 구문을 사용해야 한다.
SQL에서 Null 값은 비교 연산자 대신 IS NOT NULL 구문을 사용하여 검사해야 한다.