/*
PL/ SQL : 오라클에서 제공하는 프로그래밍 언어
일반 프로그래밍 언어적인 요소를 다 가지고 있고
데이터베이스 업무를 처리하기 위해 최적화된 언어
**기본구조**
1. 선언부(Declare) : 모든 변수나 상수를 선언하는 부분
2. 실행부(Excutable) : begin/end 제어문, 반복문, 함수정의 등의 로직을 기술하는 부분
3. 예외처리부(exception) : 실행도중에 에러 발생시 해결하기 위한 명령들을 기술하는 부분
declare, begin, exception 키워드들은 ; 을 붙이지 않는다.
4. 익명블록 : 주소 일회성으로 사용할 경우 사용
5. 저장블록 : 서버에 저장해놓고 주기적으로 사용할 경우 사용
**변수의 생성 규칙
1. 반드시 문자로 생성해야 한다.
2. 문자나 숫자, 특수문자를 포함할 수 있다.
3. 변수명은 30bytes 이하여야 한다.
4. 예약어, 키워드를 변수명으로 사용하면 안된다.
- 변수의 선언은 선언부(declare)에서 선언되고, 값으로 초기화 가능.
- 실행부에서 실행될 경우 값이 할당된다.
- 서브프로그램의 파라미터로 전달되기도 하며, 서브프로그램의 출력결과를 저장하기도 한다.
*/
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;
EXEC INSERTBOOK(13,'스포츠과학','마당과학서적',25000);
SELECT * FROM BOOK;
create or replace procedure BOOKINSERTORUPDATE(
mybookid in number,
mybookname in varchar2,
mypublisher in varchar2,
myprice in 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(BOOKID,BOOKNAME,PUBLISHER,PRICE)
VALUES(MYBOOKID,MYBOOKNAME,MYPUBLISHER,MYPRICE);
END IF;
end;
EXEC BOOKINSERTORUPDATE(15,'스포츠 즐거움','마당과학서적',25000);
SELECT * FROM BOOK;
EXEC BOOKINSERTORUPDATE(15,'스포츠 즐거움','마당과학서적',20000);
SELECT * FROM BOOK;
CREATE OR REPLACE PROCEDURE AVERAGEPRICE(
AVERAGEVAL OUT NUMBER)
AS
BEGIN
SELECT AVG(PRICE) INTO AVERAGEVAL FROM BOOK WHERE PRICE IS NOT NULL;
END;
set serveroutput on;
declare
averageval number;
begin
averageprice(averageval);
dbms_output.put_line('책 값 평균: '||averageval);
end;
create or replace procedure interest
as
myInterest numeric;
price numeric;
cursor InterestCursor is select saleprice from orders;
begin
myInterest :=0.0;
open interestCursor;
loop
fetch interestCursor into price;
exit when interestcursor%notfound;
if price>=30000 then
myInterest := myInterest + price *0.1;
else
myInterest := myInterest + price*0.05;
end if;
end loop;
close interestCursor;
dbms_output.put_line('전체 이익 금액 =' ||myInterest);
end;
set serveroutput on;
exec interest;
실행 시킬 때, set serveroutput on;을 해야 한다.
if 문법 주의
프로시저를 실행할 때에는 항상 드래그를 해서 지정해줘야한다.
일반 sql처럼 사용하면 처음부터 모두 실행해버린다.(스크립트 실행)
아직 왜 쓰는지 잘 모르겠다....
'SQL' 카테고리의 다른 글
SEQUENCE / SYNONYM (0) | 2018.03.29 |
---|---|
Role 역할 (0) | 2018.03.28 |
EXISTS / NOT EXISTS (0) | 2018.03.15 |
ALL / SOME / ANY (0) | 2018.03.15 |
IN / NOT IN (0) | 2018.03.15 |
댓글