[Oracle] 오라클 - PL/SQL 프로시저 (삽입/수정/삭제)
by mini_min[Oracle]
오라클 - PL/SQL 프로시저 (삽입/수정/삭제)
✔️ 프로시저란?
⭐ 일단 리턴 값이 없는 분이다. (void 메소드 같은 것) ⭐
: 자주 실행해야 하는 업무 흐름(SQL)을 미리 작성하여 데이터베이스 내에 저장해 두었다가 필요할 때마다 호출하여 실행
-- 테이블 삭제한다고 연관 프로시저가 삭제되는건 아니다.
-- 특정 로직을 처리하고 결과를 반환하지 않는다.
-- 모두 DB에 저장된 객체이므로 스토어드 프로시저라고 부른다.
-- 필요할 때 가져다가 실행하는 것
-- 자동 롤백이 가능하다. (두번째 INSERT 실패시 첫번째 INSERT 도 자동 롤백)
-- 프로시저에서 INSERT , UPDATE , DELETE 는 자동 커밋이 되지 않기 때문에 꼭! COMMIT 구문 추가해야한다.
📓 IN : 프로시저 값을 넘겨 받는 것 (읽기 전용/값 변경 불가)
📓 OUT : 프로시저 값을 넘기는 것 (디폴트 값 지정 불가)
-- USER_DEPENDENCIES : 객체 간 서로 참조하는 정보를 가진 데이터 사전이다.
-- USER_PROCEDURES : 프로시저 목록을 출력
-- 프로시저 만들기
CREATE OR REPLACE PROCEDURE pInsertTest
IS
-- 변수 상수 등 선언
BEGIN
INSERT INTO test(num,name,score,grade) VALUES (test_seq.NEXTVAL, 'a', 80, 'B');
COMMIT;
END;
/
💡 CREATE OR REPLACE PROCEDURE 프로시저명
IS
BEGIN
END;
/
⭐ 필수
-- 의존관계 확인
SELECT * FROM user_dependencies;
-- 소스확인
SELECT * FROM user_source;
-- 프로시저 목록 확인/실행
SELECT * FROM user_procedures;
EXEC pInsertTest;
💡 EXEC 가 아닌 CALL 사용 가능!
🔒 문제
-- 학점 만들기 프로시저
CREATE OR REPLACE PROCEDURE pInsertTest
(
pName IN VARCHAR2, -- 파라미터는 크기를 명시하지 않는다.
pScore NUMBER -- IN 은 생략 가능
)
IS
vGrade VARCHAR2(10); --⭐ 학점은 점수 넣으면 찍혀야함
BEGIN
IF pScore >= 90 THEN vGrade := 'A';
ELSIF pScore >= 80 THEN vGrade := 'B';
ELSIF pScore >= 70 THEN vGrade := 'C';
ELSIF pScore >= 60 THEN vGrade := 'D';
ELSE vGrade := 'F';
END IF;
INSERT INTO test(num,name,score,grade) VALUES (test_seq.NEXTVAL, pName, pScore, vGrade);
COMMIT;
END;
/
EXEC pInsertTest('b', 95);
💡 ❌ 프로시저 파라미터는 크기를 명시하지 않는다.
IN 은 생략 가능하다.
vGrade 변수 지정 (pName , pScore 는 읽기 전용)
-- 프로시저 : 수정 / 예외처리
CREATE OR REPLACE PROCEDURE pUpdateTest
(
pNum NUMBER,
pName VARCHAR2,
pScore NUMBER
)
IS
vGrade VARCHAR2(10); --⭐ 학점은 점수 넣으면 찍혀야함
BEGIN
IF pScore < 0 OR pScore > 100 THEN
RAISE_APPLICATION_ERROR(-20001, '점수는 0~100 사이만 가능합니다');
END IF;
IF pScore >= 90 THEN vGrade := 'A';
ELSIF pScore >= 80 THEN vGrade := 'B';
ELSIF pScore >= 70 THEN vGrade := 'C';
ELSIF pScore >= 60 THEN vGrade := 'D';
ELSE vGrade := 'F';
END IF;
UPDATE test SET name=pName, score=pScore, grade = vGrade WHERE num=pNum;
COMMIT;
END;
/
EXEC pUpdateTest(1, '홍길동', 100);
SELECT * FROM test;
💡 예외처리
RAISE_APPLICATION_ERROR(-20001, '점수는 0~100 사이만 가능합니다');
= 예외는 -20000~-20999 까지만 지정 가능!
UPDATE 절에 WHERE 조건을 주지 않으면 모든 데이터가 수정되니까 주의하기 ㅠㅠ
-- 프로시저 : 삭제
CREATE OR REPLACE PROCEDURE pDeleteTest
(
pNum NUMBER
)
IS
BEGIN
DELETE FROM test WHERE pNum= num;
COMMIT;
END;
/
EXEC pDeleteTest(2);
SELECT * FROM test;
💡 DELETE 프로시저도 마찬가지로 WHERE 조건 필요
INSERT, DELETE, UPDATE 모두 COMMIT 해줘야 에러가 발생안한다.
'SQL쿼리' 카테고리의 다른 글
[Oracle] 오라클 - 함수 (FUNCTION) (0) | 2022.08.17 |
---|---|
[Oracle] 오라클 - PL/SQL 프로시저 (SELECT / IN OUT 파라미터) (0) | 2022.08.17 |
[Oracle] 오라클 - PL/SQL 제어구조 (IF / CASE / LOOP / WHILE / FOR / CONTINUE) (0) | 2022.08.16 |
[Oracle] 오라클 - PL/SQL 기본 문법 (SELECT) (0) | 2022.08.16 |
[Oracle] 오라클 - 피벗 (PIVOT과 UNPIVOT) (0) | 2022.08.15 |
블로그의 정보
개발자 미니민의 개발로그
mini_min