emp 테이블에서 사원 한 명을 선별(사원번호 7876)하여 그 월급(salary)의 금액에 따라 낮음, 중간, 높은 이라는 단어를 출력하는 익명 블럭을 제작
(1~1000 낮음, 1001~2500 중간, 2501~ 높음)
사원을 선별하는 방법은 DBMS_RANDOM.VALUES 함수를 이용
랜덤한 부서번호로 조회하되, 그 부서에 사원이 여럿이면 첫번째 사원으로 선택할 것
랜덤하게 부서번호를 발생
DBMS_RANDOM.VALUE(시작숫자, 끝숫자)
: 시작숫자부터 끝 숫자 사이의 임의 숫자를 발생
ROUND(숫자, 반올림 자리수)
: 숫자를 지정된 반올림자리에서 반올림 한다.
반올림자리수 1이면 소수 둘째 자리에서 반올림해서 첫째자리까지 남긴다. 반올림 자리수가 -1이면 1의 자리에서 반올림 한다.
rownum
: 오라클에서 제공하는 암묵적 필드명, select 명령의 결과를 대상으로 1부터 순차적으로 부여한 행번호
CASE문은 두 가지 유형이 있다.
LOOP
실행문;
EXIT [WHEN 조건];
END LOOP;
WHILE 조건
LOOP
실행문;
END LOOP;
FOR 변수명 IN [REVERSE] 시작값..끝값
LOOP
실행문
END LOOP;
시작값과 끝값 사이에 .. (온점2개) 빼먹지 말 것!!
시작값부터 끝 값까지 반복 실행, REVERSE 쓰여진 경우, 반대방향의 숫자 진행으로 반복실행 (REVERSE 1..9 이면 9부터 1까지..)
PL/SQL 코드 작성시에는 지금까지 사용하던 익명 블럭은 잘 사용하지 않는다.
일반적으로 이름이 있는 서브 프로그램(함수) 또는 프로시저를 사용하는 것이 대부분이다.
익명 블럭은 한번 사용하고 나면 없어져 버리는 휘발성 블럭이지만
함수 또는 프로시저는 컴파일을 거쳐 데이터베이스에 저장되어 재사용이 가능한 구조 이다.
상세내용
두 개의 정수를 전달해서 첫 번째 값을 두번째 값을 나눈 나머지를 구해서 리턴해주는 함수
위의 함수의 기능 중 전달된 도서번호로 검색된 도서가 없다면, '해당 도서 없음'이라는 문구가 리턴되도록 수정하기
조건에 맞는 레코드개수를 조회해서 그 숫자가 0이면 해당 도서는 없는 것으로 처리한다.
매개변수가 없는 함수
프로시져?
프로시져의 생성
CREATE OR REPLACE PROCEDURE : 프로시져를 생성하는 구문
매개변수명1 [ IN | OUT | IN OUT ]
: 매개변수를 만들되 전달되는 전달인수를 받는 IN변수와
리턴역할을 할 수 있는 OUT변수를 만들 때 사용한다.
입력변수와 출력변수의 역할이 동시에 부여되려면 IN OUT을 같이 기술한다.
프로시져는 기본적으로 리턴값이 없지만
(실제 RETURN명령을 사용하지 않음)
변수의 속성에 OUT속성 하나를 부여함으로써 리턴 역할을 흉내낼 수 있게는 사용이 가능하다.
변수 속성이 IN인경우 생략이 가능하다.
익명블럭에서, 사원번호를 전달하면, 사원의 이름과 부서명을 리턴받아 출력하는 프로시져(geEnameDname())을 작성하기
익명 블럭에서 호출은 geEnameDname(7788, ename, dname);
CURSOR 사용할 커서의 이름 [ (매개변수1, 매개변수2, ...) ]
IS
SELECT ...... SQL문장
매개변수의 역할
: SELECT 명령에서 사용할 값들을 저장
(주로 WHERE 절에서 사용할 값들)
SELECT .... SQL 문장
: 실행되어 CURSOR에 결과를 안겨줄 SQL 명령
OPEN 커서이름 (전달인수1, 전달인수2, ... ) ]
실제로 전달인수를 전달하여 커서안의 SQL문을 실행하고 결과를 커서에 저장한다.
LOOP
FETCH 커서이름 INTO 변수(들);
EXIT WHEN 커서이름%NOTFOUND;
-- SELECT에 의해 얻어진 레코드가 다 소진되어 없을 때까지 반복 계속
END LOOP;
FETCH 커서이름 INTO 변수(들);
커서에 담긴 데이터들 중 한 줄씩 꺼내서 변수(들)에 넣는 동작
EXIT WHEN 커서이름%NOTFOUND;
꺼냈는데 데이터가 없으면 종료
LOOP 안에서 필요에 맞는 처리를 데이터가 없을 때까지 반복