PL/SQL - 커서: 데이터 조작의 관문
안녕하세요, 미래의 데이터 마법사 여러분! 오늘 우리는 PL/SQL 커서의 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 처음이라면 걱정하지 마세요 - 나는 여러분의 친절한 안내자가 되겠습니다. 우리는 이 주제를 단계별로 탐구하겠습니다. 이 튜토리얼의 끝을 맺을 때쯤에는 여러분이 프로처럼 커서를 다를 수 있을 것입니다!
커서는 무엇인가요?
들어가기 전에 커서가 무엇인지 이해해 보겠습니다. 당신이 바uffet(buffet)에 있는 것을 상상해 봅시다 (나쁜 경험을 드리게 되서 정말 죄송합니다!). 당신은 접시(프로그램)를 가지고 있고, 모든 맛있는 요리(데이터베이스 테이블)를 보고 있습니다. 커서는 당신의 손과 같아요 - 바uffet에서 특정 아이템을 선택하여 접시에 올려놓는 데 도움을 줍니다. 데이터베이스 용어로, 커서는 데이터베이스에서 행을 하나씩 검색하고 조작할 수 있게 해줍니다.
이제 PL/SQL에서 두 가지 유형의 커서를 탐구해 보겠습니다:
내재 커서
내재 커서는 스마트폰 카메라의 자동 기능과 같아요 - 배경에서 당신이 많이 할 필요 없이 자동으로 작동합니다. Oracle은 SQL 문을 실행할 때 자동으로 이 커서를 생성하고 관리합니다.
예제를 보겠습니다:
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employees received a 10% raise!');
ELSE
DBMS_OUTPUT.PUT_LINE('No employees in department 20 found.');
END IF;
END;
/
이 코드에서:
- 우리는 부서 20의 직원들의 급여를 10% 인상하고 있습니다.
-
SQL%FOUND
은 내재 커서의 속성으로, UPDATE가 어떤 행에 영향을 미쳤는지 반환합니다. - 이를 사용하여 적절한 메시지를 출력합니다.
다른 유용한 내재 커서 속성으로는 다음이 있습니다:
-
SQL%ROWCOUNT
: 영향을 받은 행의 수 -
SQL%ISOPEN
: 내재 커서는 항상 FALSE를 반환 -
SQL%NOTFOUND
:SQL%FOUND
의 반대
명시 커서
명시 커서는 카메라의 수동 모드와 같아요 - 더 많은 제어권을 가지지만, 스스로 관리해야 합니다. 행을 하나씩 처리하거나 데이터 검색 과정에 더 많은 제어를 원할 때 완벽합니다.
명시 커서의 수명 주기를 분해해 보겠습니다:
커서 선언
먼저, 우리는 PL/SQL 블록에서 어떤 데이터를 다루고 싶은지 알려줘야 합니다. 바uffet에서 무엇을 먹고 싶은지 결정하는 것과 같습니다.
DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;
여기서 우리는 부서 30의 직원 정보를 가져올 커서 c_emp
를 선언했습니다.
커서 열기
이제 우리는 무엇을 원하는지 결정했으므로, 바uffet(또는 데이터베이스)에 다가가는 시간입니다.
OPEN c_emp;
이 문은 Oracle에 SELECT 문을 실행하고 결과 set을 준비하도록 지시합니다.
커서 가져오기
이제 우리는 실제로 접시에 음식을 올리는 것 - 즉, 데이터를 행별로 검색하는 단계입니다.
DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/
이 예제에서:
- 우리는 가져온 데이터를 저장할 변수를 선언합니다.
- 커서를 엽니다.
- 루프를 사용하여 행을 하나씩 가져옵니다.
- 더 이상 행이 없을 때 루프를 종료합니다 (c_emp%NOTFOUND).
- 각 직원의 세부 정보를 출력합니다.
커서 닫기
접시를 채운 후 바uffet에서 돌아가는 것처럼, 우리는 커서를 닫아야 합니다.
CLOSE c_emp;
이렇게 하면 커서와 관련된 자원을 해제합니다.
커서 FOR 루프: 단축 경로
이제 커서를 더 쉽게 사용할 수 있는 방법을 소개해 드릴게요. 커서 FOR 루프입니다. 바uffet에서 도움을 주는 친절한 친구와 같아요!
BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/
이 마법의 루프는 모든 작업을 위해 다음을 수행합니다:
- 레코드 변수 (
emp_rec
)를 선언하여 각 행을 저장합니다. - 커서를 엽니다, 행을 가져오고, 커서를 닫습니다.
- 루프 내에서 각 행에 대해 무엇을 할지에 집중합니다.
커서 메서드: 당신의 유용한 도구箱
커서를 사용할 수 있는 메서드를 요약한 표를 보여드리겠습니다:
메서드 | 설명 |
---|---|
DECLARE | 커서와 그 SELECT 문을 정의 |
OPEN | SELECT 문을 실행하고 결과 set을 준비 |
FETCH | 결과 set에서 다음 행을 가져옵니다 |
CLOSE | 커서를 닫고 자원을 해제 |
기억하십시오, 강력한 권한은 큰 책임을 동반합니다. 커서를 사용한 후에는 항상 커서를 닫아 자원을 해제하십시오!
그렇게 해서, 내 사랑하는 학생들이! 여러분은 PL/SQL 커서의 세계로 첫 걸음을 냈습니다. 이 개념을 연습하고, 다양한 시나리오를 연구하면 곧 경험 많은 프로그래머처럼 데이터베이스를 자유자재로 이동할 수 있을 것입니다.
프로그래밍에서도, 인생에서도, 중요한 것은 계속 배우고 실험하는 것입니다. 그러므로 코드를 작성하고, 실수를 하고, 가장 중요한 것은 즐기세요! 누구 knows? 다음 위대한 데이터베이스 애플리케이션이 바로 여러분의 손에 있을지도 모릅니다. 행복한 코딩을 기원합니다!
Credits: Image by storyset