특정 처리 작업을 수행하는 데 사용하는 저장 섭 프로그램
용도에 따라 파라미터를 사용할 수 있고 사용하지 않을 수도 있음
보통의 프로시저는 저장 프로시저를 의미함
이미 존재하면 create가 안 되기 때문에 replace로 교체해 주어야 함
프로시저 생성
CREATE OR REPLACE PROCEDURE PRO_NOPARAM
IS
V_EMPNO NUMBER(4) := 7788;
V_ENAME VARCHAR2(10);
BEGIN
V_ENAME := 'SCOTT';
DBMS_OUTPUT.PUT_LINE('V_EMPNO : ' || V_EMPNO);
DBMS_OUTPUT.PUT_LINE('V_ENAME : ' || V_ENAME);
END;
/
EXECUTE PRO_NOPARAM;
프로시저를 먼저 만들고, 이후에 만든 이름을 통해서 실행시켜야 함
BEGIN
PRO_NOPARAM;
END;
특징 | 프로시저 | 함수 |
---|---|---|
실행 | EXECUTE 명령어 또는 다른 PL/SQL 서브프로그램 내에서 호출하여 실행 | 변수를 사용한 EXECUTE 명령어 또는 다른 PL/SQL 서브프로그램에서 호출하여 실행하거나 SQL문에서 직접 실행 가능 |
파라미터 지정 | 필요에 따라 지정하지 않을 수도 있고 여러 개 지정할 수도 있으며 IN, OUT, IN OUT 세 가지 모드를 사용할 수 있음 | 프로시저와 같게 지정하지 않을 수도 있고 여러 개 지정할 수 있지만 IN모드(또는 생략)만 사용 |
값의 반환 | 실행 후 값의 반환이 없을 수도 있고 OUT, IN OUT 모드의 파라미터 수에 따라 여러 개 값을 반환할 수 있음 | 반드시 하나의 값을 반환해야 하며 값의 반환은 프로시저와 달리 OUT, IN OUT 모드의 파라미터를 사용하는 것이 아니라 RETURN 절과 RETURN문을 통해 반환 |
CREATE OR REPLACE FUNCTION FUNC_AFTERTAX(
SAL IN NUMBER
)
RETURN NUMBER
IS
TAX NUMBER := 0.05;
BEGIN
RETURN (ROUND(SAL - (SAL * TAX)));
END FUNC_AFTERTAX;
VARIABLE VSAL NUMBER;
EXECUTE :VSAL := FUNC_AFTERTAX(1000);
PRINT VSAL;
CREATE TABLE EMP_TRG
AS SELECT * FROM EMP;
--함수를 SQL 안에서 실행
CREATE OR REPLACE TRIGGER EMP_TRIGGER
BEFORE INSERT ON EMP_TRG
BEGIN
--이벤트 발생 시 실행되는 코드
DBMS_OUTPUT.PUT_LINE('신입사원 입사');
END;
아래의 코드를 실행해 보ㅕ면 맨 처음에 '신입사원 입사'라는 문구가 출력되는데, 이것이 TRIGGER이다.
--테이블 생성
CREATE TABLE EMP_TRG_LOG(
TABLENAME VARCHAR2(10), --DML이 수행된 테이블 이름
DML_TYPE VARCHAR2(10), --DML 명령어의 종류
EMPNO NUMBER(4), --DML 대상이 된 사원 번호
USER_NAME VARCHAR2(30), --DML을 수행한 USER이름
CHANGE_DATE DATE --DML이 수행된 날짜
);
--트리거 생성
BEGIN
IF INSERTING THEN
INSERT INTO EMP_TRG_LOG
VALUES('EMP_TRG', 'INSERT', :NEW.EMPNO,
'SYS_CONTEXT('USERENV', 'SESSION_USER'), SYSDATE);
ELSIF UPDATING THEN
INSERT INTO EMP_TRG_LOG
VALUES('EMP_TRG', 'UPDATE', :OLD.EMPNO,
SYS_CONTEXT('USERENV', 'SESSION_USER'), SYSDATE);
ELSIF DELETING THEN
INSERT INTO EMP_TRG_LOG
VALUES('EMP_TRG', 'DELETE', :OLD.EMPNO,
SYS_CONTEXT('USERENV', 'SESSION_USER'), SYSDATE);
END IF;
END;
/