[ORACLE] Stored Procedure

Posted 2008/04/15 00:09
1. 언어의 구조

DECLARE -- 선택
    -- 변수, 상수, 커서, 사용자 지정 예외 선언

BEGIN -- 필수
  -- SQL 문장
  -- PL/SQL 제어 문장

EXCEPTION -- 선택
  -- 에러 발생시 수행될 액션

END; -- 필수


2. 주석
DECLARE
 sMsg VARCHAR2(10) := '테스트';
BEGIN
   -- sMsg := ‘주석 1’;      한줄주석
   /*                               다중라인 주석
      sMsg := ‘주석 2’;
      DBMS_OUTPUT.PUT_LINE(sMsg);
   */
 DBMS_OUTPUT.PUT_LINE(sMsg);
END;


3. PL/SQL 결과 출력 확인방법

SQL> Set ServerOutput On;

SQL>
BEGIN
    DBMS_OUTPUT.PUT_LINE('HELLO');
END;
/
HELLO

명령문이 처리되었습니다.

0.00 초



4. %TYPE 데이터 타입의 예
// c++의 template과 같은 기능
DECLARE
  v_empno emp.empno%TYPE;
  v_ename emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  SELECT empno, ename, sal
  INTO v_empno, v_ename, v_sal
  FROM emp
  WHERE empno = 7369;
 
  DBMS_OUTPUT.PUT_LINE('사원번호:'||v_empno);
  DBMS_OUTPUT.PUT_LINE('사원이름:'||v_ename);
  DBMS_OUTPUT.PUT_LINE('사원급여:'||v_sal);
END;
사원번호:7369
사원이름:SMITH
사원급여:880

명령문이 처리되었습니다.

0.00 초



5. %ROWTYPE
// C++의 struct와 비슷한 기능. row를 Struct로 간주.

DECLARE
  v_emp emp%ROWTYPE;

BEGIN
  SELECT empno, ename
  INTO v_emp.empno, v_emp.ename
  FROM emp
  WHERE empno=7369;
 
  DBMS_OUTPUT.PUT_LINE('번호:'||v_emp.empno);
  DBMS_OUTPUT.PUT_LINE('이름:'||v_emp.ename);
END;

번호:7369
이름:SMITH

명령문이 처리되었습니다.

0.03 초



6. PL/SQL TABLE
// 1차원 배열과 유사

DECLARE
  TYPE empno_table IS TABLE OF emp.empno%TYPE INDEX BY BINARY_INTEGER;
  TYPE ename_table IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;

  empno_tab empno_table;
  ename_tab ename_table;

  i BINARY_INTEGER := 0;

BEGIN
  FOR emp_list IN(SELECT empno, ename FROM emp WHERE deptno=10)
  LOOP
    i := i + 1;

    empno_tab(i) := emp_list.empno;
    ename_tab(i) := emp_list.ename;
   
    DBMS_OUTPUT.PUT_LINE('번호:'||empno_tab(i));
    DBMS_OUTPUT.PUT_LINE('이름:'||ename_tab(i));
  END LOOP;
END; 

번호:7782
이름:CLARK
번호:7839
이름:KING
번호:7934
이름:MILLER

명령문이 처리되었습니다.

0.01 초



7. PL/SQL Record
// C++의 typedef같은거
// 사용자 정의 struct

DECLARE
  TYPE emp_record IS RECORD
  (v_empno NUMBER,
   v_ename VARCHAR2(30));

  emp_rec emp_record;

BEGIN
  SELECT empno, ename
  INTO emp_rec.v_empno, emp_rec.v_ename
  FROM emp
  WHERE empno=7369;

  DBMS_OUTPUT.PUT_LINE('번호:'||emp_rec.v_empno);
  DBMS_OUTPUT.PUT_LINE('이름:'||emp_rec.v_ename);
END;

번호:7369
이름:SMITH

명령문이 처리되었습니다.

0.00 초



8. IF / ELSE / THEN

DECLARE
  sMonth CHAR(2);

BEGIN
  SELECT TO_CHAR(SYSDATE, 'MM')
  INTO sMonth
  FROM dual;

  IF(sMonth>='03' and sMonth<='08') THEN
    DBMS_OUTPUT.PUT_LINE('1학기');
  ELSE
    DBMS_OUTPUT.PUT_LINE('2학기');
  END IF;

END;

1학기

명령문이 처리되었습니다.

0.00 초



9. LOOP

DECLARE
  i NUMBER := 0;
  nSum NUMBER := 0;

BEGIN
  LOOP
    i := i + 1;
    nSum := nSum + i;
    EXIT WHEN i >= 100;
  END LOOP;
 
  DBMS_OUTPUT.PUT_LINE('1~100까지의 합 : '||TO_CHAR(nSum));
END;

1~100까지의 합 : 5050

명령문이 처리되었습니다.

0.01 초



10. FOR LOOP

DECLARE
  i NUMBER := 0;
  nSum NUMBER := 0;

BEGIN
  FOR i IN 1..100 LOOP
    nSum := nSum + i;
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('1~100까지의 합 : '||TO_CHAR(nSum));

END;

1~100까지의 합 : 5050

명령문이 처리되었습니다.

0.01 초



11. WHILE LOOP

DECLARE
  i NUMBER := 0;
  nSum NUMBER := 0;

BEGIN
  WHILE i<100 LOOP
    i := i + 1;
    nSum := nSum + i;
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('1~100까지의 합 : '||TO_CHAR(nSum));
END;

1~100까지의 합 : 5050

명령문이 처리되었습니다.

0.01 초


12. GOTO

DECLARE
  i NUMBER;

BEGIN
  FOR i IN 1..50 LOOP
    IF i = 30 THEN
      GOTO my_label;
    END IF;
  END LOOP;

<<my_label>>
  DBMS_OUTPUT.PUT_LINE('i=30');
END;

i=30

명령문이 처리되었습니다.

0.02 초

« PREV : 1 : ... 94 : 95 : 96 : 97 : 98 : 99 : 100 : 101 : 102 : ... 276 : NEXT »