PL / SQL-オブジェクト指向

この章では、オブジェクト指向PL / SQLについて説明します。PL / SQLでは、オブジェクトタイプを定義できます。これは、Oracleでのオブジェクト指向データベースの設計に役立ちます。オブジェクトタイプを使用すると、複合タイプを作成できます。オブジェクトを使用すると、データの特定の構造とそれを操作するためのメソッドを使用して、実世界のオブジェクトを実装できます。オブジェクトには属性とメソッドがあります。属性はオブジェクトのプロパティであり、オブジェクトの状態を格納するために使用されます。とメソッドは、その動作をモデル化するために使用されます。

オブジェクトは、CREATE [OR REPLACE] TYPEステートメントを使用して作成されます。以下は、簡単なものを作成する例です。address いくつかの属性で構成されるオブジェクト-

CREATE OR REPLACE TYPE address AS OBJECT 
(house_no varchar2(10), 
 street varchar2(30), 
 city varchar2(20), 
 state varchar2(10), 
 pincode varchar2(10) 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

もう1つのオブジェクトを作成しましょう customer ラップする場所 attributes そして methods 一緒にオブジェクト指向の感覚を持つ-

CREATE OR REPLACE TYPE customer AS OBJECT 
(code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

オブジェクトのインスタンス化

オブジェクトタイプを定義すると、オブジェクトの青写真が提供されます。このオブジェクトを使用するには、このオブジェクトのインスタンスを作成する必要があります。インスタンス名を使用してオブジェクトの属性とメソッドにアクセスでき、the access operator (.) 次のように-

DECLARE 
   residence address; 
BEGIN 
   residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); 
   dbms_output.put_line('House No: '|| residence.house_no); 
   dbms_output.put_line('Street: '|| residence.street); 
   dbms_output.put_line('City: '|| residence.city); 
   dbms_output.put_line('State: '|| residence.state); 
   dbms_output.put_line('Pincode: '|| residence.pincode); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

House No: 103A 
Street: M.G.Road 
City: Jaipur 
State: Rajasthan 
Pincode: 201301  

PL/SQL procedure successfully completed.

メンバーメソッド

Member methods を操作するために使用されます attributesオブジェクトの。オブジェクトタイプを宣言するときに、メンバーメソッドの宣言を提供します。オブジェクト本体は、メンバーメソッドのコードを定義します。オブジェクト本体は、CREATE TYPEBODYステートメントを使用して作成されます。

Constructors新しいオブジェクトを値として返す関数です。すべてのオブジェクトには、システム定義のコンストラクターメソッドがあります。コンストラクターの名前は、オブジェクトタイプと同じです。例-

residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');

ザ・ comparison methodsオブジェクトを比較するために使用されます。オブジェクトを比較する方法は2つあります-

マップ方法

ザ・ Map methodは、その値が属性の値に依存するように実装された関数です。たとえば、顧客オブジェクトの場合、顧客コードが2人の顧客で同じである場合、両方の顧客が同じである可能性があります。したがって、これら2つのオブジェクト間の関係は、コードの値に依存します。

注文方法

ザ・ Order method2つのオブジェクトを比較するための内部ロジックを実装します。たとえば、長方形オブジェクトの場合、長方形の両側が大きいと、長方形は別の長方形よりも大きくなります。

Mapメソッドを使用する

次の長方形オブジェクトを使用して、上記の概念を理解してみましょう-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 member procedure display, 
 map member function measure return number 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

タイプ本体の作成-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN  
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   MAP MEMBER FUNCTION measure return number IS 
   BEGIN 
      return (sqrt(length*length + width*width)); 
   END measure; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

長方形オブジェクトとそのメンバー関数を使用するようになりました-

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
   r3 rectangle; 
   inc_factor number := 5; 
BEGIN 
   r1 := rectangle(3, 4); 
   r2 := rectangle(5, 7); 
   r3 := r1.enlarge(inc_factor); 
   r3.display;  
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 8 
Width: 9 
Length: 5 
Width: 7  

PL/SQL procedure successfully completed.

Orderメソッドを使用する

さて、 same effect could be achieved using an order method。orderメソッドを使用して長方形オブジェクトを再作成しましょう-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member procedure display, 
 order member function measure(r rectangle) return number 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

タイプ本体の作成-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   ORDER MEMBER FUNCTION measure(r rectangle) return number IS 
   BEGIN 
      IF(sqrt(self.length*self.length + self.width*self.width)> 
         sqrt(r.length*r.length + r.width*r.width)) then 
         return(1); 
      ELSE 
         return(-1); 
      END IF; 
   END measure; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

長方形オブジェクトとそのメンバー関数の使用-

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
BEGIN 
   r1 := rectangle(23, 44); 
   r2 := rectangle(15, 17); 
   r1.display; 
   r2.display; 
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 23 
Width: 44 
Length: 15 
Width: 17 
Length: 23 
Width: 44 

PL/SQL procedure successfully completed.

PL / SQLオブジェクトの継承

PL / SQLでは、既存の基本オブジェクトからオブジェクトを作成できます。継承を実装するには、基本オブジェクトを次のように宣言する必要があります。NOT FINAL。デフォルトはFINAL

次のプログラムは、PL / SQLオブジェクトの継承を示しています。名前の付いた別のオブジェクトを作成しましょうTableTop、これはRectangleオブジェクトから継承されます。このために、ベース長方形オブジェクトを作成する必要があります-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 NOT FINAL member procedure display) NOT FINAL 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

ベースタイプのボディを作成する-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

子オブジェクトテーブルトップの作成-

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

子オブジェクトテーブルトップの型本体の作成

CREATE OR REPLACE TYPE BODY tabletop AS 
OVERRIDING MEMBER PROCEDURE display IS 
BEGIN 
   dbms_output.put_line('Length: '|| length); 
   dbms_output.put_line('Width: '|| width); 
   dbms_output.put_line('Material: '|| material); 
END display; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

使用する卓上型オブジェクトとそのメンバ関数を-

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel  

PL/SQL procedure successfully completed.

PL / SQLの抽象オブジェクト

ザ・ NOT INSTANTIABLE句を使用すると、抽象オブジェクトを宣言できます。抽象オブジェクトをそのまま使用することはできません。その機能を使用するには、そのようなオブジェクトのサブタイプまたは子タイプを作成する必要があります。

例えば、

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)  
 NOT INSTANTIABLE NOT FINAL 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.