영보의 SystemOut.log

[Oracle] PL/SQL- Procedure(프로시저)와 예제 본문

Database/Oracle

[Oracle] PL/SQL- Procedure(프로시저)와 예제

영보로그 2020. 11. 11. 17:10
반응형

 개념

 

# PROCEDURE 프로시저
 - 특정 작업을 수행 하는, 이름이 있는 PL/SQL BLOCK

 - 매개 변수를 받을 수 있고, 반복적으로 사용 할 수 있는 BLOCK 

 - 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL BLOCK을 데이터베이스에 저장하기 위해 생성함

 - 장점 : 빠름, 파라미터 사용 가능,  여러 어플리케이션과 공유 가능

 

 

 

# PROCEDURE 프로시저의 기본 문법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE [OR REPLACE] procedure name
   IN argument 
   OUT argument 
   IN OUT argument 
 
IS 
 
   [변수의 선언]
 
BEGIN  --> 필수 
 
   [PL/SQL Block] 
   -- SQL문장, PL/SQL제어 문장 
 
   [EXCEPTION]  --> 선택
  -- error가 발생할 때 수행하는 문장
 
END;  --> 필수 
cs

 

 

 

# # PROCEDURE 프로시저의 문법 & 예제


문법

예제
   * 생성=> ALTER가 없다 (수정ㄴㄴ) 
    CREATE [OR REPLACE] PROCEDURE pro_name( 
        매개변수, 
        매개변수... 
          1) 스칼라 변수, 2) %TYPE 
    ) 
    IS (AS)  
        지역변수 설정 
    BEGIN 
      제어 제어문, 연산자, SQL 
    END; 
    / 

    * 삭제 
     DROP PROCEDURE pro_name; 

    * 호출 
     SELECT → EXECUTE 
     INSERT, UPDATE, DELETE CALL 
      
    * 매개변수 
      IN : 내부에서만 사용하는 변수 
      OUT : Call By Reference 결과 값을 받는 변수 
      INOUT : 내부사용, 값을 받는 변수 


      CREATE PROCEDURE empInsert( 
        name IN VARCHAR2(20), 
        addr IN VARCHAR2(100), 
        tel IN VARCHAR2(20), 
        result OUT VARCHAR2(100)
         →  메모리 주소 (주소에 값을 채운다) 

    ) 
     
    int* p; 
    void disp(int* p,int k) 
    { 
        *p=100; 
    } 
     
    disp(p, 10); ==> p=100 


    
    

    

 

 

 

 예제

 

1. 먼저 테이블을 생성

1
2
3
4
5
6
--PL/SQL과 더불어 공백 주면 오류난다 => 공백 조심)
    CREATE TABLE pl_student (
     hakbun NUMBER PRIMARY KEY,
     name VARCHAR2(34NOT NULL
     kor NUMBER, eng NUMBER, math NUMBER
    );
cs

 - PL/SQL과 더불어 공백 주면 오류난다 => 공백 조심

 

 

 

2. 테이블에 데이터 추가

1
2
3
 INSERT INTO pl_student VALUES(1,'홍길동',90,90,100);
INSERT INTO pl_student VALUES(2,'박문수',85,80,75);
    COMMIT;
cs

 

 

 

3. 데이터 조회해보기

1
SELECT * FROM pl_student;
cs

 - 데이터가 정상적으로 출력되는걸 확인할 수 있다

 

 

 

4. 테이블에 데이터 추가 쿼리문을 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 --추가
    CREATE OR REPLACE PROCEDURE studentInsert(
        pName pl_student.name%TYPE,
        pKor pl_student.kor%TYPE,
        pEng pl_student.eng%TYPE,
        pMath pl_student.math%TYPE
    )
    IS
    BEGIN
        INSERT INTO pl_student VALUES(
            (SELECT NVL(MAX(hakbun)+1,1FROM pl_student),
           pName,pKor,pEng,pMath 
        );
        COMMIT;
    END;
    /
cs

 

 

 

5. 컬럼에 데이터 추가

1
CALL studentInsert('심청이',80,90,76);
cs

- 위와 같이, 값 넣을 때 insert into 사용하지 않고 call 해주면 훨씬 간단하다. 

 

 

 

6. studentDetailData

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create or REPLACE PROCEDURE studentDetailData(
    pNo NUMBER,
    pName out VARCHAR2,
    pKor out number,
    pEng out number,
    pMath out number
    )
    is
    begin
    select name,kor,eng,math into pName,pKor,pEng,pMath
    from pl_student
    where hakbun=pNo;
    end;
    /
cs

 

 

 

7. 데이터 출력

1
2
3
4
5
6
7
8
9
10
VARIABLE pName VARCHAR2;
    VARIABLE pKor NUMBER;
    VARIABLE pEng NUMBER;
    VARIABLE pMath NUMBER;
    EXECUTE studentDetailData(1,:pName,:pKor,:pEng,:pMath);
    PRINT pName;
    PRINT pKor;
    PRINT pEng;
    PRINT pMath;
    --스칼라변수
cs

 

 

반응형