BEGIN 실행부

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;

 

반응형