당연히(?) 데이터베이스에도 함수가 존재한다.

특이하게 '프로시저'라는 개념도 존재하는데,

일단 살펴보도록 하자..

(공부하기 싫어서 대충 정리하고 쉬려는 속셈)

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;