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(34) NOT 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,1) FROM 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 |
반응형