2011-08-03 20 views
6

Czy istnieje sposób utworzenia procedury implozyjnej w PL/SQL, która przyjmuje dowolny niestandardowy typ danych jako parametr i łączy jego członków, ograniczonych przez określony ciąg znaków?PL/SQL dla funkcji implodu na typy niestandardowe

Załóżmy, że mam następujące rodzaje:

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

Następnie powiedzieć funkcja zwraca obiekt typu myPerson, ale chcę kolumny sklejone:

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

powrócić (jeśli skonfigurowano dane w tym przykładowym przykładzie):

John$$Doe$$55 

Gdzie delimiter można określić jako parametr opcjonalny, ale typ pierwszego parametru może być dowolny (niekoniecznie myPerson).

Odpowiedz

7

Twój niestandardowy typ danych może obsługiwać metody i metody mogą mieć parametry.

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

Jest możliwe, aby zbudować ogólny sposób postępowania te sznurki, za pomocą dziedziczenia i polimorfizmu. Jeśli zamierzamy używać obiektów, powinniśmy wykorzystać możliwości programowania obiektowego.

Po pierwsze potrzebujemy obiektu głównego. Ten TYPE nie jest dostępny, co oznacza, że ​​nie możemy faktycznie zadeklarować jego wystąpienia. Zauważ, że funkcja składowa TO_STRING() jest również zadeklarowana jako NIEZAPEWNIAJĄCA. Oznacza to, że każdy TYPE, który dziedziczy z STRINGABLE_TYPE, musi mieć własną implementację metody.

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> 

Oto jeden typ, który dziedziczy po STRINGABLE_TYPE. Słowo kluczowe OVERRIDING jest obowiązkowe, nawet jeśli dekla- racja typu nadrzędnego zmusza nas do jego implementacji.

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> 

Oto kolejny typ ...

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> 

Teraz możemy utworzyć funkcję, która przyjmuje typu rodzajowego i wywołuje metodę Generic:

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> 

Przez cudów polimorfizm możemy przekazać dwa różne obiekty do funkcji, która faktycznie wykona metodę nadpisującą:

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> 

To dość dużo pracy, aby dojść do tego punktu. Byłoby fajnie, gdyby TYP Oracle'a miał co najmniej abstrakcyjną instrukcję TO_STRING(), którą moglibyśmy przesłonić. Ale to tylko jeden z wielu luźnych celów w implementacji obiektu 8-)

+0

Wielki przykład dziedziczenia typów obiektów! –

Powiązane problemy