MisoBoy Blog...

[20110715] SEQUENCE & PROCEDURE 본문

Oracle

[20110715] SEQUENCE & PROCEDURE

misoboy 2011. 7. 15. 15:20
SELECT * FROM EMP;

DELETE FROM EMP
WHERE empno = 7499;

REM Stored PROCEDURE(저장프로시저)
--1)목적 : 속도, 보안
--2)compile(pcode로 변환)상태로 RDBMS 에 저장
--3)나중에 실행될 일련의 명령의 집합
--4)리턴하는 행의 갯수가 많으면 에러난다.
--5)pl/sql에서 SELECT는 반드시 SELECT INTO 를 사용해야
--6)syntax
CREATE OR REPLACE PROCEDURE procedure_name
(
    매개변수 영역
    변수이름    변수모드   변수타입
    v_empno     IN(OUT, IN OUT)        emp.EMPNO%TYPE
)
IS
    내부변
BEGIN
   pl/SQL 문장들
END;

--test.sql로 저장
CREATE OR REPLACE PROCEDURE test
(
     v_empno     IN     emp.empno%TYPE
)
IS
BEGIN
	DELETE FROM emp
	WHERE empno = v_empno;
END test;
/
--실행할 때
EXEC test(7922);

DESC DEPT;

CREATE OR REPLACE PROCEDURE sp_insert_dept
(
    v_deptno    IN     dept.deptno%TYPE,
    v_dname     IN     dept.dname%TYPE,
    v_loc       IN     dept.loc%TYPE
)
IS
BEGIN
  INSERT INTO DEPT
  VALUES (v_deptno, UPPER(v_dname), UPPER(v_loc));
END sp_insert_dept;

EXEC sp_insert_dept(50, 'marketting', 'yatap');

SELECT * FROM dept;

SELECT * FROM EMP
WHERE job  = UPPER('analyst');

CREATE OR REPLACE PROCEDURE sp_emp_sal
(
	v_sal	IN	emp.sal%TYPE,
    v_job	IN	emp.job%TYPE
)
IS
BEGIN
  UPDATE EMP
  SET sal = v_sal
  WHERE job = UPPER(v_job);
END sp_emp_sal;

DROP PROCEDURE sp_emp_sal;

EXEC sp_emp_sal(1000, 'clerk');

SELECT sal FROM emp WHERE job = 'CLERK';

CREATE OR REPLACE PROCEDURE sp_emp_select
(
	v_empno	IN	emp.EMPNO%TYPE,
	v_ename	OUT	emp.ENAME%TYPE,
    v_sal	OUT	emp.sal%TYPE
)
IS
BEGIN
  SELECT ename, sal
  INTO v_ename, v_sal
  FROM EMP
  WHERE empno = v_empno;
END sp_emp_select;

SQL> var g_ename VARCHAR2(20);
SQL> var g_sal    NUMBER;
SQL> EXEC sp_emp_select(7566, :g_ename, :g_sal);

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> print g_ename;

G_ENAME
--------------------------------
JONES

SQL> print g_sal;

     G_SAL
----------
      2975

CREATE SEQUENCE emp_empno_seq
    START WITH 1
    INCREMENT BY 1
    MAXVALUE  999
    NOCYCLE
    CACHE 10;
--Q)emp 테이블에서 새로운 사원의 정보를 이름, 업무,
--매니저, 급여를 입력받아 등록하는 emp_input 프로시저
--를 생성하시오. 단, 부서번호는 매니저의 부서 번호와
--동일하게 하고 보너스는 SALESMAN 은 0을 그 외의 부서는
--NULL을 입력하시오.
CREATE OR REPLACE PROCEDURE emp_input
(
    v_name  IN	emp.ENAME%TYPE,
    v_job	IN	emp.JOB%TYPE,
    v_mgr	IN	emp.MGR%TYPE,
    v_sal	IN	emp.SAL%TYPE
)
IS
	v_comm	emp.comm%TYPE;
    v_deptno emp.DEPTNO%TYPE;
BEGIN
    IF UPPER(v_job) = 'SALESMAN' THEN v_comm := 0
    ELSE v_comm := NULL
    END IF;
    SELECT deptno
    INTO   v_deptno
    FROM emp
    WHERE empno = v_mgr;
    INSERT INTO EMP
    VALUES(EMP_EMPNO_SEQ.NEXTVAL, v_name, UPPER(v_job),
    v_mgr, SYSDATE, v_sal, v_comm, v_deptno);
END emp_input;