프로그래밍/DBMS
Procedure - 프로시저
Heidong
2021. 12. 3. 17:01
반응형
select * from user_procedures;
해당 계정의 모든 프로시저 목록 확인
-- 인서트 프로시저
CREATE OR REPLACE PROCEDURE insertScore
(
pHak In VARCHAR2,
pName In score.name%TYPE,
pBirth In score.birth%TYPE,
pKor In score.kor%TYPE,
pEng In score.eng%TYPE,
pMat In score.mat%TYPE
)
IS
BEGIN
INSERT INTO score(hak, name, birth, kor, eng, mat)
VALUES(pHak, pName, pBirth, pKor, pEng, pMat);
COMMIT;
END;
/
EXEC insertScore('7878', '호호호', '2000-10-10', 80, 90, 90);
insert 프로시저
CREATE만 써도 되지만 나중에 수정을 위해서 OR REPLACE 도 붙이는 편이 좋다.
(
이 부분에 들어가 있는 pHak 등등 애들은 변수(파라미터) 이다.
)
pHak = 변수명 / IN 뒤에 있는건 변수의 형태 VARCHAR2처럼 직접 형식을 지정할 수 도 있고,
score.name%TYPE 처럼 score 테이블의 name의 타입과 같이하라 처럼 어떤 컬럼의 형식을 그대로 따라가게 할 수 있다.
IS 부분은 파라미터 안에서만 쓰는 프로시저 내의 변수이다.
여기서는 프로시저 내의 변수는 사용하지 않으니 그냥 IS만 쓰고 건너 뛴다.
BEGIN 부분은 실제로 쿼리문을 작성하는 곳 COMMIT은 반드시 필요함
만든 프로시저는 EXEC 명령어를 사용해서 이용.
-- update 프로시저
CREATE OR REPLACE PROCEDURE updateScore
(
pHak In VARCHAR2,
pName In score.name%TYPE,
pBirth In score.birth%TYPE,
pKor In score.kor%TYPE,
pEng In score.eng%TYPE,
pMat In score.mat%TYPE
)
IS
BEGIN
UPDATE score SET name=pName, birth=pBirth, kor=pKor, eng=pEng, mat=pMat
WHERE hak=pHak;
COMMIT;
END;
/
EXEC updateScore('7878', '가가가', '2000-10-10', 80, 90, 90);
업데이트 프로시저
CREATE OR REPLACE PROCEDURE deleteScore
(
pHak In VARCHAR2
)
IS
BEGIN
DELETE FROM score WHERE hak=pHak;
COMMIT;
END;
/
EXEC deleteScore('7878');
삭제 프로시저
-- 데이터 개수
CREATE OR REPLACE PROCEDURE countScore
(
pResult OUT NUMBER
)
IS
BEGIN
SELECT COUNT(*) INTO pResult FROM score;
END;
/
데이터의 개수 구하는 프로시저
SELECT문의 결과를 pResult에 담는다.
자바로 결과 보낼때는 OUT
자바에서 결과 받을때는 IN
-- 리스트
CREATE OR REPLACE PROCEDURE listSCore
(
pResult OUT SYS_REFCURSOR,
pStart IN NUMBER,
pEnd IN NUMBER
)
IS
BEGIN
OPEN pResult FOR
SELECT * FROM (
SELECT ROWNUM rnum, tb.* FROM (
SELECT hak, name, TO_CHAR(birth, 'YYYY-MM-DD') birth, kor, eng, mat,
(kor+eng+mat) tot, (kor+eng+mat)/3 ave,
RANK() OVER(ORDER BY (kor+eng+mat) DESC) rank
FROM score
) tb WHERE ROWNUM <= pEnd
) WHERE rnum >= pStart;
END;
/
리스트 출력 프로시저
자바에서 start, end 파라미터 받아서 사용하는 모습
그리고 결과값은 내보내는 모습
-- 하나의 레코드 가져오기
CREATE OR REPLACE PROCEDURE readScore
(
pResult OUT SYS_REFCURSOR,
pHak IN VARCHAR2
)
IS
BEGIN
OPEN pResult FOR
SELECT hak, name, TO_CHAR(birth, 'YYYY-MM-DD') birth,
kor, eng, mat
FROM score
WHERE hak = pHak;
END;
/
하나의 레코드 가져오는 프로시저
반응형