Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-15
제목 STORED PROCEDURE



1. Oracle Forms 4.5에서는 PL/SQL Code를 Server-Side에 저장하거나 Forms 내 Trigger, Procedure로 갖을 수도 있다.

다음과 같은 경우 Procedure를 Database Server에 저장하는 방법을 선택하는
것이 좋다.

- Procedure가 Standard한 기능을 제공하여 다른 Tool이 공유할 수 있을 때.
- Procedure가 중요한 DML 기능을 가질 경우.
- Oracle Forms 4.5에서는 PL/SQL의 Version을 1.1까지 지원하므로, PL/SQL
Version 2.X 의 기능이 필요한 경우.


2. Stored Procedure의 제한사항

(1) Server가 7.0 이상이어야 한다.

(2) Pass되는 Variable은 2000 Byte이하이어야 한다.
- 2000이 넘으면 Truncate가 되고, PL/SQL에서 Value_Error Exception이
발생한다.

(3) Menu PL/SQL에서는 Stored Procedure와 Function을 부를 수 없다.

(4) Stored Subprogram의 정의가 바뀐 경우, Forms를 다시 Server와 Connect
하기 전에는 영향을 주지 않는다.


3. Oracle 7 Server 에서 제공하는 Standard Package들

- dbms_alert
- dbms_ddl
- dbms_describe
- dbms_lock
- dbms_mail
- dbms_output
- dbms_pipe
- dbms_session
- dbms_snapshot
- dbms_standard
- dbms_transaction
- dbms_utility

< Oracle7 Developers Guide 참조>


4. Calling Stored Procedures

(1) Database Procedure는 Server-Side PL/SQL Engine에 의해 실행되도록
Design된 PL/SQL Block이다.

(2) Stored Procedure를 Call하기 위해서는 EXECUTE Privilege가 필요하다.

(3) Server-Side Procedure와 Forms에서의 PL/SQL의 중요한 차이점은
Server-Side 에서는 Forms의 Bind Variable (:Block_Name.Item_Name 등)
을 인식하지 못한다는 것이다.

(4) Parameter/Return이 가능한 Data Type

- VARCHAR2 : Maximum of Varchar2(2000)
- NUMBER
- DATE
- BOOLEAN

제한사항

- TABLE%ROWTYPE, TABLE.COLUMN%ROWTYPE으로 정의된 것은 Reference가
안된다.
- Unsupported Parameter나 Return Value를 사용하면 다음의 Error가
발생한다.

* PL/SQL error 313 at line xxx, column yyy 'PROCNAME'
not declared in this scope.
* PL/SQL error 201 at line xxx, column yyy identifier 'FUNCTNAME'
must be declared.

(5) Formal Parameter의 Default Value

- Defulat Value는 제공하지 않는다.
- User가 임의로 줄 수 있다.
- Procedure Private_Test(a in VARCHAR2 := 'Hello' b in
VARCHAR2 := 'There') IS
BEGIN
Dbms_Output.Put_Line(a);
Dbms_Output.Put_Line(b);
END;

(6) 다른 User의 Stored Subprogram이나 Remote Database를 Call하려면

- User Name이나 Database Link명을 숨기기 위하여 Synonym을 생성하여야
한다.
- CREATE SYNONYM lib_hr_syn FOR libowner.lib_hr;
- Program에서 Call할 때에는 ss_num ;= lib_hr_syn.get_ssn(:EMP.EMPNO);


5. PL/SQL Compiler가 해당 Procedure를 찾는 순서

(1) Current PL/SQL Block 내에 정의되어 있는가?

(2) Standard PL/SQL Command인가?

(3) Oracle Forms 내의 Built-in Procedure 혹은 Function인가?

(4) User_Named Procedure 혹은 Function인가?

(5) Server-side에 정의된 DBMS_STANDARD Package인가?

(6) Current user가 Server-Side의 어떤 Procedure나 Function을 Access
하는가?

* 이상의 질문에 대하여 전부 'NO'라는 대답이 나오면 Compiler는 다음과 같은
Error Message를 준다.

- PL/SQL error 313 at line xxx, column yyy 'PROCNAME' not declared in
this scope.

- PL/SQL error 201 at line xxx, column yyy identifier 'FUNCTNAME'
must be declared.


* DATABASE TRIGGER

1. Database Trigger는 Forms에서의 Trigger와 개념적으로 거의 동일하다.
차이점은 Trigger가 Fire되는 원인을 제공하는 사건과 후속코드가 실행되는
장소가 틀린 것이다.


2. Database Trigger는 Table과 연관된 PL/SQL Block들이다. Table에 대한
UPDATE, INSERT, DELETE 등의 행위에 의해 Fire된다.


3. Error 발생 시에는 RAISE_APPLICATION_ERROR Built-In Procedure를 사용하
여 Error를 표시한다.
RAISE_APPLICATION_ERROR Procedure에서는 Error Number가 20000 - 20999의
Range를 가진다.


4. Creating & Editing Database Triggers

아래와 같은 적절한 권한이 주어진다면 Forms Designer Mode에서 Database
Trigger를 직접 Create, Edit, Compile, Browse 할 수 있다.

- Execute Privilege, Create Privilege, Compile Privilege,
Drop Privilege

* Create하려면

- Navigator에서 Database Objects와 Table Nodes를 Expand한다.
- 원하는 Table을 선택하고 Expand한다.
- Triggers Nodes를 선택하고 Menu Bar의 Navigator*Create를 선택한다.
- Database Trigger Editor에서 작성, compile한다.

* Edit 하려면

- Navigator에서 Database Objects와 Table Nodes를 Expand한다.
- 원하는 Table을 선택하고 Expand한다.
- 원하는 Trigger에서 Double-Click하면 Editor가 나타난다.
- Database Trigger Editor에서 변경, compile한다.
1097 보기 태그:
Comment
등록된 코멘트가 없습니다.