introduction - duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_package.pdf · 2005-02-26 ·...

38
오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 www.muhanedu.net ORACLE PACKAGE INTRODUCTION 프로그램 단위 하나인 패키지는 특정 처리를 위해 관련된 PL/SQL 블록들이 리적으로 하나의 그룹을 이루는 특수한 형태이다. 이때 PL/SQL 블록들은 프로시저 또는 함수가 있으며, 또한 패키지는 오라클에서 제공하는 PL/SQL 데이터 , 복합 유형 등을 포함하기도 한다. 패키지는 부분으로 구성된다. 하나는 패키지 기술부(Package Specification)이며, 다른 하나는 패키지 몸체부 (Package Body)이다. 개의 구성이 하나의 패키지를 이루게 된다. 패키지 기술부의 역할은 패키지를 통해 접근(public )있는 프로시저, 함수, 변수 대한 프로토타입(Prototype)선언하는 것이다. 패키지 기술부는 인터페이 스가 되는 것이다. 부분을 통해 패키지에 대한 전체적인 정보를 얻게 된다. 렇게 선언된 프로시저와 함수는 패키지 몸체에서 실제 처리되는 절차적인 부분이 정의된다. 물론 패키지 기술부에 선언되지 않은 별개의 변수나 프로시저들이 지역 적인(private ) 의미로 패키지 몸체부에 정의될 있다. 패키지 몸체부에 있는 로시저나 함수들은 패키지 기술부에 선언된 변수나 예외 등에 접근할 있다. 패키지를 개발할 때는 우선 패키지 기술부를 먼저 생성하고, 해당 패키지 몸체부를 생성한다. 생성된 패키지의 구성 요소(멤버)접근할 때에는 패키지명을 접두어로 기술해야 한다. 만약, 생성된 패키지를 변경하는 경우, 패키지 기술부가 변경되었다면 무조건 패키 몸체부는 다시 생성해야 하며 패키지를 참조(호출)하는 서브 프로그램들도 재번역(recompile)해야 한다. 이에 반하여 패키지 몸체부는 변경되면 패키지 기술 부와 관련 서브프로그램에 영향을 주지 않고 몸체부만 생성될 있다. 이는 키지를 참조 또는 접근하는 오브젝트에게 영향을 주지 않는다(부분 오브젝트 종속성 대한 자세한 사항은 마지막 장에서 설명하기로 한다.). PL/SQL 블록은 데이터베이스에 오브젝트로서 저장될 있는데, 이를 서브프로그램 또는 프로그램 단위라 부르며, 유형은 프로시저(Procedure), 함수(Function), 패키지(Package), 트리거(Trigger)있다 패키지의 기술부에 선언된 것들은 모두 접근 유형이 PUBLIC 으로 외부의 프로그램 또는 다른 사용자로부터 접근(호출) 가능하다는 것이다. 패키지의 몸체부에 정의된 것들, 기술부에 선언된 이외의 것들의 접근 유형은 PRIVATE 외부에서 접근될 . 그러나 몸체부 내부의 다른 요소로부터는 접근이 가능하다.

Upload: others

Post on 07-Aug-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 1 www.muhanedu.net

ORACLE PACKAGE

INTRODUCTION

프로그램 단위1의 하나인 패키지는 특정 처리를 위해 관련된 PL/SQL 블록들이 논

리적으로 하나의 그룹을 이루는 특수한 형태이다. 이때 PL/SQL 블록들은 프로시저

또는 함수가 될 수 있으며, 또한 패키지는 오라클에서 제공하는 PL/SQL 데이터 유

형, 복합 유형 등을 포함하기도 한다.

패키지는 두 부분으로 구성된다.

하나는 패키지 기술부(Package Specification)이며, 다른 하나는 패키지 몸체부

(Package Body)이다. 이 두 개의 구성이 하나의 패키지를 이루게 된다. 패키지

기술부의 역할은 패키지를 통해 접근(public2)될 수 있는 프로시저, 함수, 변수 등

에 대한 프로토타입(Prototype)을 선언하는 것이다. 즉 패키지 기술부는 인터페이

스가 되는 것이다. 이 부분을 통해 패키지에 대한 전체적인 정보를 얻게 된다. 이

렇게 선언된 프로시저와 함수는 패키지 몸체에서 실제 처리되는 절차적인 부분이

정의된다. 물론 패키지 기술부에 선언되지 않은 별개의 변수나 프로시저들이 지역

적인(private3) 의미로 패키지 몸체부에 정의될 수 있다. 패키지 몸체부에 있는 프

로시저나 함수들은 패키지 기술부에 선언된 변수나 예외 등에 접근할 수 있다.

패키지를 개발할 때는 우선 패키지 기술부를 먼저 생성하고, 해당 패키지 몸체부를

생성한다. 생성된 패키지의 구성 요소(멤버)에 접근할 때에는 패키지명을 접두어로

기술해야 한다.

만약, 생성된 패키지를 변경하는 경우, 패키지 기술부가 변경되었다면 무조건 패키

지 몸체부는 다시 재 생성해야 하며 패키지를 참조(호출)하는 서브 프로그램들도

재번역(recompile)해야 한다. 이에 반하여 패키지 몸체부는 변경되면 패키지 기술

부와 관련 서브프로그램에 영향을 주지 않고 몸체부만 재 생성될 수 있다. 이는 패

키지를 참조 또는 접근하는 오브젝트에게 영향을 주지 않는다(이 부분 – 오브젝트

종속성 – 에 대한 자세한 사항은 마지막 장에서 설명하기로 한다.).

1 PL/SQL블록은 데이터베이스에 오브젝트로서 저장될 수 있는데, 이를 서브프로그램 또는 프로그램 단위라 부르며, 그 유형은 프로시저(Procedure), 함수(Function), 패키지(Package), 트리거(Trigger)가 있다 2 패키지의 기술부에 선언된 것들은 모두 접근 유형이 PUBLIC으로 외부의 프로그램 또는 다른 사용자로부터 접근(호출)이 가능하다는 것이다. 3 패키지의 몸체부에 정의된 것들, 즉 기술부에 선언된 것 이외의 것들의 접근 유형은 PRIVATE로 외부에서 접근될 수 없다. 그러나 몸체부 내부의 다른 요소로부터는 접근이 가능하다.

Page 2: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 2 www.muhanedu.net

자, 그렇다면 왜 패키지를 사용하는가? 주된 이유(장점)는 여러 가지가 있는데,

첫째는 처음으로 패키지내의 한 구성요소(변수, 프로시저, 함수 …)가 호출될 당시

패키지 전체가 메모리에 적재(load)되므로 이후의 패키지 접근은 스토리지(디스크)

에 대한 입출력 없이도 빠르게 수행될 수 있으므로 성능 측면에서 보면 좋은 성능

향상을 얻게 되는 장점이며,

둘째는 전역변수(Global Variable)를 선언할 수 있다는 것이다. 이는 패키지 기술

부에 변수를 선언함으로써 가능한데, 세션내에서 세션레벨의 전역변수로서 참조될

수 있다.

셋째는 패키지 관련 서브 프로그램들이 하나의 그룹을 이루게 되므로, 유지관리가

매우 효율적이라는 것이다.

넷째는 서브프로그램(프로시저, 함수)의 오버로딩(Overloading1 )기능을 제공한다

는 것이다. 이는 단독(Stand-alone) 서브프로그램에서는 불가능하다. 이 오버로딩

(overloading)은 형식매개변수의 특정 데이터 유형 또는 개수에 제약을 가지지 않

으므로, 사용자에게도 응용프로그램 개발에도 한층 더 진보된 유연성(flexibility)을

제공한다. 제약사항이 있다면 형식 매개변수의 데이터 유형이 서로 비슷한 계열

(same family)에 속할 경우 오버로딩을 할 수 없다는 것과 함수의 오버로딩에서는

리턴 유형이 다른 계열에 속한다 해도 불가능하다. 즉 리턴 유형은 동일해야 한다

는 것이다. 오버로딩된 서브프로그램이 실행될 때는 오라클이 자동적으로 가장 적

절한 서브프로그램으로 처리하도록 해준다.

다섯째는 데이터의 은닉(Encapsulation, Hiding Information)으로, 패키지에 대한

접근(public, private)을 제한하고, 패키지 몸체부에 대한 암호화를 통해 보안을 가

능하게 한다.

* 참고 :

오 라클 은 기본 적으 로 제공 하는 프 로 시저, 함수 , 패키지들 이 많이 있다. 이는 오 라클 의

사용 자로 하여금 편리하고 효 율 적인 데이터베이스 처리를 도 와주 기 위함이다. 여기에

더불 어 오 라클 은 사용 자 정의 서브 프 로 그 램을 개발하여 사용 할 수 있도 록 PL/SQL 도

제공 함으 로 써 다양한 비즈 니스 규 칙을 구 현할 수 있는 기능 도 제공 한다.

1 이 기능은 여러 프로그래밍 언어에서 제공되는 것으로, 오라클의 패키지에서도 가능하다. 오버로딩은 동일한 이름의 프로시저 또는 함수를 패키지 내에 여러 개 정의할 수 있는 것으로 형식 매개변수의 개수, 순서, 데이터 유형이 다르게 정의된다. 이는 동일한 처리를 하되 다양한 데이터를 처리를 위해서 아주 유용한 개념이다.

Page 3: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 3 www.muhanedu.net

PACKAGE Structure

패키지는 두 부분으로 나누어지는데, 하나는 패키지 기술부(Specification) 다른 하

나는 패키지 몸체부(Body) 로 구성된다. 패키지 기술부에 선언된 것들은 모두 접

근유형이 public(Global) 의 의미를 가진다.

>> 패키지의 구성과 접근(참조)

QUIZ:

위의 그림에서 ① public variable 의 사용 범위는 ?

⑤ 번에서 접근 가능한 것을 모두 선택한다면 ?

Package

Specification

Package

Body

① Public Variable

② Public Procedure

④ Private Procedure

③ Private Variable

⑥ Local Variable

② Procedure ANGELA ; --선언

④ Procedure WIN ; --정의

⑤ Procedure ANGELA ; --정의

⑤ Public Procedure

Page 4: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 4 www.muhanedu.net

패키지 기술부(Package Specification) 생성

> SYNTAX:

CREATE [OR REPLACE] PACKAGE package_name

IS | AS

Public type and item declarations

Subprogram specifications

END package_name ;

OR REPLACE 생성하고자 하는 패키지가 기존에 동일명으로

존재할 경우, 기존의 내용을 현재의 내용으로 수

정하는 옵션.(만약 기존에 존재하지 않는다면 큰

의미는 없다.)

Package_name 생성하고자 하는 패키지명으로 스키마내에서는

유일한 이름이어야 한다. 패키지 기술부와 패키

지 몸체부의 패키지명이 동일해야만 한다.

Public type and item declarations

변수, 상수, 명시적 커서, 사용자 정의 예외,

PRAGMA 등을 선언한다. 이들은 PUBLIC 의 의

미를 지닌다.

Subprogram specifications

PL/SQL 서브 프로그램을 선언한다. 선언할 때에

는 형식매개변수를 포함한 헤더만을 기술한다.

> EX:

CREATE OR REPLACE PACKAGE comm_pack IS

g_comm NUMBER := 0.1 ; -- 0.1 로 초기화

PROCEDURE reset_comm ( p_com IN NUMBER) ;

END comm_pack ;

Page 5: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 5 www.muhanedu.net

패키지 몸체부(Package Body) 생성

> SYNTAX:

CREATE [OR REPLACE] PACKAGE BODY package_name

IS | AS

Private type and item declarations

Subprogram bodies

END package_name ;

OR REPLACE 생성하고자 하는 패키지가 기존에 동일명으로

존재할 경우, 기존의 내용을 현재의 내용으로 수

정하는 옵션.(만약 기존에 존재하지 않는다면 큰

의미는 없다.)

Package_name 생성하고자 하는 패키지명으로 스키마내에서는

유일한 이름이어야 한다. 패키지 기술부와 패키

지 몸체부의 패키지명이 동일해야만 한다.

Private type and item declarations

변수, 상수, 명시적 커서, 사용자 정의 예외,

PRAGMA 등을 선언한다. 이들은 지역적인 의미

를 지닌다.

Subprogram bodies

패키지 기술부에서 선언한 PUBLIC 서브프로그램

이든, 지역적으로 선언된 PRIVATE 서브프로그램

이든 실제 처리내용(몸체)을 기술한다. 단 주의

해야 할 사항은 서브프로그램의 순서이다. 기본

적으로 참조되는 변수든 서브프로그램이든 참조

하는 서브프로그램보다는 먼저 정의되어야 한다.

보통 PUBLIC 의 서브프로그램은 마지막 부분에

정의된다.

Page 6: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 6 www.muhanedu.net

> EX:

CREATE OR REPLACE PACKAGE BODY comm_pack

IS

FUNCTION validate_comm (p_comm IN NUMBER)

RETURN BOOLEAN

IS

v_max_comm NUMBER ;

BEGIN

SELECT MAX(comm.)

INTO v_max_comm

FROM EMP ;

IF p_comm > v_max_comm THEN

RETURN(FALSE) ;

ELSE

RETURN(TRUE) ;

END IF ;

END validate_comm ;

PRCEDURE reset_comm(p_comm IN NUMBER)

IS

BEGIN

IF validate_comm(p_comm) THEN

g_comm := p_comm ;

ELSE

RAISE_APPLICATION_ERROR (-20100, ‘Invalid Commission’) ;

END IF ;

END reset_comm ;

END comm_pack ;

Page 7: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 7 www.muhanedu.net

패키지 호출(실행)

다양한 환경에서 패키지는 호출되어 실행된다. 단, 생성된 패키지 오브젝트에 대한

실행권한을 가진 사용자만이 패키지를 호출하여 실행할 수 있다.

기본적으로 패키지 몸체부에서 정의된 validate_comm 함수(private)는 몸체부내

에서는 참조가 가능하다. 물론 외부에서는 접근이 불가능하다. 호출할 때는 함수이

므로 수식의 일부로 호출하여 실행한다.

위에서 생성한 comm_pack 패키지를 iSQL*Plus에서 호출하려면,

EXECUTE comm_pack.reset_comm(0.15)

만약 위의 패키지가 SCOTT 스키마 오브젝트라 가정하고, 이 패키지에 대한 실행권

한을 DEMO 사용자에게 부여했다면, DEMO 세션에서 패키지를 실행하려면,

EXECUTE scott.comm_pack.reset_comm(0.15)

원격에 있는 데이터베이스에서 패키지를 호출하려면,

EXECUTE comm_pack.reset_comm@ANYWARE(0.15)

패키지 삭제

패키지를 삭제할 때에는 패키지 기술부와 패키지 몸체부를 모두 삭제한다.

DROP PACKAGE package_name ;

패키지 몸체부만을 삭제할 수도 있다.

DROP PACKAGE BODY package_name ;

Page 8: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 8 www.muhanedu.net

ORACLE- Supplied PACKAGE

오라클 서버는 다수의 유용한 패키지들을 제공하는데, 이 패키지들은 데이터베이스

에 대한 기능을 확장할 뿐만 아니라 더불어 사용자로 하여금 데이터베이스에 대한

접근/처리를 간단하게 그리고 편리하게 할 수 있도록 도와준다. 일반적으로 제공되

는 표준 패키지들은 catproc.sql 을 실행함으로써 생성된다.

>> ORACLE – Supplied Packages

Built-in name Description

CALENDAR Provides calendar maintenance functions.

DBMS_ALERT Supports asynchronous notification of database events. Messages or alerts are sent on a COMMIT command. Message transmittal is one way, but one sender can alert several receivers.

DBMS_APPLICATION_INFO Is used to register an application name with the database for auditing or performance tracking purpose.

DBMS_AQ Provides message queuing as part of the Oracle server, is used to add a message(of a predefined object type) onto a queue or dequeue a message.

DBMS_AQADM Is used to perform administrative functions on a queue or queue table for messages of a predefined object type

DBMS_DDL Is used to embed the equivalent of the SQL commands ALTER, COMPILE, and ANALYZE within your PL/SQL programs

DBMS_DEBUG A PL/SQL API to the PL/SQL debugger layer, Probe, in the Oracle server

DBMS_DEFER DBMS_DEFER_QUERY DBMS_DEFER_SYS

Is used to build and administer deferred remote procedure calls(use of this feature requires the Replication Option)

Page 9: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 9 www.muhanedu.net

Built-in name Description

DBMS_DESCRIBE Is used to describe the arguments of a stored procedure

DBMS_DISTRIBUTED_TRUST_ADMIN Is used to maintain the Trusted Servers list, which is used in conjunction with the list at the central authority to determine whether a privileged database link from a particular server can be accepted.

DBMS_HS Is used to administer heterogeneous services by registering or dropping distributed external procedures, remote libraries, and non-Oracle systems(you use dbms_hs to create or drop some initialization variables for non-Oracle systems)

DBMS_HS_EXTPROC Enables heterogeneous services to establish security for distributed external procedures

DBMS_HS_PASSTHROUGH Enables heterogeneous services to send pass-through SQL statements to non-Oracle systems

DBMS_IOT Is used to schedule administrative procedures that you want performed at periodic interval; is also the interface for the job queue

DBMS_JOB Is used to schedule administrative procedures that you what performed at periodic intervals.

DBMS_LOB Provides general purpose routines for operations on Oracle large objects(LOBs) data types; BLOB, CLOB and BFILES(read-only)

DBMS_LOCK Is used to request, convert, and release locks through Oracle Lock Management services.

DBMS_LOGMNR Provides functions to initialize and run the log reader

DBMS_LOGMNR_D Queries the dictionary tales of the current database, and creates a text base file containing their contents

Page 10: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 10 www.muhanedu.net

Built-in name Description

DBMS_OFFLINE_OG Provides public APIs for offline instantiation of master groups

DBMS_OFFLINE_SNAPSHOT Provides public APIs for offline instantiation of snapshots

DBMS_OLAP Provides procedures for summaries, dimensions, and query rewrites

DBMS_ORACLE_TRACE_AGENT Provides client callable interfaces to the Oracle TRACE instrumentation within the Oracle7 server

DBMS_ORACLE_TRACE_USER Provides public access to the Oracle7 release server Oracle TRACE instrumentation for the calling user

DBMS_OUTPUT Accumulates information in a buffer so that it can be retrieved out later

DBMS_PCLXUTIL Provides intrapartition parallelism for creating partition-wise local indexes

DBMS_PIPE Provides a DBMS pipe service that enables message to be sent between sessions

DBMS_PROFILER Provides a Probe Profiler API to profile existing PL/SQL applications and identify performance bottlenecks

DBMS_RANDOM Provides a built-in random number generator

DBMS_RECTIFIER_DIFF Provides APIs used to detect and resolve data inconsistencies between two replicated sites

DBMS_REFRESH Is used to create groups of snapshots that can be refreshed together to a transactionally consistent point in time; requires the Distributed option

DBMS_REPAIR Provides data corruption repair procedures

DBMS_REPCAT Provides routines to administer and update the replication catalog and environment; requires the Replication option

Page 11: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 11 www.muhanedu.net

Built-in name Description

DBMS_REPCAT_ADMIN Is used to create users with the privileges needed by the symmetric replication facility; requires the Replication option

DBMS_REPCAT_INSTANTIATE Instantiate deployment templates; requires the Replication option

DBMS_REPCAT_RGT Controls the maintenance and definition of refresh group templates; requires the Replication option

DBMS_REPUTIL Provides routines to generate shadow tables, triggers, and packages for table replication

DBMS_RESOURCE_MANAGER Maintains plans, consumer groups, and plan directives; it also provides semantics so that you may group together changes to the plan schema

DBMS_RESOURCE_MANAGER_PRIVS Maintains privileges associated with resource consumer groups

DBMS_RLS Provides row-level security administrative interface

DBMS_ROWID Is used to get information about ROWIDs, including the data block number, the object number, and other componets

DBMS_SESSION Enables programmatic use of the SQL ALTER SESSION statement as well as other session-level commands

DBMS_SHARED_POOL Is used to keep objects in shared memory, so that they are not aged out with the normal LRU mechanism

DBMS_SNAPSHOT Is used to refresh one or more snapshots that are not part of the same refresh group and purge logs; use of this feature requires the Distributed option

DBMS_SPACE Provides segment space information not available through standard views

Page 12: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 12 www.muhanedu.net

Built-in name Description

DBMS_SPACE_ADMIN Provides tablespace and segment space administration not available through standard SQL

DBMS_SQL Is used to write stored procedure and anonymous PL/SQL blocks using dynamic SQL; also used to parse and DML or DDL statement

DBMS_STANDARD Provides language facilities that help your application interact with the Oracle server

DBMS_STATS Provides a mechanism for users to view and modify optimizer statistics gathered for database objects

DBMS_TRACE Provides routines to start and stop PL/SQL tracing

DBMS_TRANSACTION Provides procedures for a programmatic interface to transaction management

DBMS_TTS Checks whether if the transportable set is self-contained

DBMS_UTILITY Provides functionally for managing procedures, reporting errors, and other information

DBMS_EXTPROC Is used to debug external procedures on platforms with debuggers that can attach to a running process

DBMS_PKG Provides the interface for procedures and functions associated with management of stored outlines

PLITBLM Handles index-table operations

SDO_ADMIN Provides functions implementing spatial index creation and maintenance for spatial objects

SDO_GEOM Provides functions implementing geometric operations on spatial objects

Page 13: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 13 www.muhanedu.net

Built-in name Description

SDO_MIGRATE Provides functions for migrating spatial data from release 7.3.3 and 7.3.4 to 8.1.x

SDO_TUNE Provides functions for selecting parameters that determine the behavior of the spatial indexing schema used in the Spatial Cartridge

STANDARD Declares types, exception, and subprograms that are available automatically to every PL/SQL program

TIMESERIES Provides functions that perform operations, such as extraction, retrieval, arithmetic, and aggregation, on time series data

TIMESCALE Provides scale-up and scale-down functions

TSTOOLS Provides administrative tools procedures

UTL_COLL Enables PL/SQL programs to use collection locators to query and update

UTL_FILE Enables your PL/SQL programs to read and write operating system(OS) text files and provides a restricted version of standard OS stream file I/O

UTL_HTTP Enables HTTP callouts from PL/SQL and SQL to access data on the Internet or to call Oracle Web Server Catridges

UTL_PG Provides functions for converting COBOL numeric data into Oracle numbers and Oracle numbers into COBOL numeric data

UTL_RAW Provides SQL functions for RAW data types that concatenate, obtain substring, and so on, to and from RAW data types

Page 14: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 14 www.muhanedu.net

Built-in name Description

UTL_REF Enables a PL/SQL program to access an object by providing a reference to the object

VIR_PKG Provides analytical and conversion functions for visual information retreival

* 는 뒷부분의 실습을 통해 이해를 돕는 패키지을 표시한 것임.

Page 15: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 15 www.muhanedu.net

실습 – ORACLE PACKAGE

1. [ PACKAGE – I ]

전역변수만을 가지는 GLOBAL_CONST 패키지.

CREATE OR REPLACE PACKAGE global_const

IS

mile_to_kilo CONSTANT NUMBER := 1.6093 ;

kilo_to_mile CONSTANT NUMBER := 0.6214;

yard_to_meter CONSTANT NUMBER := 0.9144 ;

meter_to_yard CONSTANT NUMBER := 1.0936 ;

END global_const ;

/

Page 16: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 16 www.muhanedu.net

Hint :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행하기 위한 예제.

SQL> EXECUTE DBMS_OUTPUT.PUT_LINE(’20 miles = ‘ || 20 * global_const.mile_to_kilo || ‘ km ‘)

Stand-alone 프로시저에서 생성된 패키지를 호출하는 예제.

(p0601_run.sql 로 저장하여 실습)

CREATE OR REPLACE PROCEDURE meter_to_yard

(p_meter IN NUMBER, p_yard OUT NUMBER)

IS

BEGIN

p_yard := p_meter * global_const.meter_to_yard ; END meter_to_yard ; /

VARIABLE yard NUMBER

EXECUTE meter_to_yard(1, :yard) ; PRINT yard

Point :

위의 global_const 패키지는 전역상수를 사용하기 위한 것으로, 패키지 몸체부

를 필요로 하지 않는다. 다시 말해서 패키지는 기술부만으로도 생성이 가능하다.

Page 17: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 17 www.muhanedu.net

2. [ PACKAGE – II : OVERLOADING ]

ADD_DEPT 프로시저에 대한 오버로딩을 가지는 OVERLOAD_PACK 패키지.

CREATE OR REPLACE PACKAGE overload_pack IS PROCEDURE add_dept (p_deptno IN dept.deptno%type, p_name IN dept.dname%type DEFAULT ‘unknown’, p_loc IN dept.loc%type DEFAULT 0) ;

PROCEDURE add_dept (p_name IN dept.dname%type DEFAULT ‘unknown’, p_loc IN dept.loc%type DEFAULT 0) ; END overload_pack;

/

CREATE OR REPLACE PACKAGE BODY overload_pack IS PROCEDURE add_dept

(p_deptno IN dept.deptno%type, p_name IN dept.dname%type DEFAULT ‘unknown’, p_loc IN dept.loc%type DEFAULT 0) IS BEGIN INSERT INTO DEPT VALUES(p_deptno, p_name, p_loc) ; END add_dept ;

PROCEDURE add_dept (p_name IN dept.dname%type DEFAULT ‘unknown’, p_loc IN dept.loc%type DEFAULT 0) IS BEGIN INSERT INTO DEPT VALUES(dno_seq.nextval, p_name, p_loc) ; END add_dept ; END overload_pack ;

/

Page 18: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 18 www.muhanedu.net

힌트 :

생성된 프로시저를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제

EXECUTE overload_pack.add_dept(45, ‘AnyWare’, ‘Seoul’)

EXECUTE overload_pack.add_dept(‘Marketing’, ‘DaeJeon’)

SELECT * FROM DEPT ;

Page 19: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 19 www.muhanedu.net

3. [ PACKAGE –III : PACKAGE 초기화 ]

패키지가 실행될 때, 패키지 레벨에서 단 한번의 초기화를 하는 INITIAL_PACK 패키지.

CREATE OR REPLACE PACKAGE initial_pack IS g_max_bonus NUMBER ; FUNCTION bonus (p_bonus IN NUMBER) RETRUN NUMBER ; END initial_pack;

/

CREATE OR REPLACE PACKAGE BODY initial_pack IS v_rate NUMBER := 1.5 ; FUNCTION bonus (p_bonus IN NUMBER) RETRUN NUMBER IS BEGIN RETURN (p_bonus * v_rate) ; END bonus ;

BEGIN SELECT max(SAL) * v_rate INTO g_max_bonus FROM EMP ; END initial_pack ;

/

Page 20: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 20 www.muhanedu.net

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

EXECUTE DBMS_OUTPUT.PUT_LINE(initial_pack.g_max_bonus)

SQL 문장에서 패키지를 실행/확인하는 예제.

> SELECT ENAME, SAL, initial_pack.bonus(sal), initial_pack.g_max_bonus

FROM EMP ;

포인트 :

복잡한 처리를 통한 전역변수 초기화의 경우 패키지 기술부에서는 불가능하지만, 패키지 레벨에서의 초기화(패키지 몸체부에서의 BEGIN 부분)를 사용하면 된다.

Page 21: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 21 www.muhanedu.net

4. [ PACKAGE –IV : 전역 변수의 Scope Rule ]

COMM_PACK패키지의 전역변수 G_COMM의 Scope Rule을 이해하는 예제

09:00

09:30

09:35

10:00

10:30

10:35

13:00

13:10

-- (가정) G_COMM의 초기값은 0.1, -- V_MAX_COMM 초기값은 0.4

EXEC comm_pack.reset_comm(0.25)

EXEC comm_pack.reset_comm(0.6)

INSERT INTO EMP(EMPNO, COMM) VALUES (9000, 0.8) ;

EXEC comm_pack.reset_comm(0.5)

ROLLBACK ;

EXIT

로그인 시

EXEC comm_pack.reset_comm(0.25)

V_MAX_COMM = 0.4 > 0.25

G_COMM = 0.25

V_MAX_COMM = 0.8

V_MAX_COMM = 0.8 > 0.5

G_COMM = 0.5

V_MAX_COMM = 0.4 > 0.6

ORA-20100:Invalid commission

V_MAX_COMM = 0.4

G_COMM = 0.1

Page 22: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 22 www.muhanedu.net

포인트 :

기본적으로 각 세션은 세션레벨에서의 전역변수를 참조할 수 있으며, 새로운 세션이 시작되면서 패키지에 접근이 이루어지면 전역변수는 초기화가 된다.

Page 23: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 23 www.muhanedu.net

5. [ PACKAGE –V : 전역 커서의 Scope Rule]

전역커서의 Scope Rule을 이해하기 위한 cursor_pack 패키지.

CREATE OR REPLACE PACKAGE cursor_pack IS CURSOR cur1 IS SELECT empno FROM emp ORDER BY empno DESC ; PROCEDURE rows_01_03 ; PROCEDURE rows_04_06 ; END cursor_pack;

/

CREATE OR REPLACE PACKAGE BODY cursor_pack IS v_empno ; PROCEDURE rows_01_03 IS BEGIN OPEN cur1 ; LOOP FETCH cur1 INTO v_empno ; DBMS_OUTPUT.PUT_LINE(‘ID : ’ || v_empno) ; EXIT WHEN cur1%rowcount >= 3 ; END LOOP; END rows_01_03 ;

PROCEDURE rows_04_06 IS BEGIN LOOP FETCH cur1 INTO v_empno ; DBMS_OUTPUT.PUT_LINE(‘ID : ‘ || v_empno) ; EXIT WHEN cur1%rowcount >= 6 ; END LOOP; CLOSE cur1 ; END rows_04_06 ; END cursor_pack ;

/

Page 24: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 24 www.muhanedu.net

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

SET SERVEROUTPUT ON

EXECUTE cursor_pack.rows01_03 ;

EXECUTE cursor_pack.rows04_06 ;

포인트 :

전역커서도 전역변수와 마찬가지로 세션레벨에서는 언제라도 어디에서라도 참조가 가능하다.

Page 25: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 25 www.muhanedu.net

6. [ PACKAGE – VI : 전역 데이터 유형의 참조 ]

복합변수형을 전역적으로 선언했을 때 참조되는 경우를 이해하기 위한 예제.

CREATE OR REPLACE PACKAGE type_pack IS TYPE emp_tab_type IS TABLE OF emp%rowtype INDEX BY BINARY_INTEGER ; PROCEDURE read_emp_tab ( p_emp_tab OUT emp_tab_type ) ;

END type_pack; /

CREATE OR REPLACE PACKAGE BODY type_pack IS PROCEDURE read_emp_tab ( p_emp_tab OUT emp_tab_type ) IS n BINARY_INTEGER := 0 ; BEGIN FOR emp_rec IN (SELECT * FROM EMP) LOOP p_emp_tab(n) := emp_rec ; n := n + 1 ; END LOOP ; END read_emp_tab ; END type_pack ;

/

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0606_run.sql 로 저장하여 실습)

DECLARE

v_emp_tab type_pack.emp_tab_type ; BEGIN type_pack.read_emp_tab(v_emp_tab) ; DBMS_OUTPUT.PUT_LINE(‘An sample: ’ ||

v_emp_tab(4).ename) ; END ; /

Page 26: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 26 www.muhanedu.net

7. [ PACKAGE – VII : ORACLE 제공 패키지 – DBMS_SQL (1)]

오라클이 제공하는 패키지 중 DBMS_SQL을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE del_all_rows

(p_tab_nm IN VARCHAR2,

p_rows_del OUT NUMBER) IS

cursor_nm INTEGER ; BEGIN

cursor_nm := DBMS_SQL.OPEN_CURSOR ; DBMS_SQL.PARSE(cursor_nm, ‘DELETE FROM ’ || p_tab_nm, DBMS_SQL.NATIVE) ; p_rows_del := DBMS_SQL.EXECUTE(cursor_nm) ; DBMS_SQL.CLOSE_CURSOR(cursor_nm) ;

END ;

/

Page 27: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 27 www.muhanedu.net

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0607_run.sql 로 저장하여 실습)

VARIABLE deleted NUMBER

EXECUTE del_all_rows(‘EMP_COPY’, :deleted)

PRINT deleted

* 참고적으로 EMP_COPY 는

create table emp_copy as select * from emp; 명령으로 생성한다.

포인트 :

Dynamic SQL 의 실행을 지원하기 위해 제공되는 DBMS_SQL 은 기본적인 SQL

문 실행단계, 즉 Parse Bind Execute Fetch(SELECT only) 의 처리

과정을 그대로 구현한다. 오라클 8i 이후부터는 Native Dynamic SQL 도 실행할

수 있다. (EXECUTE IMMEDIATE 명령을 사용)

DBMS_SQL 패키지내의 멤버(프로시저 또는 함수) 중에서,..

OPEN_CURSOR

PARSE

BIND_VARIABLE

EXECUTE

FETCH_ROWS

CLOSE_CURSOR

* dbmssql.sql 스크립트 파일을 참조

Page 28: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 28 www.muhanedu.net

8. [ PACKAGE – VIII : ORACLE 제공 패키지 – DBMS_SQL (2)]

오라클이 제공하는 패키지 중 DBMS_SQL을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE del_rows

(p_tab_nm IN VARCHAR2,

p_rows_del OUT NUMBER) IS

cursor_nm INTEGER ; BEGIN

EXECUTE IMMEDIATE ‘delete from ‘ || p_tab_nm ; p_rows_del := SQL%ROWCOUNT ;

END ;

/

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0608_run.sql 로 저장하여 실습)

VARIABLE deleted NUMBER

EXECUTE del_rows(‘EMP_COPY’, :deleted)

PRINT deleted

* 참고적으로 EMP_COPY 는

create table emp_copy as select * from emp; 명령으로 생성한다.

Page 29: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 29 www.muhanedu.net

9. [ PACKAGE – VIIII : ORACLE 제공 패키지 – DBMS_SQL (3)]

오라클이 제공하는 패키지 중 DBMS_SQL을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE drop_tab

(p_tab_nm IN VARCHAR2) IS

cursor_nm NUMBER ; err_msg VARCHAR2(255) ;

BEGIN cursor_nm := DBMS_SQL.OPEN_CURSOR ; DBMS_SQL.PARSE(cursor_nm, ‘DROP TABLE ’ || p_tab_nm, DBMS_SQL.NATIVE) ; DBMS_SQL.CLOSE_CURSOR(cursor_nm) ;

EXCEPTION WHEN OTHERS THEN

err_msg := SQLERRM ; DBMS_SQL.CLOSE_CURSOR(cursor_nm) ; RAISE_APPLICATION_ERROR(-20200, err_msg) ; END ;

/

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0609_run.sql 로 저장하여 실습)

EXECUTE drop_tab(‘EMP_COPY’)

SELECT * FROM EMP_COPY ;

* 참고적으로 EMP_COPY 는

create table emp_copy as select * from emp; 명령으로 생성한다.

QUIZ :

DROP_TAB 프로시저와 동일하게 Dynamic SQL 을 처리할 수 있도록 수정해 보

시오. (참고 : EXCECUTE IMMEDIATE)

Page 30: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 30 www.muhanedu.net

10. [ PACKAGE – X : ORACLE 제공 패키지 – DBMS_DDL ]

오라클이 제공하는 패키지 중 DBMS_DDL을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE analyze_object

(p_obj_type IN VARCHAR2,

p_obj_name IN VARCHAR2) IS BEGIN

DBMS_DDL.ANALYZE_OBJECT( p_obj_type, -- OBJECT_TYPE USER, -- OWNER UPPER(p_obj_name), -- NAME ‘COMPUTE’) ; -- METHOD

END ;

/

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0610_run.sql 로 저장하여 실습)

EXECUTE analyze_object(‘TABLE’, ‘EMP’)

SELECT LAST_ANALYZED

FROM USER_TABLES

WHERE TABLE_NAME = ‘EMP’ ;

참고 :

DBMS_DDL 패키지는 PL/SQL 프로그램 내에서 SQL 의 DDL 문 처리를 제공하는 패키지로, 트리거 내에서는 사용될 수 없다.

이 패키지는 SYS보다 실행하고자 하는 사용자의 권한으로 실행한다.

DBMS_DDL.ALTER_COMPILE(‘PROCEDURE’, ‘SCOTT’, ‘Q_EMP’) ;

Page 31: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 31 www.muhanedu.net

11. [ PACKAGE – XI : ORACLE 제공 패키지 – DBMS_JOB ]

오라클이 제공하는 패키지 중 DBMS_JOB을 이해하기 위한 예제.

VARIABLE jobno NUMBER

BEGIN

DBMS_JOB.SUBMIT(

job => :jobno,

what =>‘OVERLOAD_PACK.ADD_DEPT(‘‘EDUCATION’’,2710) ; ’ ,

next_date => TRUNC(SYSDATE + 1),

interval => ‘TRUNC(SYSDATE + 1)’

);

COMMIT;

END;

/

PRINT jobno

Page 32: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 32 www.muhanedu.net

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

(p0611_run.sql 로 저장하여 실습)

참고 :

DBMS_JOB 패키지는 PL/SQL 프로그램들에 대한 Job Scheduling 을 위한 패키

지로, 데이터베이스의 작업이 적은 시간대에 일괄처리를 위해 스케쥴되어 사용되

거나 프로그램에 대한 유지보수에도 응용된다.

DBMS_SQL 패키지내의 멤버(프로시저 또는 함수) 중에서,..

SUBMIT

REMOVE

CHANGE

WHAT

NEXT_DATE

INTERVAL

BROKEN

RUN

DBA_JOBS 딕셔너리 뷰를 사용해서 스케쥴된 작업들 (Submitted jobs) 의 상

태정보를 확인할 수 있다.

DBA_JOBS_RUNNING 딕셔너리 뷰는 지금 실행되고 있는 작업들의 정보를 확

인할 수 있다.

Page 33: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 33 www.muhanedu.net

12. [ PACKAGE – XII : ORACLE 제공 패키지 – UTL_FILE ]

오라클이 제공하는 패키지 중 UTL_FILE을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE sal_status (p_filedir IN VARCHAR2, p_filename IN VARCHAR2)

IS v_filehandle UTL_FILE.FILE_TYPE ; CURSOR emp_info IS SELECT ename, sal, deptno FROM emp ORDER BY deptno ; v_newdeptno emp.deptno%type ; v_olddeptno emp.deptno%type := 0 ;

BEGIN v_filehandle := UTL_FILE.FOPEN(p_filedir, p_filename, ‘w’) ; UTL_FILE.PUTF(v_filehandle, ‘SAL REPORT : GENERATED ON %s\n’ , SYSDATE); UTL_FILE.NEW_LINE(v_filehandle) ; FOR v_emp_rec IN emp_info LOOP v_newdeptno := v_emp_rec.deptno ; IF v_newdeptno <> v_olddeptno THEN

UTL_FILE.PUTF(v_filehandle, ‘DEPARTMENT : %s\n’, v_emp_rec.deptno) ; END IF;

UTL_FILE.PUTF(v_filehandle, ‘ EMPLOYEE : %s\n’, v_emp_rec.ename, v_emp_rec.sal) ; v_olddeptno := v_newdeptno ;

END LOOP ; UTL_FILE.PUT_LINE(v_filehandle, ‘*** END OF REPORT ***’) ; UTL_FILE.FCOLSE(v_filehandle) ;

EXCEPTION

WHEN UTL_FILE.INVALID_FILEHANDLE THEN RAISE_APPLICATION_ERROR(-20300, ‘Invalid File.’ );

WHEN UTL_FILE.WRITE_ERROR THEN RAISE_APPLICATION_ERROR(-20400, ‘Unable to write to file’) ;

END ;

/

Page 34: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 34 www.muhanedu.net

힌트 :

생성된 패키지를 SQL*Plus(iSQL*Plus)에서 실행/확인하는 예제.

EXECUTE sal_status(‘C:\UTL_FILE’, ‘SAL_RPT.TXT’)

POINT :

접근할 디렉토리는 초기화 파라미터(UTL_FILE_DIR)에 정의되어야 한다.

(예: UTL_FILE_DIR = C:\UTL_FILE)

Page 35: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 35 www.muhanedu.net

13. [ PACKAGE – XIII : ORACLE 제공 패키지 – DBMS_LOB (1) ]

오라클이 제공하는 패키지 중 DBMS_LOB을 이해하기 위한 예제.

> 우선 실습관련 테이블을 생성하고, 데이터를 간단하게 입력한다. (p0613_ready.sql로 저장하여 실습)

CREATE TABLE personnel (id NUMBER(6) constraint personnel_id_pk PRIMARY KEY, last_name VARCHAR2(35), review CLOB, picture BLOB) ;

CREATE TABLE review_table (employee_id NUMBER, ann_review VARCHAR2(2000) );

INSERT INTO personnel VALUES(2034, ‘Allen’, EMPTY_CLOB(), NULL); INSERT INTO personnel VALUES(2035, ‘Bond’, EMPTY_CLOB(), NULL);

INSERT INTO review_table VALUES(2034, ‘Very good performance this year. Recommanded to increase salary by $500’);

INSERT INTO review_table VALUES(2035, ‘Excellent performance this year. Recommanded to increase salary by $1000’);

COMMIT ;

> UPDATE 문장으로 CLOB에 데이터를 변경하는 예제

UPDATE personnel

SET review = (SELECT ann_review

FROM review_table

WHERE employee_id = 2034)

WHERE last_name = ‘Allen’ ;

(다음 페이지에 계속… )

Page 36: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 36 www.muhanedu.net

> DBMS_LOB패키지를 사용하여 CLOB에 데이터를 변경하는 예제

DECLARE

lobloc CLOB ; text VARCHAR2(2000) ; amount NUMBER ; offset INTEGER ;

BEGIN SELECT ann_review INTO text FROM review_table WHERE employee_id = 2035 ; SELECT review INTO lobloc FROM personnel WHERE last_name = ‘Bond’ FOR UPDATE ; offset := 1; amount := length(text) ; DBMS_LOB.WRITE( lobloc, amount, offset, text ) ;

END ; /

Page 37: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 37 www.muhanedu.net

14. [ PACKAGE – XIV : ORACLE 제공 패키지 – DBMS_LOB (2) ]

오라클이 제공하는 패키지 중 DBMS_LOB을 이해하기 위한 예제.

CREATE OR REPLACE PROCEDURE load_image (p_file_loc IN VARCHAR2) IS

v_file BFILE ;

v_filename VARCHAR2(40) ;

v_record_number NUMBER ;

v_file_exists BOOLE

AN ;

CURSOR pic_cur IS SELECT country_id FROM country WHERE region_id = 1 FOR UPDATE ;

BEGIN

DBMS_OUTPUT.PUT_LINE(‘LOADING LOCATORS TO IMAGES … ‘) ; FOR country_record IN pic_cur LOOP

LOOP v_filename := country_record.country_id || ‘.tif’ ; v_file := bfilename(p_file_loc, v_filename) ; v_file_exists := (DBMS_LOB.FILEEXISTS(v_file) = 1 ) ; IF v_file_exists THEN

DBMS_LOB.FILEOPEN(v_file) ; UPDATE countries

SET picture = bfilename(p_file_loc, v_filename) WHERE CURRENT OF country_pic_cursor ;

DBMS_OUTPUT.PUT_LINE(‘LOADED LOCATOR TO FILE : ’ || v_filename || ‘ SIZE : ’ || DBMS_LOB.GETLENGTH(v_file) ) ; DBMS_LOB.FILECLOSE(v_file) ; v_record_number := country_pic_cursor%ROWCOUNT ;

ELSE DBMS_OUTPUT.PUT_LINE(‘Can not open the file ’ || v_filename) ;

END IF ; END LOOP ; DBMS_OUTPUT.PUT_LINE(‘TOTAL FILES UPDATED : ’ ||v_record_number) ;

(다음 페이지에 계속…)

Page 38: INTRODUCTION - Duksungdblab.duksung.ac.kr/dbprogramming/weeks/06_PACKAGE.pdf · 2005-02-26 · 오라클 PL/SQL 6. ORACLE PACKAGE Written by AngelaLEE 6 - 1 ORACLE PACKAGE INTRODUCTION

오라클 PL/SQL 6. ORACLE PACKAGE

Written by AngelaLEE 6 - 38 www.muhanedu.net

EXCEPTION

WHEN OTHERS THEN DBMS_LOB.FILECLOSE(v_file) ; DBMS_OUTPUT.PUT_LINE(‘Program Error Occurred : ’ || to_char(SQLCODE) || SQLERRM ) ;

END ; /