sql >> データベース >  >> RDS >> Oracle

Oracle PL/SQLオブジェクトのスーパーメソッドを呼び出す方法

    スーパーメソッドにアクセスするには、一般的な呼び出しまたは一般化された式のいずれかを試してください。たとえば、人物のスーパータイプと学生のサブタイプを使用する場合:

    CREATE OR REPLACE TYPE person_typ AS OBJECT (
        idno number,
        name varchar2(30),
        phone varchar2(20),
        MAP MEMBER FUNCTION get_idno RETURN NUMBER,
        MEMBER FUNCTION show RETURN VARCHAR2)
    NOT FINAL;
    
    CREATE OR REPLACE TYPE BODY person_typ AS
      MAP MEMBER FUNCTION get_idno RETURN NUMBER IS
      BEGIN
        RETURN idno;
      END;
      MEMBER FUNCTION show RETURN VARCHAR2 IS
      BEGIN
        -- function that can be overriden by subtypes MEMBER FUNCTION show RETURN VARCHAR2 IS BEGIN
        RETURN 'Id: ' || TO_CHAR(idno) || ', Name: ' || name;
      END;
    END;
    
    CREATE TYPE student_typ UNDER person_typ (
        dept_id NUMBER,
        major VARCHAR2(30),
        OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2)
    NOT FINAL;
    
    CREATE TYPE BODY student_typ AS
      OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS
      BEGIN
        RETURN (self AS person_typ).show || ' -- Major: ' || major ;
      END;
    END;
    
    -- Using Generalized Invocation
    DECLARE
    myvar student_typ := student_typ(100, 'Sam', '6505556666', 100, 'Math');
    name VARCHAR2(100); 
    BEGIN
    name := (myvar AS person_typ).show; --Generalized invocation 
    END;
    
    -- Using Generalized Expression
    DECLARE
    myvar2 student_typ := student_typ(101, 'Sam', '6505556666', 100, 'Math');
    name2 VARCHAR2(100); 
    BEGIN
    name2 := person_typ.show((myvar2 AS person_typ)); -- Generalized expression 
    END;
    

    編集:

    10gを使用している場合は、関数を少し異なる方法で整理する必要がありますが、スーパーメソッドを呼び出すには、子と同じ機能を使用します。

    CREATE TYPE BODY person_typ AS 
      MAP MEMBER FUNCTION get_idno RETURN NUMBER IS 
      BEGIN
        RETURN idno; 
      END;
      -- static function that can be called by subtypes 
      STATIC FUNCTION show_super (person_obj in person_typ) RETURN VARCHAR2 IS
      BEGIN 
        RETURN 'Id: ' || TO_CHAR(person_obj.idno) || ', Name: ' || person_obj.name;
      END;
      -- function that can be overriden by subtypes 
      MEMBER FUNCTION show RETURN VARCHAR2 IS 
      BEGIN
        RETURN person_typ.show_super ( SELF ); 
      END;
    END;
    
    CREATE TYPE student_typ UNDER person_typ ( 
      dept_id NUMBER,
      major VARCHAR2(30), 
      OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2) 
      NOT FINAL;
    
    CREATE TYPE BODY student_typ AS 
      OVERRIDING MEMBER FUNCTION show RETURN VARCHAR2 IS 
      BEGIN
        RETURN person_typ.show_super ( SELF ) || ' -- Major: ' || major ;
      END;
    END;
    

    これで、personメソッドの場合はstudentからshow_super()を呼び出すか、studentメソッドの場合はshow()を呼び出します。

    ドキュメントから、それが役立つことを願っています。




    1. データベースが読み取り専用であるため、.mdfデータベースの更新に失敗しました(Windowsアプリケーション)

    2. pipを使用してPythonMySQLdbモジュールをインストールするにはどうすればよいですか?

    3. SQL ServerでのNULLIF()のしくみ

    4. mysqlルートパスワードを変更する方法