|
프로시져(Procedure)
프로시져(Procedure)란 ?
PL/SQL블럭들로 구성된다.
함수, 프로시져등을 호출할 수 있다.
리턴값을 가질 수 없다.
Query문에서 독립적으로 사용될 수 없다.
데이타에 변형을 가할 수 있다.
프로시저 내의 PL/SQL블럭은 어떤 DML문이든 포함이 될 수 있으나 DDL문은 사용할 수 없다.
1. 프로시져(Procedure)의 생성
CREATE [OR REPLACE] PROCEDURE [schema.]procedure
[ (argument [IN | OUT | IN OUT] datatype
[, argument [IN | OUT | IN OUT] datatype] ...)]
{IS | AS} pl/sql_subprogram_body
[schema.]procedure
프로시져의 이름
argument [IN | OUT | IN OUT] datatype
Argument를 정의한다.
인자타입
IN : 읽기전용, 프로시져가 리턴될때 프로시져내의 값은 전달되지 않는다.
프로시져내에서 값을 할당 할 수 없다.
프로시져 내에서 rvalue이다. 대입문의 오른쪽에만 쓸 수 있다.
OUT: 쓰기전용, 프로시져가 호출될때 실제 파라메터가 가지는 값은 무시된다.
프로서져 내에서 lvalue이다. 대입문의 왼쪽에만 쓸 수 있다.
IN OUT : 읽기쓰기, 파라미터의 값은 프로시저가 불릴 때 프로시져에게 전달되고,
제어가 리턴될때 실제 파라메터에게 전달된다.
datatype
Parameter의 type만 결정해주고 길이는 정해주지 않는다.
ORA-6502: numberic or value error
CREATE OR REPLACE PROCEDURE parameter_length(
p_para1 IN OUT VARCHAR2,
p_para2 IN OUT NUMBER) AS
BEGIN
p_para1 := 'abcdefghijklmno';
p_para2 := 12.3;
END;
실제 파라미터의 길이는 프로시져를 호출하는 쪽에 있다.
그래서
DECLARE
v_var1 VARCHAR2(10);
v_var2 NUMBER(3,4);
BEGIN
parameter_length(v_var1,v_var2);
END;
단순히 프로시져 하나만 호출하는 PL/SQL문인데.. 여기서 ORA-6502 에러가 발생한다.
길이가 10자리인 변수에 프로시저에서 16자리의 데이타를 대입하려 하였기 때문이다.
pl/sql_subprogram_body
프로시져의 실제 구현 부분이다.
PL/SQL블럭이 들어간다.
2. 프로시져(Procedure)의 구성
프로시져의 주요부는 선언, 실행, 예외 섹션을 가진 PL/SQL블럭이다.
CREATE OR REPLACE PROCEDURE procedurename AS
Declarative section
Executable section
EXCEPTION
Exception section
END [procedurename];
Declarative section: 프로시져나 function에는 DECLARE키워드가 없는 이유는
IS, AS가 이것을 대신해 주기 때문이다.
3. 프로시져(Procedure)의 생성과 실행
프로시져의 생성과 실행을 하기위해서는 권한이 있어야 한다.
프로시저의 생성을 위한 권한 : CREATE PROCEDURE 권한.
프로시저의 실행을 위한 권한 : EXECUTE 권한.
DBA 권한의 User가 Procedure를 사용할 수 있는 권한을 부여.
GRANT EXECUTE ON my_procedure to scotte;
프로시져의 실행에는 그 프로시져를 실행할 수 있는 권한(EXECUTE권한)
이 있어야 한다.
EXECUTE ANY PROCEDURE 시스템 특권.
EXECUTE new_worker('PARK JAE OH');
sqlplus 에서는 execute명령에 의해 프로시져가 호출된다.
new_worker('PARK JAE OH');
다른 프로시져, 함수,패키지 혹은 트리거 내에서는 EXECUTE명령이
없이도 호출 될 수 있다.
EXECUTE Georage.new_worker('PARK JAE OH');
다른 유저(Georage)의 소유의 프로시져를 실행하고자 한다.
CREATE SYNONYM new_worker for George.new_worker;
다른 유저의 프로시져에 대한 동의어를 만든다.
이렇게 동의어를 생성하고 난 후에는 소유자를 명시할 필요는 없다.
EXECUTE new_worker('PARK JAE OH');
동의어로 다른 유저의 프로시져를 호출한다.
EXECUTE new_worker@REMOTE_CONNECT('PARK JAE OH');
REMOTE_CONNECT라는 데이타베이스 링크를 이용하여
다른 데이타베이스에 있는 프로시져를 호출 할 수 있다.
물론 여기서도 동의어(synonym)를 생성하여 사용 할 수 있다.
4. 프로시져(Procedure)의 디버깅(Debugging)
show error
프로시져나 함수,등을 컴파일 할 때 ERROR가 발생했을 때
마지막으로 컴파일 된 프로그램 마지막으로 컴파일 된 프로서저나 함수의
DBMS_OUTPUT패키지를 사용
$ORACLE_HOME/product/7.3.2/rdbms/admin/
생성 스크립터 : dbms_otpt.sql
사용한 예제 스크립터: catrepad.sql
|