본문 바로가기

오라클

PL/SQL

 

-- PLSQL

    PL/SQL(Procedural Language extensions to SQL)은 프로그래밍언어의 특성을 가지는 SQL의 확장이며,

    데이터 조작과 질의 문장은 PL/SQL의 절차적 코드 안에 포함된다. 또한 PL/SQL을 사용하면 SQL로 할 수 없는 

    절차적 작업이 가능하다. 여기에서 절차적이란 어떤 것이 어떻게 완료되는지 그 방법을 정확하게 코드에 기술 

    한다는 것을 의미한다.



-- SQL Developer 에서 PL/SQL의 쿼리의 결과를 확인할 수 있게 설정하기

               * DBMS_OUTPUT.PUT_LINE()을 이용하여 결과를 출력하기 위해서는 먼저 SET SERVEROUTPUT ON 를 실행

      * Developer에서 메뉴 : 보기 - DBMS 출력 선택후 DBMS 출력 창의 에서 + 버튼을 누름 - plus icon to enable DBMS_OUTPUT for a connection.

      * DBMS_OUTPUT.PUT_LINE() 에 대한 결과가 한번은 잘 나오는데 두번째부터는 실행되지 않을 수 있다. 

   * 프로시져등을 만들때는 ORACLE SQL Developer가 편하지만 출력이 되지 않을 경우에는 sqlplus를 이용 한다.


-- DBMS_OUTPUT.PUT_LINE('값');

    출력 후 라인 넘김


-- DBMS_OUTPUT.PUT('값');

    출력 후 라인 넘기지 않음. DBMS_OUTPUT.NEW_LINE();을 만나야 화면에 표시 됨


-- DBMS_OUTPUT.NEW_LINE();

    라인 넘김


-- 대입문

  변수 := 값;


-- %TYPE

  -- 테이블 컬럼 자료형을 참조하는 자료형


-- %ROWTYPE

   -- 테이블 스키마와 같은 구조체변수


-- 사용자 정의 구조체 변수

TYPE 구조체명 IS RECORD

(

    컬럼 타입

    ,컬럼 타입

);


-- IF 조건 THEN (값 혹은 실행문) 

    ELSIF 조건 THEN (값 혹은 실행문) 

    ELSE (값 혹은 실행문)  

    END IF 문

   TRUE면 THEN과 ELSE사이의 문장을 수행하고 FALSE나 NULL이면 ELSE와 END IF사이의 문장을 수행한다.


-- WHILE 조건 LOOP ~ END LOOP

   제어 조건이 TRUE인 동안만 일련의 문장을 반복하기 위해 WHILE LOOP문장을 사용한다.


   --1부터100까지 합

   DECLARE

    n NUMBER :=0;

    s NUMBER :=0;

   BEGIN 

    WHILE n<100 LOOP --LOOP는 자바의 괄호를 나타내는것과 똑같다.

      n:=n+1;

      s:=s+n;

    END LOOP; -- while문 끝

    DBMS_OUTPUT.PUT_LINE('결과:'||s);

  END;

  /--sqlplus 에서 실행하라는 의미

  

  --1부터 100까지합과 홀수합

   DECLARE

    n NUMBER :=0;

    s1 NUMBER :=0;

    s2 NUMBER :=0;

   BEGIN 

    WHILE n<100 LOOP

      n:=n+1;

      IF MOD(n,2)=0 THEN

        s1:=s1+n;

      ELSIF MOD(n,2)=1 THEN 

        s2:=s2+n;

      END IF;

    END LOOP;

    DBMS_OUTPUT.PUT_LINE('결과:'||s1);

    DBMS_OUTPUT.PUT_LINE('결과:'||s2);

  END;

/


--구구단

DECLARE

     n NUMBER :=1;

     m NUMBER :=0;

     g NUMBER;

BEGIN

    WHILE  n<9 LOOP

n:=n+1;

DBMS_OUTPUT.PUT_LINE(n || '단');

m:=0;

         WHILE  m<9 LOOP

    m:=m+1;

    g:=n*m;

    DBMS_OUTPUT.PUT_LINE(n || '*' || m || '=' || g);

         END  LOOP;

    END  LOOP;

END;

/


-- EXIT [WHEN condition];

    EXIT 문을 이용하면 END LOOP 문 다음 문으로 제어를 보내기 때문에 루프를 종료할 수 있다. 


-- LOOP ~ END LOOP

    반복문으로 "EXIT WHEN 조건"이 실행문 앞과 뒤 어느 곳이나 위치할 수 있으며 "EXIT WHEN 조건"에서 조건을 만족하면 빠져 나간다.


-- LOOP 문(무한반복)

DECLARE

    n NUMBER :=0;

    s NUMBER :=0;

   BEGIN 

    LOOP

      n:=s+1;

      s:=s+n;

      EXIT WHEN n=100; -- n이 100이면 LOOP를 빠져나감

    END LOOP;

    DBMS_OUTPUT.PUT_LINE('결과:'||s);

  END;

/


-- FOR ~ LOOP 문

FOR 변수 IN [REVERSE] 시작수 .. 끝낼수 LOOP

      실행문; 

END LOOP; 


  FOR 에서 사용되는 변수는 자동 선언되므로 따로 선언하지 않아도 됨

 "시작수"에서 1씩 증가하여 "끝날 수"가 될 때까지 반복 수행하며, FOR문에 사용되는 변수는 자동 선언되므로 따로 선언할 필요가 없다.

  REVERSE : "끝날수"에서 "시작수"까지 반복함으로써 인덱스가 1씩 감소되도록 한다.


--1부터 100까지합

DECLARE

  s NUMBER :=0;

BEGIN

  FOR n IN 1..100 LOOP

    s:=s+n;

    END LOOP;

  DBMS_OUTPUT.PUT_LINE('결과:' || s);

END;

/


 -- 10부터 1까지 순서대로 출력

DECLARE

BEGIN

    FOR  n  IN   REVERSE   1..10   LOOP 

DBMS_OUTPUT.PUT_LINE(TO_CHAR(n));

    END  LOOP;

END;

/



-- FOR 를 이용한 SELECT 문

FOR 레코드이름 IN SELECT문 LOOP

      실행문; 

END LOOP;


-- insa 테이블에서 이름 부서 기본급여를 출력하라

DECLARE

BEGIN

  FOR rec IN (SELECT * FROM insa) LOOP

    DBMS_OUTPUT.PUT_LINE(rec.name || '    ' || rec.buseo || '    ' || rec.basicpay);

  END LOOP;

END;

/


--SELECT 문의 결과를 한행씩 rec라는 레코드 변수에 전달하여 모든 결과를 확인 할 수 있다.

--FOR 문에 사용하는 SELECT 문은 INTO절을 갖지 않는다.


-- PL/SQL 에서 일반적인 SELECT 문형식

-- SELECT 컬럼, 컬럼 INT

'오라클' 카테고리의 다른 글

프로시져의 SYS_REFCURSOR 예제  (0) 2013.06.05
프로시져(Stored Procedure)  (0) 2013.06.04
트랜잭션  (0) 2013.06.04
inline view (또는 subquery), WITH  (0) 2013.06.03
데이터 삭제  (0) 2013.06.01