데이터베이스

DATABASE STEP 32 - PROCEDURE

2023. 3. 28. 20:48
728x90

★ 프로시저(PROCEDURE)

  • 1. 익명 프로시저
    • 1회용 프로시저
  • 2. 실명 프로시저
    • 재사용
    • 오라클에 저장
    • 저장 프로시저(Stored Procedure)
      • 매개변수 구성 / 반환값 구성 > 자유
    • 저장 함수(Stored Function)
      • 매개변수 필수/반환값 필수 > 고정
  • 익명 프로시저 선언 방법
[declare
        변수 선언;
        커서 선언;]
    begin
        구현부;
    [exception
        처리부;]
end;
  • 저장 프로시저 선언 방법
create [or replace] procedure 프로시저명
    is(as)
    [변수 선언;
        커서 선언;]
    begin
        구현부;
    [exception
        처리부;]
end;

 

■ 프로시저 ex)

  • 1. 익명 프로시저
declare
    vnum number;
begin
    vnum := 100;
    dbms_output.put_line(vnum);
end;
  • 2. 저장 프로시저
create or replace procedure procTest
is
    vnum number;
begin
    vnum := 100;
    dbms_output.put_line(vnum);
end;
  • 저장 프로시저 호출하는 방법(메소드 실행하는 방법)
  • 현재 코딩하는 영역 > ANSI-SQL 영역
procTest; -- 올바르지 않은 방법

-- PL/SQL을 영역을 만든 뒤 > 그안에서 프로시저를 호출할 수 있다.
begin
    -- 이 안이 PL/SQL 영역
    procTest;
end;
  • 1. 매개변수가 있는 프로시저(1개)
create or replace procedure procTest(pnum number) --매개변수 
is
    vnum number; --일반변수(지역 변수)
begin

    vnum := pnum * 2;
    dbms_output.put_line(vnum);

end procTest;

begin
    procTest(100);
    procTest(200);
    procTest(300);
end;
  • 2. 매개변수가 있는 프로시저(2개)
create or replace procedure procTest(
    width number, 
    height number
)
is
    vnum number;
begin

    vnum := width * height;
    dbms_output.put_line(vnum);

end procTest;

begin
    procTest(10,20);
end;
  • 3. 프로시저 매개변수는 길이와 not null 표현이 불가능하다.
create or replace procedure procTest(
    pname varchar2
)
is --declare 대신하는 is(as)는 변수 선언이 없어도 반드시 기재
begin
    dbms_output.put_line('안녕하세요. ' || pname || '님');
end procTest;

begin
    procTest('홍길동');
end;
create or replace procedure procTest(
    width number, 
    height number default 10
)
is
    vnum number;
begin

    vnum := width * height;
    dbms_output.put_line(vnum);

end procTest;

begin
    -- 오버로딩..(x) > 매개변수 기본값(O)
    procTest(10,20);
    procTest(10);
end;

 

■ 매개변수 모드

  • 매개변수가 값을 전달하는 방식
  • call by value
  • call by reference
1. in 모드 > 기본 모드
2. out 모드 
3. in out 모드 > X
  • ex)
create or replace procedure procTest (
    pnum1 in number,    -- 우리가 알고있는 기존의 매개변수(호출할 때 넘기는 데이터)
    pnum2 in number,    --
    presult1 out number, -- 변수 자체가 전달, 변수의 주소값 전달 > 반환값 역할
    presult2 out number,
    presult3 out number
)
is
begin
    dbms_output.put_line(pnum1+pnum2);
    presult1 := pnum1 + pnum2;
    presult2 := pnum1 * pnum2;
    presult3 := pnum1 / pnum2;
end procTest;
  • ex2)
declare
    vresult number;
begin
    procTest(10,20,vresult);
    dbms_output.put_line(vresult);
end;

declare
    vresult1 number;
    vresult2 number;
    vresult3 number;
begin
    procTest(10,20,vresult1,vresult2,vresult3);
    dbms_output.put_line(vresult1);
    dbms_output.put_line(vresult2);
    dbms_output.put_line(vresult3);
end;

 

■ 요구사항에 따른 ex)

  • 1. 부서 지정 > 해당 부서 직원 중 급여 가장 많이 받는 사람의 번호 반환
    • in 1개 > out 1개
    • procTest1
select * from tblInsa;
create or replace procedure procTest1 (
    pbuseo in varchar2,    -- 우리가 알고있는 기존의 매개변수(호출할 때 넘기는 데이터)
    pnum out number    --
)
is
begin
    select num into pnum from tblInsa where basicpay = (select max(basicpay) from tblInsa where buseo = pbuseo);
    
end procTest1;
declare
    vnum number;
begin
    procTest1('기획부', vnum);
    dbms_output.put_line(vnum);
end;
  • 2. 직원 번호 지정 > 같이 지역에 사는 직원 수, 같은 직위의 직원 수, 해당 직원보다 급여를 더 많이 받은 직원 수를 반환
    • in 1개 > out 3개
    • procTest2
select * from tblInsa;
select count(*) from tblInsa where city = (select city from tblInsa where num = 1001);
select count(*) from tblInsa where jikwi = (select jikwi from tblInsa where num = 1001);
select count(*) from tblInsa where basicpay > (select basicpay from tblInsa where num = 1001);

create or replace procedure procTest2 (
    pnum in number,    -- 우리가 알고있는 기존의 매개변수(호출할 때 넘기는 데이터)
    pcnt1 out number,
    pcnt2 out number,
    pcnt3 out number
)
is
    vcity tblInsa.city%type;
    vjikwi tblInsa.jikwi%type;
    vbasicpay tblInsa.basicpay%type;
begin
    select city, jikwi, basicpay into vcity, vjikwi, vbasicpay from tblInsa where num = pnum;
    
    select count(*) into pcnt1 from tblInsa where city = vcity;
    select count(*) into pcnt2 from tblInsa where jikwi = vjikwi;
    select count(*) into pcnt3 from tblInsa where basicpay > vbasicpay;
    
end procTest2;
declare
    vcnt1 number; vcnt2 number; vcnt3 number;
begin
    procTest2(1001, vcnt1, vcnt2, vcnt3);
    dbms_output.put_line(vcnt1);
    dbms_output.put_line(vcnt2);
    dbms_output.put_line(vcnt3);
end;
728x90
저작자표시 비영리 변경금지 (새창열림)

'데이터베이스' 카테고리의 다른 글

DATABASE STEP 34 - TRIGGER  (0) 2023.03.29
DATABASE STEP 33 - STORED FUNCTION  (0) 2023.03.29
DATABASE STEP 31 - PL/SQL  (0) 2023.03.27
DATABASE SEMI PROJECT - MOVIE RANK DATA  (0) 2023.03.24
DATABASE STEP 30 - Modeling  (0) 2023.03.23
'데이터베이스' 카테고리의 다른 글
  • DATABASE STEP 34 - TRIGGER
  • DATABASE STEP 33 - STORED FUNCTION
  • DATABASE STEP 31 - PL/SQL
  • DATABASE SEMI PROJECT - MOVIE RANK DATA
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • JavaScript
  • css
  • 데이터베이스
  • DBA
  • java
  • jsp
  • DB
  • jquery
  • 백엔드
  • 백준
  • 개발자
  • IT개발자
  • 정보처리기사필기
  • React
  • 웹개발
  • it
  • 앱개발자
  • 코딩테스트
  • IT자격증
  • ajax
  • html
  • 프론트엔드
  • 정보보안전문가
  • 알고리즘
  • 개발블로그
  • 웹페이지
  • 정보처리기사
  • 자바
  • IT자격증공부
  • 웹개발자

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
DATABASE STEP 32 - PROCEDURE
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.