PL/SQL
Procedural Language/Structured Query Language의 줄임말로 데이터베이스 응용 프로그램을 작성하는 데 사용하는 오라클의 SQL 전용 언어.
SQL 전용 언어로 SQL 문에 변수, 제어, 입출력 등의 프로그래밍 기능을 추가하여 SQL 만으로 처리하기 어려운 문제를
해결함.
PL/SQL은 SQL Developer에서 바로 작성하고 컴파일한 후 결과를 실행함.
(기본 문법: https://docs.oracle.com/cd/E11882_01/index.htm)
Procedure
자주 사용하는 SQL을 프로시저로 만든 뒤 필요 할때마다 호출,사용하여 작업 효율을 늘린다.
함수는 특정 연산을 수행한 뒤 결과 값을 반환하지만
프로시저는 특정한 로직을 처리하기만 하고 결과 값은 반환하지 않는 서브 프로그램이다.
-- procedure
-- Book테이블에 한 개의 투플을 삽입하는 프로시저
create or replace procedure InsertBook(
-- 매개변수 선언
myBookId in number,
myBookName in varchar2,
myPublisher in varchar2,
myPrice in number
)
as
begin -- 코드 실행 시작
-- 핵심처리 코드
-- 매개변수로 받은 데이터를 이용해서 데이터 삽입.
insert into book (bookid, bookname, publisher, price)
values (myBookId, myBookName, myPublisher, myPrice);
end -- 코드 실행 종료
;
예제
1
더보기
-- procedure
create or replace procedure BookInsertOrUpdate(
-- 매개변수
myBookId number,
myBookName varchar2,
myPublisher varchar2,
myPrice number
)
as
-- 변수 선언
mycount number;
begin
-- 입력받은 책이름으로 같은 이름의 책을 보유하는지 여부 확인 숫자
select count(*) into mycount from book where bookname like myBookName;
-- 책의 개수로 분기 : 수정 또는 입력
if mycount != 0 then
-- 가격 수정
update book set price = myPrice where bookname like mybookName;
else
-- 데이터(행) 입력
insert into book values (myBookId, myBookName, myPublisher, myPrice);
end if;
end
;
2
더보기
-- procedure
-- Book 테이블에 저장된 도서의 평균가격을 반환하는 프로시저
create or replace procedure avgPrice(
avgVal out number
)
as
begin
select avg(price) into avgVal from book where price is not null;
end
;
3
더보기
-- procedure
-- Orders 테이블의 판매 도서에 대한 이익을 계산하는 프로시저(Interest)
create or replace procedure interest
as
-- 변수 선언
myInterest NUMERIC;
price NUMERIC;
-- 1. 커서 생성
cursor interestCursor is select saleprice from orders;
begin
myInterest := 0.0;
-- 2. 커서 오픈
open interestCursor;
-- 반복하면서 각 행의 값을 처리
loop
--3. 커서 패치
fetch interestCursor into price;
-- 반복문의 탈출
exit when interestCursor%notfound;
-- price 값을 비교
if price >= 30000 then
myInterest := myInterest + price*0.1;
else
myInterest := myInterest + price*0.05;
end if;
end loop;
-- 4. 커서 종료
close interestCUrsor;
-- 수익금 총액을 출력
dbms_output.put_line('전체 이익금 : ' || myInterest);
end
;
4
더보기
-- procedure
-- 테이터를 받아서 데이터 변경처리를 프로그램 요소를 이용해서 실행
-- create or replace {프로시저 이름} (매개변수)
-- as -- 선언부
-- begin -- 프로그램 코드 시작
-- ......
-- end
-- ;
-- 프로시저 호출 : 실행 요청
-- exec 프로시저이름(매개변수 값,....);
exec insertbook(13, '스포츠과학', '마당과학서적', 25000);
select * from book;
-- 같은 이름의 책을 등록해보고, 다른 이름의 책을 입력
-- 같은 이름의 책 등록
exec bookinsertorupdate(15, '스포츠과학', '마당과학서적', 10000);
exec bookinsertorupdate(15, '스포츠 즐거움', '마당과학서적', 40000);
select * from book;
----------------------------------------------------
set serveroutput on;
declare
avgVal number;
begin
-- 프로시저 호출
avgPrice(avgVal);
dbms_output.put_line('책값 평균 : '|| avgVal);
end;
----------------------------------------------------
set serveroutput on;
exec interest;
Trigger
데이터의 변경(INSERT, DELETE, UPDATE)문이 실행될 때 자동으로 따라서 실행되는 프로시저를 말함.
예제
-- 임시 테이블 생성
create table book_log (
bookid_l number,
bookname_l varchar2(40),
publisher_l varchar2(40),
price_l number
);
-- 트리거
create or replace trigger afterInsertBook
after insert on book for each row
declare
-- 변수 선언
average number;
begin
insert into book_log
values (:new.bookid, :new.bookname, :new.publisher, :new.price);
dbms_output.put_line('book_log 테이블에 백업!');
end
;
-----------------------------------------------------
-- 트리거 실행 테스트
insert into book values (20, '스포츠 과학2', '이상미디어', 60000);
select * from book;
select * from book_log;
사용자 정의 함수
사용자 정의 함수는 수학의 함수와 마찬가지로 입력된 값을 가공하여 결과 값을 되돌려줌
예시
판매된 도서에 대한 이익을 계산하는 함수(fnc_Interest)
CREATE OR REPLACE FUNCTION fnc_Interest(
price NUMBER) RETURN INT
IS
myInterest NUMBER;
BEGIN
-- 가격이 30,000원 이상이면 10%, 30,000원 미만이면 5%
IF Price >= 30000 THEN myInterest := Price * 0.1;
ELSE myInterest := Price * 0.05;
END IF;
RETURN myInterest;
END;
-- Orders 테이블에서 각 주문에 대한 이익을 출력
SELECT custid, orderid, saleprice, fnc_Interest(saleprice) interest
FROM Orders;
프로시저, 트리거, 사용자 정의 함수의 공통점과 차이점
'STUDY > web' 카테고리의 다른 글
[Oracle] 뷰 정리 (0) | 2021.11.08 |
---|---|
[Oracle] Sequence, Index 정리 (0) | 2021.11.08 |
자바 과제와 이클립스에서 Git 사용하기 (0) | 2021.10.06 |
자바 커리큘럼에서 스레드, 네트워크 제외 (1) | 2021.09.24 |
자바 call by value vs call by reference 과제 (0) | 2021.09.14 |