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 번호가 조건이 되어
해당하는 게시물 번호의 댓글 리스트만 출력하도록 한다.
'Oracle' 카테고리의 다른 글
[오라클] CURD 와 오라클 (0) | 2022.08.31 |
---|---|
[DB] 자바에서 오라클 DB 드라이버 연결하는 법 (MySQL) (0) | 2022.08.10 |
[DB/오라클] ( CREATE, ALTER, DROP ) DDL 데이터 정의어 총정리 (0) | 2022.07.24 |
[DB/오라클] 제약조건(CONSTRAINT) 총정리 - 기본키 설정 법(primary key) (0) | 2022.07.19 |
[DB/오라클] 부속 질의 서브쿼리 완벽 정리 (스칼라, 인라인뷰) #15 (0) | 2022.07.11 |