2011-08-03 3 views
6

PL/SQLで任意のカスタム・データ型をパラメータとし、そのメンバを連結し、指定した文字列で区切った連結ルーチンを作成する方法はありますか?関数はタイプmyPersonのオブジェクトを返すと言う、その後カスタム型のimplode関数のPL/SQL

CREATE TYPE myPerson AS OBJECT(
    forename VARCHAR2(50), 
    surname VARCHAR2(50), 
    age  NUMBER 
); 

、私は列が一緒に連結したい:例えば

は、私は次の型を持っていると言う

SELECT implode(getPerson(1234),'$$') from dual; 

(この考案された例のデータが設定されていると仮定して)返す:

John$$Doe$$55 

区切り文字は省略可能なパラメーターとして指定できますが、最初のパラメーターの型は何でもかまいません(必ずしもmyPersonである必要はありません)。

答えて

7

カスタムデータ型では、メソッドとメソッドにパラメータを設定できます。

CREATE TYPE myPerson AS OBJECT( 
    forename VARCHAR2(50), 
    surname VARCHAR2(50), 
    age  NUMBER, 

    MEMBER FUNCTION 
    get_record(pGlue IN varchar2) RETURN VARCHAR2); 

CREATE TYPE BODY myPerson 
AS 
    MEMBER FUNCTION get_record(pGlue varchar2) RETURN VARCHAR2 

IS 
BEGIN 
RETURN forename || pGlue || surname || pGlue || age ; 
END get_record; 

END; 
4

継承と多型を使用して、これらの文字列を処理する一般的な方法を構築できます。オブジェクトを使用する場合は、オブジェクト指向プログラミングの機能を活用する必要があります。

まず、ルートオブジェクトが必要です。このTYPEはインスタンス化できません。つまり、実際にインスタンスを宣言することはできません。 TO_STRING()メンバ関数もNOT INSTANTIABLEとして宣言されていることに注意してください。つまり、STRINGABLE_TYPEから継承するすべてのTYPEには、メソッドの独自の実装が必要です。

SQL> create or replace type stringable_type as object 
    2  (id number(7,0) 
    3   , NOT INSTANTIABLE member function to_string 
    4       return varchar2 
    5  ) 
    6 not final not instantiable 
    7/

Type created. 

SQL> 

ここでは、STRINGABLE_TYPEから継承するタイプの1つです。 OVERRIDINGキーワードは、親の宣言がそれを実装することを強要しているにもかかわらず、必須です。の不思議を通じて

SQL> create or replace function type_to_string 
    2  (p_obj in stringable_type) 
    3  return varchar2 
    4 is 
    5 begin 
    6  return p_obj.to_string(); 
    7 end; 
    8/

Function created. 

SQL> 

:ここ

SQL> create or replace type emp_type under stringable_type 
    2 (empno number(7,0) 
    3  , ename varchar2(20) 
    4  , sal number(7,2) 
    5  , OVERRIDING member function to_string 
    6       return varchar2 
    7  ); 
    8/

Type created. 

SQL> create or replace type body emp_type 
    2 is 
    3  OVERRIDING member function to_string 
    4       return varchar2 
    5  is 
    6  begin 
    7   return 'EMP>>'||self.id||'='||self.empno||'::'||self.ename||'::'||self.sal; 
    8  end; 
    9 end; 
10/

Type body created. 

SQL> 

は別のタイプ...

SQL> create or replace type dept_type under stringable_type 
    2 (deptno number(2,0) 
    3  , dname varchar2(30) 
    4  , OVERRIDING member function to_string 
    5       return varchar2 
    6  ); 
    7/

Type created. 

SQL> create or replace type body dept_type 
    2 is 
    3  OVERRIDING member function to_string 
    4       return varchar2 
    5  is 
    6  begin 
    7   return 'DEPT>>'||self.id||'='||self.deptno||'::'||self.dname; 
    8  end; 
    9 end; 
10/

Type body created. 

SQL> 

で、私たちは、ジェネリック型を取り、ジェネリックメソッドを呼び出す関数を作成することができますポリモフィズム関数に2つの異なるオブジェクトを渡すことができます。実際にはオーバーライドメソッドが実行されます:

SQL> set serveroutput on 
SQL> declare 
    2  obj1 emp_type; 
    3  obj2 dept_type; 
    4 begin 
    5  obj1 := emp_type(1, 8000, 'VAN WIJK', 3500); 
    6  obj2 := dept_type(2, 20, 'COMMUNICATIONS'); 
    7  dbms_output.put_line(type_to_string(obj1)); 
    8  dbms_output.put_line(type_to_string(obj2)); 
    9 end; 
10/
EMP>>1=8000::VAN WIJK::3500 
DEPT>>2=20::COMMUNICATIONS 

PL/SQL procedure successfully completed. 

SQL> 

この時点までにはかなりの作業が必要です。オラクルのTYPEに少なくともTO_STRING()が焼き付けられていれば、それはうまくいくでしょう。しかし、それはオブジェクト実装の多くの緩やかな終わりの一つです。

+0

オブジェクト型の偉大な継承の例! –