2024. 4. 18. 16:50ㆍ카테고리 없음
BEGIN 블록은 PL/SQL에서 실행부를 시작하는 부분으로, SQL 문장과 PL/SQL 문장을 모두 포함할 수 있다.
1. 단일 행 함수 사용
- SELECT 문장에서 INTO 구문을 사용하여 결과를 변수에 할당할 때, 한 건의 결과만 반환되어야 한다.
- 즉, SELECT 문이 단일 행을 반환해야 한다.
2. DML (Data Manipulation Language) 사용:
- DML 문장인 INSERT, UPDATE, DELETE를 실행할 때, 영향을 받는 행의 수가 0 건 이상이어도 실행은 성공으로 간주된다.
- 이 때, SQL 커서의 속성인 SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT를 사용하여 실행 결과를 확인할 수 있다.
- SQL%FOUND: SQL 문장이 영향을 받는 행을 찾았을 때 TRUE 반환
- SQL%NOTFOUND: SQL 문장이 영향을 받는 행을 찾지 못했을 때 TRUE 반환
- SQL%ROWCOUNT: SQL 문장이 영향을 받는 행의 수를 반환
set serveroutput on
declare
v_a number;
v_b number :=0;
begin
v_a := v_a + 1;
v_b := v_b + 1;
if v_a = v_b then
dbms_output.put_line('1');
else
dbms_output.put_line('2');
end if;
end;
v_a는 NULL이고 v_b는 0이다. 그 후에 v_a와 v_b에 각각 1이 더해졌다.
NULL 값에 1을 더하면 NULL이 아니라 그대로 NULL이 유지된다. 따라서 v_a는 여전히 NULL이고, v_b는 1이다.
둘 다 1이 되기를 원한다면, 변수를 초기화해야 한다.
■ SQL%ROWCOUNT:
-- 입력 받은 사원번호의 급여를 2배 인상하고 변경 후 출력
--업데이트 완료시 new sal : 50000
accept emp_id prompt 'enter id : '
declare
v_id sal_emp.employee_id%type := &emp_id;
v_sal sal_emp.salary%type;
begin
update sal_emp
set salary = salary*2
where employee_id = v_id;
if SQL%ROWCOUNT = 1 then
select salary
into v_sal
from sal_emp
where employee_id = v_id;
dbms_output.put_line('NEW SAL:' || v_sal);
end if;
dbms_output.put_line(sql%rowcount || ' rows updated');
end;
이 코드는 사용자로부터 직원 ID를 입력 받은 후에 해당 직원의 연봉을 2배로 업데이트하고, 그 결과를 출력하는 PL/SQL 블록이다.
사용자가 입력한 값은 `&emp_id` 변수에 저장된다.
v_id 변수는 `sal_emp.employee_id`의 데이터 타입과 동일하게 선언되어 사용자로부터 입력 받은 직원 ID를 저장한다. v_sal 변수는 `sal_emp.salary`의 데이터 타입과 동일하게 선언되어 새로운 연봉을 저장한다.
update sal_emp set salary = salary*2 where employee_id = v_id; 입력 받은 직원 ID에 해당하는 직원의 연봉을 2배로 업데이트한다.
if SQL%ROWCOUNT = 1 then: 이전의 UPDATE 문이 한 행을 영향을 주었는지 확인하기 위한 조건문이다. 만약 한 행이 영향을 받았다면 업데이트된 직원의 연봉을 선택하여 `v_sal` 변수에 저장한다.
■EMPLOYEES 테이블에서 입력받은 사원번호의 사원의 정보에 따라 급여 평가
DECLARE
v_id employees.employee_id%TYPE := &b_id;
v_job employees.job_id%TYPE;
v_sal employees.salary%TYPE;
v_name employees.first_name%TYPE;
BEGIN
-- 예외 처리를 위한 BEGIN...EXCEPTION...END 구문
BEGIN
SELECT job_id, salary, first_name
INTO v_job, v_sal, v_name
FROM employees
WHERE employee_id = v_id;
-- 직원이 존재할 경우 실행될 코드
IF v_job = 'ST_CLERK' AND v_sal >= 3000 THEN
dbms_output.put_line(v_name ||': ''s sal is high');
ELSIF v_job = 'SA_REP' AND v_sal < 10000 THEN
dbms_output.put_line(v_name ||': ''s sal is low');
END IF;
EXCEPTION
-- 예외 처리: 직원이 존재하지 않을 경우 출력
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Employee with ID ' || v_id || ' not found.');
END;
END;