익명 블록과 달리 함수와 프로시저는 데이터베이스 내에 저장되고 컴파일되므로 언제든지 재사용이 가능하다.
IF 조건 then
조건 처리;
end if;
if 조건 then
조건 처리1;
else
조건 처리2;
end if;
if 조건1 then
조건 처리1;
elsif 조건2 then
조건 처리2;
else
조건 처리n;
end if;
DECLARE
vn_salary NUMBER := 0;
vn_department_id NUMBER := 0;
BEGIN
vn_department_id := ROUND(DBMS_RANDOM.VALUE (10, 120), -1);
SELECT salary
INTO vn_salary
FROM employees
WHERE department_id = vn_department_id
AND ROWNUM = 1;
DBMS_OUTPUT.PUT_LINE(vn_salary);
IF vn_salary BETWEEN 1 AND 3000 THEN
DBMS_OUTPUT.PUT_LINE('낮음');
ELSIF vn_salary BETWEEN 3001 AND 6000 THEN
DBMS_OUTPUT.PUT_LINE('중간');
ELSIF vn_salary BETWEEN 6001 AND 10000 THEN
DBMS_OUTPUT.PUT_LINE('높음');
ELSE
DBMS_OUTPUT.PUT_LINE('최상위');
END IF;
END;
결과
13000
최상위
당연히 반복문이다
LOOP
처리문;
exit [when 조건];
end loop;
while 조건
loop
처리문;
end loop;
for 인덱스 in 초깃값..최종값
loop
처리문;
end loop;
create or replace function new_mod(num1 number, num2 number)
return number
is
vn_rem number := 0;
vn_quo number := 0;
begin
vn_quo := floor(num1/num2);
vn_rem := num1 -(num2*vn_quo);
return vn_rem;
end;
declare
vn_res number := new_mod(10, 3);
begin
dbms_output.put_line('10 % 3 = ' || vn_res);
end;
실제 함수를 호출하는 방식은 방금 위의 예제를 통해 확인하였다
sql 함수와 같이 pl/sql함수는 select문에서 사용할 수 있다
create or replace function new_mod(num1 number, num2 number)
return number
is
vn_rem number := 0;
vn_quo number := 0;
begin
vn_quo := floor(num1/num2);
vn_rem := num1 -(num2*vn_quo);
return vn_rem;
end;
select new_mod(20, 3) as result
from dual;
위 그림을 통하여 해당 값이 제대로 테이블 형태로 나오는 것을 알 수 있음.
매개변수와 함수
매개 타입이 없는 함수는 '()'를 붙여도 때도 실행 가능하다
create or replace function get_user
return varchar2
is
vn_user_name varchar2(80);
begin
select user
into vn_user_name
from dual;
return vn_user_name;
end;
select get_user(), get_user
from dual;