Procedure(Stored Procedure)

김르르
4 min readApr 5, 2021

--

  • 함수보다 진보된 함수( return이 없고 out parameter로 여러개의 값을 procedure밖으로 내보낼 수 있다 )
  • 함수는 쿼리를 사용하지 않는 간단한 연산을 주로 하는 반면에, procedure는 연산과 함께 쿼리문 실행을 주로 수행한다.
  • 쿼리문에 입력하여 간접실행을 할 수 없고, 실행기(execute)를 사용하여 직접 실행을 하거나, 프로그램 언어에서 호출하여 사용한다
  • 작성된 procedure는 user_procedures에서 확인가능

작성법)

  1. 작성) create or replace procedure 프로시저명( 변수명 변수의종류(in, out) 데이터형..)

is — 변수선언

begin — 코드 작성

end;

/

2. 저장

파일명.sql

3. compile)

@파일명.sql

4. error확인) — 에러가 있을 때에만

show error

5. bind 변수를 선언 ( out parameter로 할당된다)

var 변수명 데이터형(크기)

6. procedure를 호출할때 out parameter에 bind 변수를 할당한다

(out parameter명과 bind 변수명은 아무런 관련이 없다 — out parameter명과 bind 변수명을 맞출 필요는 없다)

직접실행: 실행기 ( execute 또는 exec )

execute 프로시저명 ( 값… :변수명 )

7. 프로시저가 실행된 후 bind 변수에 저장된 값을 출력

print bind 변수명

Procedure에서 sys_refcursor의 사용

  1. 커서를 저장할 수 있는 데이터 형(refcursor)을 사용하여 bind 변수를 선언

var 커서명 refcursor

2. procedure에서 커서의 제어권을 반환할 수 있는 sys_refcursor를 out parameter에 선언

create or replace procedure 프로시저명( 변수명 out sys_refcursor )

is

begin

— system_refcursor 열기

open 커서명 for select 쿼리문….;

— 외부에서 출력하기 때문에 인출, 닫기를 하지 않는다

end;

3. 실행

exec 프로시저명( :커서명 );

4. 출력 : 커서가 실행되어 조회 결과가 출력된다

print 커서명

/

Package

  • PL/SQL의 함수나 프로시저를 묶어서 저장, 관리, 사용하기 위한 객체
  • user_procedure 패키지에서 생성된 패키지를 조회할 수 있다.
  • package headerpackage body 두개의 파일로 구분하여 만든다.

package header — 패키지에 들어갈 함수나 프로시저의 header만 정의하는 부분

package body — 패키지에 들어갈 함수나 프로시저의 코드를 구현하는 부분 패키지 header에 정의된 함수나 프로시저만 정의할 수 있다

  • 컴파일하여 사용하고, 에러는 show error를 사용하여 확인한다
  • 패키지로 묶여진 함수나 프로시저는 “패키지명.함수명()” 또는 “패키지명.프로시저명()”으로 실행한다

패키지 작성법

header : 패키지에 들어갈 함수, 프로시저의 목록을 정의하는 파일

작성법) create or replace package 패키지명 as

function 함수명(매개변수..) return 반환형;

.

.

procedure 프로시저명(매개변수,,);

.

.

end;

/

package body : package header에 선언된 함수와 프로시저를 그대로 구현해야한다

작성법)

create or replace package body 패키지명

is

function 함수명(매개변수…) return 반환형

is

begin

end 함수명;

;

.

.

procedure 프로시저명(매개변수…)

is

begin

end 프로시저명;

end;

/

--

--

김르르
김르르

Written by 김르르

0 Followers

르르입니다

No responses yet