Oracle

[DB/오라클] 프로시저 사용법 (스프링 기반의 댓글 CURD 프로시져로 구현하기 실습)

원코딩 2022. 9. 30. 16:41

 

 

1차 프로젝트에서 구현했던 댓글 기능을 -> 

2차 프로젝트에선 프로시저를 이용해 만들어 보려고 한다. 

 

인터넷 찾아보면서 하는데, 정보도 많이 없고 설명도 어려워서

나중을 대비하여 기록해두어야겠다. 

 

 

 

댓글 테이블 생성 JEJU_BREPLY_1_2

 

no : 댓글 번호

cno : 게시물 번호

id : 유저 아이디

name : 유저 이름

msg : 댓글 내용

regdate : 댓글 생성날짜 

 

 CREATE TABLE "HR"."JEJU_BREPLY_1_2" (
 	"NO" NUMBER, 
	"CNO" NUMBER, 
	"ID" VARCHAR2(20 BYTE), 
	"NAME" VARCHAR2(34 BYTE) CONSTRAINT "JBR_NAME_NN" NOT NULL ENABLE, 
	"MSG" CLOB CONSTRAINT "JBR_MSG_NN" NOT NULL ENABLE, 
	"REGDATE" DATE DEFAULT SYSDATE, 
	 CONSTRAINT "JBR_NO_PK" PRIMARY KEY ("NO")
     );

 

 

 

 

 

 INSERT (댓글 생성) 프로시저

 

create or replace NONEDITIONABLE PROCEDURE JEJU_breplyInsert(
    pCno JEJU_BREPLY_1_2.CNO%TYPE,
    pId JEJU_BREPLY_1_2.ID%TYPE,
    pName JEJU_BREPLY_1_2.NAME%TYPE,
    pMsg JEJU_BREPLY_1_2.MSG%TYPE
)
IS
BEGIN
    INSERT INTO JEJU_BREPLY_1_2 VALUES(
    (SELECT NVL(MAX(no)+1,1) FROM JEJU_BREPLY_1_2),
    pCno,pId,pName,pMsg,SYSDATE
    );
    COMMIT;
END;
/

* pCno  IN JEJU_BREPLY_1_2.CNO%TYPE in은 생략 

* pId  IN JEJU_BREPLY_1_2.ID%TYPE in은 생략 

...

 

1.

가장 첫번째 () 괄호 부분은 변수를 지정하는 공간이다. 

새로운 댓글을 받아오기 위해 변수를 생성해주는데,

변수의 타입을 생성해두었던 JEJU_BREPLY_1_2 테이블 컬름의 속성과 똑같이 생성하겠다는 의미로 

[ 변수 jeju_breply_1_2.no%TYPE ] 이러한 형식으로 입력한다. 

(변수를  jeju_breply_1_2테이블의 no 컬럼과 같은 타입으로 생성하겠다)

 

 

2. BEGIN 이하 ~ 

이곳은 프로시저 호출 시 실행될 문장이 들어간다. 

새로운 댓글이 생성되는 것이니 INSERT문을 이용한다. 

앞서 변수에 저장된 데이터 값을 JEJU_BREPLY_1_2 테이블에 각각 insert 시킨다. 

끝에는 커밋을 날려주어 저장한다. 

 

 

 

 UPDATE (댓글 수정) 프로시저

 

CREATE OR REPLACE PROCEDURE JEJU_breplyUpdate(
    pNo JEJU_BREPLY_1_2.NO%TYPE,
    pMsg JEJU_BREPLY_1_2.msg%TYPE
)
IS
BEGIN
    UPDATE JEJU_BREPLY_1_2 SET
    msg=pMsg
    WHERE no=pNo;
    commit;
END;
/

 

1. 

사용자가 선택한 댓글을 수정할거니까 댓글 번호인  pNo를 변수로 생성하고, 

실제로 변경될 부분인 pMsg 도 변수로 생성한다. 

 

2. BEGIN 이하 ~ 

사용자가 선택한 no 번호가 조건이 되어 

댓글 내용 msg 를 업데이트 한다. 

 

 

 

 DELETE (댓글 삭제) 프로시저

 

CREATE OR REPLACE PROCEDURE JEJU_breplyDelete(
    pNo JEJU_BREPLY_1_2.NO%TYPE
)
IS
BEGIN
    DELETE FROM JEJU_BREPLY_1_2
    WHERE no=pNo;
    commit;
END;
/

 

1.

사용자가 선택한 댓글을 삭제할거니까 댓글 번호인 pNo를 변수로 생성한다.

 

2. BEGIN 이하 ~

사용자가 선택한 no 번호가 조건이 되어 

댓글을 삭제한다.

 

 

 

 SELECT (댓글 읽기) 프로시저 

 

CREATE OR REPLACE PROCEDURE JEJU_breplyListData(
    pCno JEJU_BREPLY_1_2.CNO%TYPE,
    pResult OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN pResult FOR 
        SELECT no,cno,id,name,msg,TO_CHAR(regdate,'YYYY-MM-DD HH24:MI:SS')
        FROM JEJU_BREPLY_1_2
        WHERE cno=pCno;
END;
/

 

1. 

cno 값으로 데이터를 찾기 위해 pCno라는 변수를 생성한다. 

pResult OUT SYS_REFCURSOR

CURSOR로 값을 가져온다. (= resultSet) 결과값을 담아옴

이때 데이터를 가져오기 위해 꼭 OUT을 붙여줘야 한다. 

IN 변수 (생략가능) 쿼리 실행을 위한 변수 
OUT 변수 실행에 대한 결과값을 받아오기 위한 변수 

 

즉,

pCno JEJU_BREPLY_1_2.CNO%TYPE,
pResult OUT SYS_REFCURSOR

해당 두 줄 중 pCon 변수는 IN변수이고  (생략가능)

pResult 변수는 OUT 변수이다. 

 

 

2. BEGIN 이하 ~ 

사용자가 선택한 cno 번호가 조건이 되어 

해당하는 게시물 번호의 댓글 리스트만 출력하도록 한다.