당연히(?) 데이터베이스에도 함수가 존재한다.
특이하게 '프로시저'라는 개념도 존재하는데,
일단 살펴보도록 하자..
(공부하기 싫어서 대충 정리하고 쉬려는 속셈)
PL/SQL문을 사용하기 전
반드시
SET SERVEROUTPUT ON;
-- 해줘야한다.
-- 함수 출력하기
BEGIN
함수
END;
--보통 프로그래밍 언어를 배우면 가장 먼저하는 출력을 예로 들어보면
BEGIN
DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
END
/
이렇게 써주면 된다.
DBMS_OUTPUT.PUT_LINE = System.out.println (JAVA)
요런 것이다~~~~~
저 / 기호는
실행시 저기서 걸리라고 저렇게 입력해준다고 한다.
-- 변수 선언하기
DECLARE
V_NUM NUMBER(4) := 1234; -- int v_num = 1234
V_NAME VARCHAR2(10) := '홍길동'; -- String v_name = "홍길동";
BEGIN
DBMS_OUTPUT.PUT_LINE(V_NUM || ',' || V_NAME); -- System.out.println(v_num + v_name);
END;
/
-- 조건문
DECLARE
i NUMBER(4) := 123; -- int i = 3; // 넘버뒤 숫자 생략가능 디폴트 20자 정도임
BEGIN
IF i BETWEEN 1 AND 3 THEN
DBMS_OUTPUT.PUT_LINE('i는 1~3');
ELSIF i IN (4, 5, 6) THEN
DBMS_OUTPUT.PUT_LINE('i는 4, 5, 6');
ELSE
DBMS_OUTPUT.PUT_LINE('나머지');
END IF;
END;
/
-- 반복문 (3단구하기)
DECLARE
n NUMBER := 3;
BEGIN
FOR i IN 1..9 LOOP -- for(int i=1; i <= 9; i++)
DBMS_OUTPUT.PUT_LINE(n || '*' || i || '= ' || n * i);
END LOOP;
END;
/
-- 내장함수 실행해보기
-- 내장함수 CURRENT_DATE, AVG, SUM, UPP
SELECT CURRENT_DATE FROM DUAL;
SELECT SEQ_ORDERTBL_ORD_NO.CURRVAL FROM DUAL;
SELECT ROUND(1.2345, 2) FROM DUAL;
-- 숫자가 입력되면 입력된 숫자까지의 합을 구해주는 함수
-- publice int MY_SUM(int num1) {
CREATE OR REPLACE FUNCTION MY_SUM(num1 NUMBER) RETURN NUMBER
IS -- DECLARE
num2 NUMBER := 0; -- 결과를 리턴할 변수
BEGIN
FOR i IN 1..num1 LOOP -- for(int i=1; i <= 9; i++) {
num2 := num2 + i; -- num2 += i;
END LOOP; -- }
RETURN num2; -- return num2;
END;
/
-- 함수 실행하기
SELECT MY_SUM(10) FROM DUAL;
SELECT STU_NO, MY_SUM(STU_SCORE_KOR) FROM STUDENTTBL;
----------------------------------
-- 인덱스 : 테이블에 있는 데이터를 빨리 찾기 위한 용도, 일종의 색인기술
-- CREATE INDEX 인덱스명 ON 테이블명(컬럼명);
-- 인덱스 확인하기
SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = 'STUDENTTBL';
----------------------------------
-- 프로시저 : 리턴값이 없음
-- 테이블에 바로 접근하지 않고 프로시저가 일을 대신해주게끔
-- CLASSTBL에 CLS_CODE가 없으면 추가시키고, 있으면 수정
-- INSERT
-- UPDATE
SELECT * FROM CLASSTBL;
-- PROC_EX01 ('B', '509호', '교사11'); -> 추가가 되어야함
CREATE OR REPLACE PROCEDURE PROC_EX01 (
V_CODE IN CLASSTBL.CLS_CODE%TYPE, -- CHAR(1)
V_ROOM IN CLASSTBL.CLS_ROOM%TYPE, -- VARCHAR2(10)
V_TEAC IN CLASSTBL.CLS_TEACHER%TYPE -- VARCHAR2(10)
)
IS
CHK NUMBER := 0;
BEGIN
SELECT COUNT(*) INTO CHK FROM CLASSTBL WHERE CLS_CODE=V_CODE;
IF CHK > 0 THEN -- if (chk > 0) {
UPDATE CLASSTBL SET CLS_ROOM = V_ROOM, CLS_TEACHER = V_TEAC WHERE CLS_CODE = V_CODE;
ELSE
INSERT INTO CLASSTBL(CLS_CODE, CLS_ROOM, CLS_TEACHER, CLS_DATE)
VALUES (V_CODE, V_ROOM, V_TEAC, CURRENT_DATE);
END IF;
COMMIT;
END;
/
-- 프로시저 실행하기
EXEC PROC_EX01 ('B', '509호', '교사11');
EXEC PROC_EX01 ('C', '510호', '교사10');
EXEC PROC_EX01 ('H', '513호', '교사09');
SELECT * FROM CLASSTBL;