* PL/SQL 의 IF 문

 -> IF( ) ~ THEN ~

     ELSIF ( ) ~ THEN ~

     ELSE ~

     END IF 

DECLARE 
	INFO_A TABLE_A%ROWTYPE;
 BEGIN 
 	SELECT *
    INTO INFO_A
    FROM TABLE_A
    WHERE A_ID = '&A_ID' ;
    
    IF (INFO_A.A_NAME = 'MYNAME')
    	THEN DBMS_OUTPUT.PUT_LINE('MY INFO');
    
    --ELSIF ~ THEN ~ ELSE ~
    
    END IF;
    
END;
/


* PL/SQL 의 CASE 문

 -> ~ := CASE ~

        WHEN ~ THEN~

        WHEN ~ THEN~

        WHEN ~ THEN~

        WHEN ~ THEN~

        WHEN ~ THEN~

             END:

DECLARE
	INFO_A TABLE_A%ROWTYPE;
    ID VARCHAR2(20);
BEGIN 
	SELECT * 
    INTO INFO_A
    FROM TABLE_A
    WHERE A_ID = '&AID';
    
    ID := 
    CASE TABLE_A.A_ID
    WHEN 'AA' THEN 'FRIEND1'
    WHEN 'BB' THEN 'FRUEND2'
    WHEN 'CC' THEN 'FRUEND3'
    WHEN 'DD' THEN 'FRUEND4'
    WHEN 'EE' THEN 'FRUEND5'
    
    END;
    DBMS_OUTPUT.PUT_LINE(TABLE_A.A_ID || '는 ' || ID); 
END;
/

*PL/SQL 의 반복문

-> (BASIC LOOP) : 내부에 처리문을 작성하고 마지막에 LOOP를 벗어날 조건을 명시

    LOOP

         처리문

           

         조건문

          ( IF 조건식 THEN EXIT

          END IF )   

             or

          ( EXIT WHEN 조건식 )      

    END LOOP;

 

DECLARE 
	N NUMBER :=1;
BEGIN
	LOOP
    	DBMS_OUTPUT_PUT_LINE(N);
        EXIT WHEN N=5;
        
        N := N+1;
     END LOOP;
 END;
 /

      

* PL/SQL 의 반복문2

 -> (FOR 문) : 

    FOR 인덱스 IN (REVERSE) 초기값 ... 최종값

     LOOP

        처리문

     END LOOP;

BEGIN 
	FOR I IN 1..5
    LOOP
    	DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
END;
/
--거꾸로 
BEGIN 
	FOR I IN REVERSE 1..5
    LOOP
    	DBMS_OUTPUT.PUT_LINE(I);
    END LOOP;
END;
/

 

*반복문을 이용한 INSERT

CREATE TABLE MAKE1(
	R_NUM NUMBER(3),
    R_CHAR VARCHAR2(20),
    DT DATE
);

BEGIN 
	FOR I IN 1..10
    LOOP
    	INSERT INTO MAKE1 VALUES(I, '임의의수'||I , SYSDATE+I );
    END LOOP;
END;
/

 

*예외처리 : 오라클 내부에 미리 정의되어 있는 예외 (약 20개)

                따로 선언할 필요 없이 발생 시 예외절에 자동 트랩됨

         - 대표적인 시스템 예외
        -- NO_DATA_FOUND :  SELECT문이 아무런 데이터 행을 반환하지 못할 때
        -- TOO_MANY_ROWS : 하나만 리턴해야하는 SELECT문이 하나 이상의 행을 반환할 때
        -- INVALID_CURSOR : 잘못된 커서 연산
        -- ZERO_DIVIDE : 0으로 나눌 때
        -- DUP_VAL_ON_INDEX : UNIQUE 제약을 갖는 컬럼에 중복되는 데이터가 INSERT될 때 

<예외처리 구문>

EXCEPTION WHEN 예외명 1 THEN 예외처리구문1

                WHEN 에외명 2 THEN 예외처리구문 2

                .....

<EXAMPLE>

DECLARE 
	NUM NUMBER := 0;
BEGIN
	NIM := 10/0;
    DBMS_OUTPUT.PUT_LINE('SUCCESS');
  EXCEPTION
  	WHEN ZERO_DIVIDE 
    THEN DBMS_OUTPUT.PUT_LINE('ZERO_DIVIDE EXCEPTION발생!');
END;
/

 

 

* PL/SQL ? 

 -> 오라클 자체에 내장되어 있는 절차적 언어 (PROCEDUAL LANGUAGE)

 -> SQL 문장 내에서 변수 정의, IF LOOP FOR WHILE 등을 지원하며 SQL의 단점 보완

 

*PL/SQL 구조

1) 선언부 : DECLARE ~  변수나 상수 선언

2) 실행부 : BEGIN ~ 제어문, 반복문, 함수 정의 등 로직 

3) 예외처리부 : EXCEPTION~ 예외 발생 시 해결하기 위한 문장

 

* PL/SQL의 장점

1. BLOCK 구조로 다수의 SQL문을 한번에 ORACLE DB로 보내 처리하므로 수행 속도 향상

2. 모든 요소는 하나 또는 두 개 이상의 블록으로 구성하여 모듈화 가능

3. 동적으로 변수 선언 가능

4. EXCEPTION 을 통해여  ORACLE SERVER ERROR 처리가능 (사용자 정의 에러 정의 및 처리도 가능)

 

※프로시저 사용 시 출력하는 내용을 화면에 보이도록 하는 명령어

SET SERVEROUTPUT ON;

 

<HELLO WORLD 출력>

 

BEGIN

 DBMS_OUTPUT.PUT_LINE('HELLO WORLD');

END;

/

(/ : PL/SQL 블록 종료 의미) 

 

<변수 선언, 초기화> 

 

DECLARE 
	C1 NUMBER;
    C2 VARCHAR2(30);
    C3 VARCHAR(30):= 'MY' ;
    C4 CONSTANT NUMBER := 3.141592;
BEGIN
	C1 := 999;
   	C2 := 'NAME'
END;
/

오라클의 대입연산자 ->  :=

 

<레퍼런스 변수>  -> 변수의 데이터 타입을 테이블 또는 뷰의 컬럼을 참조하여 지정하는 변수

 -> 종류 : %TYPE, %ROWTYPE

 -> %TYPE : 해당 컬럼의 데이터 타입을 얻음

 -> %ROWTYPE : 해당 테이블 행 전체의 타입을 얻음

 

DECLARE 
	ID TABLE_A.A_ID%TYPE; 			--변수 선언
    NAME TABLE_A.A_NAME%TYPE;		--자료형은 해당 테이블컬럼을 참조
    
BEGIN 
	SELECT A_ID, A_NAME 			--변수에 SELECT 값 각각 대입
    INTO ID, NAME
    FROM TABLE_A
    WHERE A_ID = '&ID';
    
    DBMS_OUTPUT.PUT_LINE(ID); 		--저장된 변수 출력
    DBMS_OUTPUT.PUT_LINE(NAME);
END;
/

오라클 값 입력창 : '&이름'

 

<%ROWTYPE 활용>

DECLARE 
	ROW_V TABLE_A%ROWTYPE;

BEGIN 
	SELECT * 
    INTO ROW_V
    FROM TABLE_A
    WHERE A_ID = '&ID';

	DBMS_OUTPUT.PUT_LINE('A_ID: ' || TABLE_A.A_ID);
	DBMS_OUTPUT.PUT_LINE('A-NAME: ' || TABLE_A.A_NAME);    
	DBMS_OUTPUT.PUT_LINE('A_PHONE: ' || TABLE_A.A_PHONE);    --원하는 변수 출력
    
 END;
 /

 

+ Recent posts