본문 바로가기
교육/Oracle

Oracle 개발자 수업 45일차 - 프로시저의 매개변수

by yhyuk 2021. 6. 1.
728x90
반응형

1. 프로시저의 매개변수


1. 프로시저의 매개변수

- 프로시저의 매개변수는 딱히 정의보다 예제로 어떤건지 파악하자.

[ 기본 사용 예제 ]

--매개변수 선언하기 예제
CREATE OR REPLACE PROCEDURE procTest(
    width NUMBER, -- 매개변수선언
    height NUMBER DEFAULT -- 매개변수에 기본값 저장 가능
) 
IS
    vresult NUMBER;
BEGIN
    vresult := width * height;
    DBMS_OUTPUT.PUT_LINE(vresult);
END procTest;

-- 출력하기 (선언한 매개변수에 값 입력)
BEGIN
    procTest(100, 200);
END;
--> 20000

 

[ 매개변수 모드 ]

- 매개 변수의 값을 전달하는 방식

  1) IN 모드(기본 모드) : 아무것도 지정 X

  2) OUT 모드

  3) IN OUT 모드(사용 안함)

- 예제)

CREATE OR REPLACE PROCEDURE procTest (
    vnum1 IN NUMBER,        -- vnum1 NUMBER랑 동일하다 ( 지정안해도 자동으로 IN 모드)
    vnum2 IN NUMBER,
    vresult1 OUT NUMBER,    -- OUT MODE(주소값 참조변수)
    vresult2 OUT NUMBER,    -- OUT MODE(주소값 참조변수)
    vresult3 OUT NUMBER     -- OUT MODE(주소값 참조변수)
)
IS
BEGIN
    result1 := vnum1 + vnum2;
    result2 := vnum1 * vnum2;
    result3 := vnum1 / vnum2;
END;

-- 출력하기( vresult에 매개변수 값을 넣기)
DECLARE
    vsnum1 NUMBER;
    vsnum2 NUMBER;
    vsnum3 NUMBER;
BEGIN
    procTest(10, 20, vsum1, vsum2, vsum3);
    DBMS_OUTPUT.PUT_LINE(vsum1);
    DBMS_OUTPUT.PUT_LINE(vsum2);
    DBMS_OUTPUT.PUT_LINE(vsum3);
END;
----> 30
----> 200
----> 0.5

 

[ 매개변수 활용 예제 ]

-- 요구사항 예제1
-- 부서 지정 -> 부서 내에서 급여를 가장 많이 받는 직원의 이름을 반환
CREATE OR REPLACE PROCEDURE procTest (
    pbuseo IN VARCHAR2,
    pname OUT VARCHAR2
}
IS
    vsalary NUMBER;
BEGIN
    SELECT MAX(basicpay) INTO vsalary FROM tblInsa WHERE buseo = pbuseo;
    SELECT NAME INTO pname FROM tblInsa WHERE basicpay = vsalary;
END procTest;

-- 출력하기
DECLARE
    vname VARCHAR2(30);
BEGIN 	
    procTest('개발자', vname);
    DBMS_OUTPUT.PUT_LINE(VNAME);
END;
    
    
    
-- 요구사항 예제2
-- 직원번호 -> 같은 지역의 직원 수, 같은 직위의 직원 수, 같은 부서의 직원 수 반환
CREATE OR REPLACE PROCEDURE proTest(
    pnum NUMBER,      	-- 직원 번호(IN) 
    pcn1 OUT NUMBER,    -- 같은 지역
    pcn2 OUT NUMBER,    -- 같은 직위
    pcn3 OUT NUMBER     -- 같은 부서
)
IS
BEGIN
    -- 같은 지역
    SELECT COUNT(*) INTO pcn1 FROM TBLINSA
        WHERE CIRY = (SELECT CITY FROM TBLINSA WHERE num,pnum);
    -- 같은 직위
    SELECT COUNT(*) INTO pcn2 FROM TBLINSA
        WHERE JIKWI = (SELECT JIKWI FROM TBLINSA, pnum)          
    -- 같은 부서    
    SELECT COUNT(*) INTO PCNT1 FROM TBLINSA
        WHERE BUSEO = (SELECT CITY FROM TBLINSA WHERE NUM = PNUM);
END procTest;


-- 출력하기
DECLARE
	vcnt1 NUMBER;
    vcnt2 NUMBER;
    VCNT3 NUMBER;
BEGIN
    procTest(1001, VCNT1, VCNT2, VCNT3;
    DBMS_OUTPUT.PUT_LINE('같은 지역: ' || vcnt1);
    DBMS_OUTPUT.PUT_LINE('같은 지역: ' || vcnt2);
    DBMS_OUTPUT.PUT_LINE('같은 지역: ' || vcnt3);
END;

MEMO >

# 프로시저 매개변수 선언시 DEFAULT 활용이 가능하다.

    --> 단, tset1 NUMBER test2 NUMBER 두 매개변수가 있을시 test1에는 DEFAULT 불가!!
    --> WHY? ANSI-SQL방식이 아니라 PL/SQL 방식이기 때문이다.
    --> DEFAULT는 맨 뒤 매개변수부터 채워나가야한다.

 

# 프로시저를 너무 어렵게 생각 NONO... 함수의 개념... 메소드의 개념......

728x90
반응형

댓글