2021년 10월 16일 토요일

오라클 패키지(package), 이론및실습

 

오라클 패키지(package), 이론및실습


패키지란 연관성 있는, 논리적으로 연관된 PL/SQL 타입(Types), 변수(Variable), 서브 프로그램(저장 프로시저, 저장 함수)의 그룹이며 오라클 스키마 오브젝트 입니다. 


패키지 명세(Specification)와 패키지 바디(Body)로 나누어지며 바디는 생략 가능 합니다.

패키지 명세는 CREATE PACKAGE 명령으로, 패키지 바디는 CREATE PACKAGE BODY 명령으로 작성 합니다.


패키지 명세에서 정의한 서브 프로그램 및 변수, 타입만 외부에서 접근, 호출 가능 합니다.

패키지 명세 : 타입, 전역변수, 커서, 예외, PL/SQL 프로그램에 대한 선언

패키지 바디 : 패키지 명세에서 정의한 모든 커서, 서브프로그램을 구현


패키지를 사용하는 장점은 다음과 같습니다.

모듈화 : 연관된 타입, 서브 프로그램들을 PL/SQL 모듈안에 캡슐화.


쉬운 응용프로그램 디자인 : 패키지 명세를 통한 커서, 예외, 함수나 프로시저의 구조를 정의하고 이를 먼저 컴파일하는 것이 가능 합니다.


정보의 숨김 : 패키지를 통해 타입, 서브프로그램 등을 PUBLIC, PRIVATE으로 정의를 할 수 있습니다.


기능 추가의 용이 : 패키지 명세에서 정의한 커서 or 예외, PUBLIC 변수들은 세션동안 유효하므로 이것들을 활용한 새로운 기능의 추가가 용이 합니다.


성능 향상 : 패키지안의 프로시저등이 최초 호출될 때 전체 패키지가 메모리에 로드 되므로 이후 호출 부터는 DISK I/O는 없습니다.


<기본형식>

[패키지 명세]

CREATE [OR REPLACE] PACKAGE package_name IS

   [variable declaration]

   [cursor declaration]

   [exception declaration]

   [procedure declaration]

   [function declaration] 

END;

 

[패키지 바디]

CREATE [OR REPLACE] PACKAGE BODY package_name  IS 

   [variable declaration]

   [cursor implementation]

   [exception implementation]

   [procedure bodies]

   [function bodies] 

END;


장 프로시저를 만들고 호출하는 실습을 해보겠습니다.

15.4.1. 패키지 HelloWorld 실습 : CREATE OR REPLACE PACKAGE


프로시저 하나만 가지는 HELLO라는 이름의  패키지를 생성해 봅시다.


먼저 패키지 명세를 작성하세요.


-- 패키지명세는 패키지를 구성할 요소를 정의 합니다.

CREATE OR REPLACE PACKAGE HELLO

IS

   -- HELLO 패키지는 P_TEST라는 프로시저 하나로 이루어져 있습니다.

   PROCEDURE P_TEST(P_NAME VARCHAR2);

END;


<실행결과>

Procedure P_PRINT_ENAME이(가) 컴파일되었습니다.


패키지 바디를 작성하세요.


-- 패키지 바디를 생성 합니다.

CREATE OR REPLACE PACKAGE BODY HELLO

IS

   -- 패키지 명세에서 정의한 P_TEST 프로시저를 작성합니다.

   PROCEDURE P_TEST(P_NAME VARCHAR2)

   IS

   BEGIN

      DBMS_OUTPUT.PUT_LINE('Hello~ ' || P_NAME);

   END;

END HELLO;


<실행결과>

Package Body HELLO이(가) 컴파일되었습니다.



패키지의 프로시저를 호출해 봅시다..


SET SERVEROUTPUT ON;


-- 패키지내의 프로시저를 호출할 때는 패키지.프로시저 형태로 호출 합니다.

EXEC HELLO.P_TEST('골든래빗');


<실행결과>

Hello~ 골든래빗

 

 

오라클PLSQL, 저장 프로시저, CREATE OR REPLACE PROCEDURE

 

오라클PLSQL, 저장 프로시저, CREATE OR REPLACE PROCEDURE

15.3. 저장 프로시저(Stored Procedure)


오라클 데이터베이스에 스키마 객체로 저장된 명명된 PL/SQL 블록으로 자신을 호출한 곳으로 리턴 해주는 값은 없고 호출되어 실행만 됩니다.


저장 프로시저 Header의 끝에는 IS[or AS]가 와야하고 IS와 BEGIN 사이에 BEGIN ~ END에서 사용할 변수를 선언합니다.


자신의 스키마에서 저장 프로시저를 만들기 위해서는 CREATE PROCEDURE 시스템권한이

있어야 하며 다른 스키마 계정에서 프로시저를 만들기 위해서는 CREATE ANY PROCEDURE 시스템 권한이 이 있어야 합니다.


실행환경과 저장프로시저 사이에 값을 전달하기 위해 파라미터를 사용하는데 다음과 같은 종류가 있습니다.

IN : 호출하는 곳에서 함수 or 프로시저로 값을 전달

OUT : 함수 or 프로시저에서 호출한 곳으로 값을 전달

IN OUT : 호출하는 곳에서 함수 or 프로시저로 값을 전달하고 동시에 함수 or

프로시저에서 호출한 곳으로 값을 전달하는 변수.


<기본형식>

CREATE [OR REPLACE] PROCEDURE procedure_name [parameters]

IS[or AS] 

    declaration_section 

BEGIN 

    execution_section

EXCEPTION 

    exception section 

END [procedure_name]; 

/


  • procedure_name : 생성하고자 하는 프로시저의 이름.

  • parameters: 프로시저에 전달할 파라미터 목록.

  • declaration_section : 변수나 커서, 타입등을 선언 하는 영역

  • execution_section : 실제 비지니스 로직처리, PL/SQL 제어문, 반복문, DML등

  • exception_section : 오류가 발생했을 때의 처리.

  • / : SQL*Plus에서 실행기호. SQL*Plus에서 함수를 생성하는 경우에는 반드시 기술해야 합니다. SQL*Developer에서 실행시에는 생략 가능.



저장 프로시저를 만들고 호출하는 실습을 해보겠습니다.

15.3.1. 저장 프로시저 작성 실습 : CREATE OR REPLACE PROCEDURE


EMP 테이블에서 사번을 인자로 입력받아 해당 사원의 이름을 출력하는 저장 프로시저를 P_PRINT_ENAME 이라는 이름으로 작성하세요.


SET SERVEROUTPUT ON;


-- 이미 P_PRINT_ENAME 프로시저가 있다면 대체 합니다.

-- 프로시저를 호출할 때는 숫자형으로 사번을 던져줘야 합니다.

CREATE OR REPLACE  PROCEDURE P_PRINT_ENAME(P_EMPNO  IN  NUMBER) 

IS        

   /* IS ~ BEGIN 사이는 이름없는 블럭을 만들때의 DECLARE ~ BEGIN과 

   동일하게 변수를 선언하는 선언부 입니다.

   V_EANE 변수는 EMP 테이블의 ENAME과 타입이 같습니다. */

   V_ENAME  EMP.ENAME%TYPE;

BEGIN


      /* BEGIN ~ END 사이의 SELECT절은 반드시 한건만 SELECT 되야 하며 

      INTO절이 반드시 필요합니다.

      WHERE절의 사원이 없다면 EXCEPTION절의 

      WHEN NO_DATA_FOUND THEN 절로 이동합니다. */

      SELECT   ENAME

      INTO     V_ENAME

      FROM     EMP

      WHERE    EMPNO  =  P_EMPNO;

      

      -- V_ENAME 변수값을 출력 합니다.

      DBMS_OUTPUT.PUT_LINE(V_ENAME);


-- 예외처리 절 입니다.

EXCEPTION


      /* NO_DATA_FOUND는 PL/SQL에 사전에 정의되어 있는 예외 입니다.             

      ORA-01403 오류 코드이며  SELECT시 데이터를 찾을 수 없을때 발생하는 예외 입니다. 

      WHEN 절에서 일일이 예외를 처리하기가 번거러우면  

      모든 예외를 다 처리할 수 있는 WHEN OTHERS THEN만 사용해도 무방 합니다. */

      WHEN NO_DATA_FOUND THEN

         DBMS_OUTPUT.PUT_LINE(P_EMPNO || ' 사원은 없습니다.');   

      WHEN OTHERS THEN

         -- 기타 오류인 경우 SQL 에러코드와 에러 메시지를 출력 합니다.

         DBMS_OUTPUT.PUT_LINE(SQLCODE || ':' || SQLERRM);

END P_PRINT_ENAME;


<실행결과>

Procedure P_PRINT_ENAME이(가) 컴파일되었습니다.


앞에서 작성한 P_PRINT_ENAME 프로시저를 사번을 파라미터로 주면서 호출해 보겠습니다.


EXEC P_PRINT_ENAME(7369);


<실행결과>

SMITH



존재하지 않는 사번을 파라미터로 해서 호출해 보겠습니다.


EXEC P_PRINT_ENAME(1111);


<실행결과>

1111 사원은 없습니다.



존재하지 않는 사번을 입력하니  WHEN NO_DATA_FOUND THEN절이 호출되는 것을 확인할 수 있습니다.



15.3.2. 저장 프로시저 OUT 파라미터 실습 : CREATE OR REPLACE PROCEDURE


저장 프로시저를 호출한 곳으로 값을 넘기기 위해서는 파라미터 타입을 OUT 으로 선언해야 합니다. 저장 프로시저의 파라미터를 사번(IN), 급여(OUT) 2개로 정의하고 사번은 IN 파라미터로 호출하는 곳에서 프로시저로 전달하고 급여는 OUT 파라미터로 해서 프로시저에서 호출한 곳으로 전달하는 예제를 작성하겠습니다.


SET SERVEROUTPUT ON;

-- P_EMPNO는 프로시저를 호출하는 곳에서 넣어 주는 파라미터

-- P_SAL은 프로시저에서 호출한 쪽으로 넘기는 파라미터

CREATE OR REPLACE PROCEDURE P_GET_SAL(P_EMPNO IN NUMBER, P_SAL OUT NUMBER)

IS

BEGIN

   -- 인자로 받은 사번을 WHERE절에서 조건으로 비교하여 급여(SAL)를 

   -- SELECT하여 OUT 파라미터인 P_SAL 변수에 담습니다.

   -- 담기만 하면 이 값은 외부에서 참조 가능 합니다.

   SELECT SAL 

   INTO   P_SAL FROM EMP

   WHERE  EMPNO = P_EMPNO;

EXCEPTION

   WHEN OTHERS THEN

      -- 기타 오류인 경우 에러 메시지를 출력 합니다.

      DBMS_OUTPUT.PUT_LINE(SQLERRM);

      P_SAL := 0;

END P_GET_SAL;


<실행결과>

Procedure P_GET_SAL이(가) 컴파일되었습니다.



앞에서 작성한 P_GET_SAL 프로시저를 사번, 급여를 파라미터로 주면서 호출해 보겠습니다.


VARIABLE SAL NUMBER;           ❶

EXEC P_GET_SAL(7369, :SAL); ❷

PRINT SAL;                                  ❸


<실행결과>

  SAL

----------

  800


❶ NUMBER형 변수 SAL을 선언 합니다.

❷P_GET_SAL 프로시저를 호출하면서 IN 파라미터인 사번(7369)과 OUT 파라미터인 SAL을 넘깁니다. 외부에서 선언한 SAL 변수는 호스트 변수라고 하며 앞에 콜론(:)표시를 해야 합니다.

❸ 프로시저가 실행이 되고 나면 SAL 변수에 값이 들어 있으므로 PRINT문으로 출력 합니다.

VARIABLE, EXEC, PRINT등은 SQL문이 아닌 SQL*PLUS 명령어로 SQL*PLUS 실행환경에서 사용가능 합니다. 물론 SQL*DEVELOPER에서도 사용 가능 합니다. 



앞에서 작성한 P_GET_SAL 프로시저를 존재하지 않는 사번, 급여를 파라미터로 주면서 호출해 보겠습니다.


SET SERVEROUTPUT ON;         ❶

VARIABLE SAL NUMBER;           ❷

EXEC P_GET_SAL(1111, :SAL);  ❸

PRINT SAL;                                  ❹


<실행결과>

ORA-01403: 데이터를 찾을 수 없습니다.

  SAL

----------

      0


❶ DBMS_OUTPUT.PUT_LINE 출력을 활성화 합니다.

❷ NUMBER형 변수 SAL을 선언 합니다.

❸ P_GET_SAL 프로시저를 호출하면서 IN 파라미터인 존재하지 않는 사번(1111)과 OUT 파라미터인 SAL을 넘깁니다. 외부에서 선언한 SAL 변수는 호스트 변수라고 하며 앞에 콜론(:)표시를 해야 합니다. 1111 사번은 존재하지 않으므로 WHEN OTHERS THEN절이 실행되어 “ORA-01403: 데이터를 찾을 수 없습니다.” 라는 오류 메시지를 출력 후 P_SAL 변수에 0을 대입하여 호출한 곳에서 참조할 수 있도록 합니다.

❹ 프로시저가 실행이 되고 나면 SAL 변수에 0이 들어 있으므로 PRINT문으로 출력 합니다.

 

 

학사관리 시스템을 샘플로 ERD 작성 및 기본쿼리, 조인등 실습 영상1

 


원본 : http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=652


학사관리 시스템을 샘플로 ERD 작성 및 기본쿼리, 조인등 실습 영상1 

- 학사관리 SQL 실습영상1, Oracle, SqlDeveloper를 기준으로 학사관리 시스템을 샘플로 ERD 작성 및 조인, 서브쿼리 실습 영상 첫번째 입니다. 

학사관리 시스템을 샘플로 ERD 작성 및 기본쿼리, 조인등 실습 영상2


https://youtu.be/PlYiF3aG1hY


원본: http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=653


학사관리 시스템을 샘플로 ERD 작성 및 기본쿼리, 조인등 실습 영상2 

 

학사관리 SQL 실습영상2, Oracle, SqlDeveloper를 기준으로 학사관리 시스템을 샘플로 ERD 작성 및 조인, 서브쿼리 실습 영상 두번째 입니다. 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...