[ 서브프로그램의 이해, 프로시저 ]


  : PL/SQL의 서브프로그램이란?
    -> <PL/SQL의 익명 블럭의 특징>
      : . 이름이 없는 PL/SQL 블럭
        . 저장해서 사용되지 않는다.
        . 사용할 때마다 컴파일이 필요하다.
        . 다른 응용프로그램에서 사용할 수 없다.
        . 값을 반환할 수 없다.
        . 매개변수를 사용할 수 없다.
        
    -> <서브프로그램의 특징>
      : . 이름이 있는 PL/SQL 블럭
        . DB에 저장해 반복적으로 사용할 수 있다.
        . 최초 실행될 때 한번만 컴파일 한다.
        . 다른 응용프로그램에서 사용할 수 있다.
        . 함수일 경우 값을 리턴(반환)할 수 있다.
        . 매개변수를 사용할 수 있다.
        
      ** "서브 프로그램"은 내장된 함수프로시저가 있다.
        - 프로시저
        - 함수
      ---------------------------------------------------------------------
      
      - 프로시저란??
        : 특정 처리를 위한 서브 프로그램의 한 유형이다.
        : 단독으로 실행 가능하며, 다른 응용 프로그램에서도 호출되어 실행 가능하다.
        
        - 프로시저 구문 형식)
          create procedure 프로시저명
            파라미터1(in,out,in out) 데이터타입, -- default는 in모드
              -- out : 값을 반환하겠다, in : 서브프로그램 내에 값 전달 in out : 서브프로그램 내에도 전달되고, 외부 응용프로그램에도 반환하기도 함
            파라미터2(in,out,in out) 데이터타입
          is
            변수 선언부;
          begin
            프로시저 본문 처리부;
          exception
            예외처리부;
          end;

EX)


[ 외부 변수 선언 및 전달과 out 타입을 통한 결과값 받기 예제 ]


[    ORACLE 예외처리 개념, 종류, 사용법 - (8)    ]




  - 에러 의 종류 ]
      1. 컴파일 에러 : PL/SQL 블럭이 파싱(Parsing)될 때 "사용자 오타" 등으로 인해 발생되는 에러.
        (Compile Error)
      2. 런타임 에러(=Exception)
          : PL/SQL 블럭이 실행되는 동안 발생하는 에러로 일반적으로 런타임에러를 "Exception"이라 부른다.
            종류)
              a. 오라클 예외 
                  : 오라클에서 제공되는 예외(Predefined ORACLE Exception과 Non-Predefined ORACLE Exception이 있다.)
                    ㄱ. Predefined ORACLE Exception 
                          : 사전에 정해진 예외
                          종류)
                            - ACCESS_INTO_NULL 
                                : 정의되지 않은 오브젝트 속성에 값을 할당하고자 했을 때 발생하는 예외.                      
                            - CASE_NOT_FOUND 
                                : CASE문의 when절에 해당되는 조건이 없고 else절도 없을 경우 발생
                            - COLLECTION_IS_NULL 
                                : 선언되지 않은 컬렉션(nested table, varray)에 존재하는 메서드
                                                   이외의 메서드를 사용했을 때 발생되는 예외.
                            - CURSOR_ALREADY_OPEN 
                                : 이미 열려진 커서를 열려고 시도 했을 때 발생하는 예외
                            - DUP_VAL_ON_INDEX 
                                : 유일인덱스에 중복값을 입력햇을 때 발생하는 예외.
                            - INVALID_CURSOR 
                                : 잘못된 커서 조작이 샐행될 때 발생되는 예외.
                            - INVALID_NUMBER 
                                : 문자를 숫자로의 변환 시 실패가 될 때 발생하는 예외.
                            - LOGIN_DENIED 
                                : 잘못된 사용자명이나 암호로 로그인시도시 발생하는 예외.
                            - NO_DATA_FOUND 
                                : PL/SQL Select문이 한 건도 리턴하지 못하는 경우 발생하는 예외.
                            - NOT_LOGGED ON 
                                : 접속되지 않은 상태에서 데이터베이스에 대한 요청이 PL/SQL 프로그램으로
                                  실행된 경우 발생되는 예외.
                            - PROGRAM_ERROR 
                                : PL/SQL이 내부적인 문제를 가지고 있는 경우 발생되는 예외.
                            - ROWTYPE_MISMATCH 
                                : 할당문에서 호스트 커서 변수와 PL/SQL 커서 변수의 데이터 형이 불일치할 때 발생되는 예외
                            - STORAGE_ERROR 
                                : PL/SQL이 실행될 때 메모리가 부족하거나 메모리상에 문제가 일어났을 대 발생하는 예외.
                            - SUBSCRIPT_BEYOND_COUNT 
                                : 컬렉션의 요소 갯수보다 더 큰 첨자 값으로 참조한 경우 발생
                            - SUBSCRIPT_OUTSIDE_LIMIT 
                                : 컬렉션의 첨자 한계를 벗어난 참조가 일어났을 때 발생
                            - SYS_INVALID_ROWD 
                                : 문자열을 ROWID로 변환할 때 무효한 문자열의 표현일 경우 발생되는 예외.
                            - TIMEOUT_ON_RESOURCE 
                                : 자원에 대한 대기시간이 초과했을 때 발생하는 예외.
                            - TOO_MANY_ROWS 
                                : PL/SQL select문이 두건이상의 행을 리턴햇을 때 발생되는 예외.
                            - VALUE_ERROR 
                                : 산술,변환,절삭 크기 제약에 에러가 생겼을 때 발생되는 예외.
                            - ZERO_DIVIDE
                                : 0으로 나누려 했을 때 발생하는 예외.
                  
                    ㄴ. Non-predefined ORACLE Exception
                          : 사전에 정해지지 않은 예외
              b. 사용자 정의 예외
                  : 사용자에 의해 정의되는 예외
                    사용자 정의 예외 사용 예)
                      declare (선언부에서)
                      예외명 exception;
                      begin부나 exception부에서 raise문을 이용해서 예외를 발생시킨다.
                      
                      - 예외처리부 형식)
                          -- 예외처리부 : 예외 발생시 어떻게 처리할 것인지에 예외처리 내용이 들어간다.
                        Exception
                          when 예외명 then
                            실행문...
                          when 예외명2 then
                            실행문...
                          when OTHERS then
                            실행문...

EX)


[    ORACLE 커서(CURSOR)    ]




 [  커서  ]
  : select문을 통해 결과값들이 나올 때 이 결과들은 메모리 공간에 저장하게 되는데
  
    이때, 이 메모리 공간을 "커서"라고 한다.
    
    즉, 
      - 커서란? : 쿼리문에 의해서 반환되는 결과값들을 저장하는 메모리 공간이다.
      - Fetch란 : 커서에서 원하는 결과값을 추출하는 것.
    
    왜사용하는가???!!  
커서는 로우를 기반으로 하는 작업이 된다!!! 라는 것입니다. 저러한 로우를 하나 SELECT해서 여러가지 처리를 한후 어떠어떠한 작업을 한다~~
           
이것을 가능하게 하는 것이 바로!!! 커서 입니다.
      
     물론 SQL구문만을 가지고 어거지로 어찌어찌 한다면~~ 가능할 겁니다.
        
     하지만 커서를 이용하시면 훨씬 빠르고 간단히 저러한 처리를 가능하게 할 수 있습니다.
    
여기까진 이론적으로고... 그냥 근본적으로는

-> select의 결과가 하나의 행(단일 튜플)일 경우는 into절을 이용해 변수에 저장할 수 있지만, 결과가 복수행(복수 튜플)일      경우는 into절로 이를 처리할 수가 없죠
    이렇게 여러 복수 행의 결과를 행단위로 처리를 하기 위해서 사용하는 것이 Cursor입니다.
   

1. 커서의 정의
 

커서란 SQL Plus에서 사용자가 실행한 SQL문의 단위를 의미합니다.


오라클에서 수행한 모든 쿼리문은 커서 단위로  처리합니다.

PL/SQL의 SQL문처럼 하나의 결과를 리턴하는 경우 커서 없이도 SQL문의 실행결과가 암시적으로 커서에 저장되므로 이를 암시적 커서라고 합니다.
 

SQL문을 수행한 후에 결과로 얻어지는 행이 여러 개일 경우에는 암시적은 커서에 정보를 저장할 수 없기에 에러가 발생합니다. 이럴 경우에는 반드시 명시적인 커서를 사용해야 합니다.


명시적인 커서는 PL/SQL 레코드(RECORD)와 PL/SQL의 테이블(TABLE)을 결합한 것으로서 프로그램 언어의 구조체 배열과 유사합니다

------------------------------------------------------------------------------------------------------
(오라클에서 CURSOR란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL 문을 실행시키면 결과값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 fetch해 처리하여 해당 결과 셋을 프로그래밍적으로 

접근할수 있게 도와주는 기능이다.)

   
      [ 커서의 종류 ]
      1. 묵시적 커서(Implicit Cursor)
        : 오라클에서 자동으로 선언해주는 SQL 커서.(사용자는 생성 유무를 알 수 없다.)
        
      2. 명시적 커서(Explicit cursor)
        : 사용자가 선언해서 생성한 후에 사용하는 SQL 커서, 주로 여러개의 행을 처리하고자
          할 경우 사용한다.
        
      [ 커서의 속성 ]
      1. %Found : 가져올 레코드가 있는 경우 true를 반환
      2. %isOpen : 커서가 오픈 상태일 경우 true를 반환
      3. %NotFound : 더이상 참조할 레코드가 없을 때 true를 반환
      4. %RowCount : 카운터 역할을 한다. 처음 오픈시 0, 패치발생할 때마다 1씩 증가
      
      [ 커서의 처리 단계 ](명시적 커서 기준)
      1. 명시적 커서 선언(커서 생성)
        EX) Cursor 커서이름
      2. 명시적 커서 오픈
        EX) Open 커서이름
      3. 커서에서 데이터 추출(데이터 행 가져오기)
        EX) Fetch 커서이름
      4. 커서 종료
        EX) Close 커서이름



+ Recent posts