2012. 11. 5. 11:42

[Oracle] PL/SQL - 프로시저 (Procedure)

프로시저 (procedure) 와 패키지 (package)

 

- 프로그램 유지 보수와 실행을 보다 쉽게 하기 위해서 프로그램 코드를 논리적으로 구성한 것.

 

- 1개 패키지 내에 여러개의 프로시저가 존재한다.

 

 

스토어드 프로시저 (stored procedure)

 

- 데이터베이스 내에 컴파일되어 저장된 프로시저.

 

- 데이터베이스에 저장된 프로시저는 오브젝트로 관리된다.

 

 

프로시저를 사용하는 이유

 

- 특정 문제나 작업을 해결하기 위해서 사용한다.

 

- 특정 기능을 담당하는 모듈(module) 단위로 되어 있다.

 

- 재사용이 가능하다.

 

- 스토어드 프로시저를 통해서만 데이터를 액세스할 수 있어 보안이 향상된다.

 

- 프로시저는 공유된 메모리 자원을 이용한다.

 

 

프로시저와 함수

 

- 둘은 출력의 형식이 다르다.

 

- 프로시저 : 많은 양의 정보를 처리한다.

 

- 함수 : 하나의 값을 Return 한다.

 

 

프로시저 생성

 

- 프로시저를 생성할 때 오라클은 컴파일하는 동안 접근하는 오브젝트(Table,View )가 존재하는지 검사하고, 접근 권한이 있는지를 검사한다.

 

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CREATE OR REPLACE PROCEDURE 프로시저이름 (IN/OUT/INOUT)

AS

PL/SQL 본문코드

END 프로시저이름

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

- OR REPLACE : 프로시저가 이미 존재할 경우 덮어 쓴다. 항상 사용하는 것이 좋다.

 

- IN : 호출되는 프로시저에 값을 전달한다는 것을 지정

 

- OUT : 프로시저를 호출한 프로그램에게 값을 반환한다는 것을 지정

 

- INOUT : IN + OUT. 프로시저에 값을 전달하고 결과를 프로그램에게 반환한다는 것을 지정.

 

 

RETURN

 

- 프로시저가 끝나기 전에 마칠 경우에만 사용한다.

 

 

컴파일 / 재컴파일

 

- 스토어드 프로시저를 명시적으로 재컴파일 하려면 ALTER PROCEDURE 명령을 사용한다.

 

- ALTER PROCEDURE 는 패키지 내에 있는 프로시저가 아닌 독립된 프로시저에서만 사용 가능하다.

 

- 프로시저가 컴파일되면, 다음 실행시 컴파일 할 필요가 없어 부하를 줄일 수 있고, 컴파일 오류를 제거할 수 있다.

 

- 오라클은 부모 오브젝트가 명시적으로 다시 컴파일될 때 종속된 모든 오브젝트를 자동으로 재컴파일 한다. 따라서 부모 오브젝트를 컴파일 할 경우 관련된 모든 오브젝트가 모두 다시 컴파일이 일어나므로 시스템에 부하를 줄 수 있다.

 

 

프로시저 실행

 

- execute 명령으로 스토어드 프로시저를 실행할 수 있다.

 

[예제1] 사용자가 지정한 나이를 가진 사람의 나이를 100 으로 변경하는 스토어드 프로시저

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CREATE OR REPLACE PROCEDURE change_ages (i_age IN integer)
AS
BEGIN
    UPDATE member
    SET AGE=100
    WHERE age = i_age;
END change_ages;
/
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

 

- 프로시저 실행

SQL> execute change_ages(10);

 

- 결과 :

 

age = 100 으로 변경됨

 

 

파라미터

 

- 프로시저는 파라미터를 사용하여 정보를 전달한다.

 

- 프로시저를 호출할 때는 프로시저의 파라미터에 대해 값을 전달해야 한다.

 

- Actual Parameter : 프로시저에 전달된 파라미터 (실제 파라미터)

 

- Internal or Formal Parameter : 프로시저 내부에 선언된 파라미터 (내부 또는 형식 파라미터)

 

- Actual Parameter 의 데이터형과 Internal Parameter 의 데이터형이 같아야 한다.

 

 

스토어드 프로시저 확인

 

- 스토어드 프로시저에 관한 정보를 제공하는 데이터 딕셔너리 뷰

 

ALL_ERRORS : 현재 사용자가 액세스 가능한 모든 오브젝트에 대한 오류 목록

 

ALL_SOURCE : 현재 사용자가 액세스 가능한 모든 오브젝트의 텍스트 소스

 

USER_OBJECTS : 현재 사용자가 액세스 가능한 모든 오브젝토 목록

 

USER_ERRORS : 현재 사용자에게 속한 오브젝트의 오류 목록

 

USER_OBJECT_SIZE : 현재 사용자의 모든 PL/SQL 오브젝트

 

USER_SOURCE : 현재 사용자에게 속한 모든 오브젝트의 텍스트 소스

 

DBA_OBJECTS : 데이터베이스에 저장된 모든 오브젝트 목록

 

DBA_ERRORS : 데이터베이스에 저장된 모든 오브젝트에 대한 오류 목록

 

DBA_OBJECT_SIZE : 데이터베이스에 있는 모든 PL/SQL 오브젝트

 

DBA_SOURCE : 데이터베이스 전체에 대한 정보

 

- 어떤 오브젝트가 INVALID 상태인지 확인하고 다시 컴파일 할 필요가 있는지 확인할 수 있다.

 

- INVALID 인 함수나 프로시저는 잘못된 구문이 있을 수 있다.

 

SQL> select object_name, object_type, status from user_objects where status = 'INVALID';

 

 

프로시저 삭제

 

DROP PROCEDURE 프로시저이름;

 

 

프로시저 오버로딩

 

- 한 패키지에서 동일한 이름의 프로시저에 각각 다른 인수를 사용해서 호출할 수 있다.

 

- 서로 다른 데이터형을 갖고 있는 인수를 가지고 동일한 프로시저를 여러 번 실행해야할 경우 유용하다.

 

 

재귀 프로시저

 

- 자기 자신을 호출하는 프로시저

 

 

'Database / Sql' 카테고리의 다른 글

[Oracle] 테이블 권한주기  (0) 2012.11.06
[Oracle] PL/SQL - 패키지 (Package)  (0) 2012.11.05
[Oracle] PL/SQL - 블럭 구조  (0) 2012.10.31
[Oracle] PL/SQL - 개념과 예제  (0) 2012.10.31
[Oracle] JOIN DELETE  (0) 2012.07.21