DML문
PL/SQL 블록 상에서 사용하는 변수, 상수, 연산자는 사실 부차적인 용도로 사용될 뿐이다. 실제로 PL/SQL 블록을 작성하는 원래의 목적은 테이블 상에 있는 데이터를 이리저리 가공해서 특정 로직에 따라 무언가를 처리하는 것이며, 따라서 주로 사용되는 것은 SQL문이다. SQL문 중 DDL은 PL/SQL 상에서 직접 쓸 수 없고(물론 전혀 방법이 없는 것은 아니다) DML문만 사용한다.
예를 들어, 사원 테이블에서 특정 사원의 이름과 부서명을 가져와 출력하는 코드를 작성한다고 해 보자.
입력
DECLARE
vs_emp_name VARCHAR2(80); -- 사원명 변수
vs_dep_name VARCHAR2(80); -- 부서명 변수
BEGIN
SELECT a.emp_name, b.department_name
INTO vs_emp_name, vs_dep_name
FROM employees a,
departments b
WHERE a.department_id = b.department_id
AND a.employee_id = 100;
DBMS_OUTPUT.PUT_LINE( vs_emp_name || ' - ' || vs_dep_name);
END;
결과
Steven King - 기획부
vs_emp_name와 vs_dep_name라는 두 개의 변수를 선언한 뒤, 사원 테이블에서 사번이 100인 사원의 이름과 부서명을 가져와 변수에 할당한 뒤 출력하였다. 여기에서 중요한 점은, 테이블에 있는 데이터를 선택해 변수에 할당할 때는 SELECT 문에서 INTO절을 사용한다는 점이다. 이때 선택하는 컬럼에 따라 변수의 순서, 개수, 데이터 타입을 반드시 맞춰 줘야 한다.
또한 사원 테이블의 사원명과 부서명 타입을 동일하게 맞춰서 변수를 선언했는데, 변수의 개수가 많아지면 해당 컬럼에 대응되는 변수 타입을 일일이 찾기가 번거로울 수 있다. 이럴 때는 다음과 같이 %TYPE 키워드를 쓰면 해당 변수에 컬럼 타입을 자동으로 가져온다.
변수명 테이블명.컬럼명%TYPE;
입력
DECLARE
vs_emp_name employees.emp_name%TYPE;
vs_dep_name departments.department_name%TYPE;
BEGIN
SELECT a.emp_name, b.department_name
INTO vs_emp_name, vs_dep_name
FROM employees a,
departments b
WHERE a.department_id = b.department_id
AND a.employee_id = 100;
DBMS_OUTPUT.PUT_LINE( vs_emp_name || ' - ' || vs_dep_name);
END;
결과
Steven King - 기획부
%TYPE 키워드를 사용하면, 일일이 변수 타입을 찾는 번거로움도 제거하고 데이터 타입을 잘못 선언할 위험도 없앨 수 있으므로 매우 유용한 기능 중 하나다. PL/SQL 내에서는 SELECT문 외에도 INSERT, UPDATE, MERGE, DELETE문도 쓸 수 있으며 이들에 대해서는 이후 다양한 예제를 통해 살펴볼 것이다.