본문 바로가기
SQL

PROCEDURE

by Minius 2018. 3. 27.
반응형

/*

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

댓글