오라클 PL/SQL 후.

Oracle 2014. 11. 14. 09:38

PL/SQL - Oracle's Procedural Language extension to SQL  

SQL문장에서 변수 정의, 조건 처리(IF),반복처리(LOOP, WHILE,FOR)등을 지원하며, 오라클 내부에 절차적 언어로서(Procedure Language)로서 SQL의 단점을 보완

1.변수 선언할수 있음

2.비교 처리할수 있음

3.반복 처리할수 있음

PL/SQL 은 PASCAL 유사한 구조로 DECLARE~BEGIN~EXCEPTION~END순서를 갖는다. PL/SQL은 블록(BLOCK)구조의 언어로서 3부분을 나뉨

1. DECLARE SECTION(선언부)

2. EXECUTABLE SECTION(실행부)

3. EXCEPTION SECTION(예외 처리부)

1.선언부 (DECLARE SECTION)

   PL/SQL 에서 사용되는 모든 변수나 상수를 선언하는 부분 DECLARE로 시작

2. 실행부(EXECUTABLE SECTION)

   절차적 형식으로 SQL문을 실행할 수 있도록 절차적 언어의 요소인 제어문,반복문,함수 정의 등 로직을 기술할 수 있는 부분으로 BEGIN으로 시작.

3. 예외처리분(EXCEPTION SECTION)

   PL/SQL문이 실행되는 중에 에러가 발생할 수 있는데 이를 예외 사항이고 이런 예외사항을 해결하기 위한 문장을 기술할 수 있는 부분으로 EXCEPTION으로 시작


PL/SQL 작성요령

  - 블록내에서는 한문장이 종료될 때 마다 세미클론(;) 을 사용

  - END뒤에 ; 사용하여 하나의 블록이 끝났다는것을 명시

  - 블록은 파일로 작성할수도 있고프롬프트에서 바로 작성할수도 있음

  - SQL*PLUS 환경에서는 DELCLARE나 BEGIN이라는 키워드로 PL/SQL 블록이 시작하는 것을 알수 있다. 

  - 단일행 주석은 --이고 여러행 주석은 /* */ 이다. 

  - 쿼리문을 수행하기 위해서 /가 반드시 입력되어야 하며 PL/SQL블록은 행에 /가 있으면 종결된 것으로 간주 

-----------------------------------------

--간단한 소스.

SET SERVEROUTPUT ON;

DECLARE

BEGIN 

    DBMS_OUTPUT.PUT_LINE('Hello PL/SQL!');

END;

/

-------------------------------------------


변수 선언 

VNO NUMBER(4);

VNAME VARCHAR2(10);

VNO := 10;

VNAME := 'NICE';

예제)

------------------------------------------------

SET SERVEROUTPUT ON;

DECLARE

 VNO NUMBER(4);

 VNAME VARCHAR2(10);

BEGIN

 VNO := 7;

 VNAME := 'NICE';

 DBMS_OUTPUT.PUT_LINE('번호/이름');

 DBMS_OUTPUT.PUT_LINE('---------------------');

 DBMS_OUTPUT.PUT_LINE(VNO||'/'||VNAME);

END;

/

-------------------------------------------------------

아래의 예제는 이데이터를 기준으로 



스칼라 변수,레퍼런스 변수

스칼라 변수 는 일반적으로 그냥선언해서 쓰는 변수를 스칼라 변수

레퍼런스 변수는 이전엔 선언된 변수나 데이터베이스 컬럼에 맞추서 선언

레퍼런스변수 예제

--------------------------------------------------

SET SERVEROUTPUT ON;

DECLARE

VTEST TEST_02%ROWTYPE; //변수의 컬럼을 그대로 가져옴. 

BEGIN

    VTEST.NO:=10;    //이렇게 변수를 사용하지.

    DBMS_OUTPUT.PUT_LINE(VTEST.NO); //쉽징?

END;

/

-----------------------------------------------------

SELECT INTO

- DB에 있는 값을 변수에 대입할수 있음. 

예제소스 

---------------------------------------------------------

SET SERVEROUTPUT ON;

DECLARE

VTEST TEST_02%ROWTYPE;

BEGIN

    SELECT * INTO VTEST

    FROM TEST_02

    WHERE NO=2;

    DBMS_OUTPUT.PUT_LINE(VTEST.NO);

    DBMS_OUTPUT.PUT_LINE(VTEST.ADDRESS);

END;

/



---------------------------------------------------------------
그러나 쿼리문으로 단일데이터만 받기만하는건 아닐터 
테이블 type;
이건 배열이라고 보면 되겠음. 
---------------------------------------------------------------
SET SERVEROUTPUT ON;
DECLARE
--테이블 타입 정의 --
TYPE TEST_02_TABLE IS TABLE OF TEST_02.NO%TYPE INDEX BY BINARY_INTEGER;
--테이블 타입으로 변수를 선언 
VTEST_T TEST_02_TABLE;
I BINARY_INTEGER:=0;--테이블 인덱스정보 I를 인티저로 선언하고 0을 대입
BEGIN 
--테이블내용 DB가져오기
FOR K IN(SELECT * FROM TEST_02) LOOP
I:=I+1;--인덱스를 1증가 
VTEST_T(I):=K.NO;
END LOOP;
--테이블 내용 출력
FOR J IN 1..I LOOP
    DBMS_OUTPUT.PUT_LINE(RPAD(VTEST_T(J),10));
END LOOP;
END;
/



-------------------------------------------------------------------


RECORD TYPE

TABLE TYPE은 한가지 데이터만 읽어오므로 테이블의 ROW를 읽어올땐 TABLE TYPE를 여러개 선언하여야 한다.

이걸 한번에 읽어올수 있는게. 있는데 에게봐라 RECORD TYPE다. 


IF ~THEN~END IF

IF(VNO=10) THEN 

VNAME='3434';

END IF;

선택문이였고

IF ~ THEN ~ELSE~END IF

IF(VNO=19) THEN

VNAME='11919';

ELSE

VNAME='3939';

END IF;

이것은 IF ELS문이고

IF~THEN ~ELSIF ~THEN ~END IF

이런문도 있음

LOOP

EXIT;

END LOOP;

루프이고.. 

FOR문은

FOR N IN 1..5 LOOP

PRINT N;

END LOOP


WHILE

WHILE N<=5 LOOP

 N

END LOOP;




블로그 이미지

은호아빠

여행, 맛집, 일상, 프로그래밍, 개발자, 윈도우, 웹, jsp, spring, db, mysql, oracle, c#

,